mirror of
https://github.com/golang/go
synced 2024-11-19 16:34:49 -07:00
cmd/compile: fix failure to reset reused bit of storage
This is the "3rd bug" that caused compilations to sometimes produce different results when dwarf location lists were enabled. A loop had not been properly rewritten in an earlier optimization CL, and it accessed uninitialized data, which was deterministically perhaps wrong when single threaded, but variably wrong when multithreaded. Change-Id: Ib3da538762fdf7d5e4407106f2434f3b14a1d7ea Reviewed-on: https://go-review.googlesource.com/99935 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com>
This commit is contained in:
parent
867d07f3ac
commit
3c16934f16
@ -578,12 +578,12 @@ func (state *debugState) mergePredecessors(b *Block, blockLocs []*BlockDebug) ([
|
||||
|
||||
// A slot is live if it was seen in all predecessors, and they all had
|
||||
// some storage in common.
|
||||
for slotID := range p0 {
|
||||
slotLoc := slotLocs[slotID]
|
||||
for _, predSlot := range p0 {
|
||||
slotLoc := slotLocs[predSlot.slot]
|
||||
|
||||
if state.liveCount[slotID] != len(preds) {
|
||||
if state.liveCount[predSlot.slot] != len(preds) {
|
||||
// Seen in only some predecessors. Clear it out.
|
||||
slotLocs[slotID] = VarLoc{}
|
||||
slotLocs[predSlot.slot] = VarLoc{}
|
||||
continue
|
||||
}
|
||||
|
||||
@ -596,7 +596,7 @@ func (state *debugState) mergePredecessors(b *Block, blockLocs []*BlockDebug) ([
|
||||
reg := uint8(TrailingZeros64(mask))
|
||||
mask &^= 1 << reg
|
||||
|
||||
state.currentState.registers[reg] = append(state.currentState.registers[reg], SlotID(slotID))
|
||||
state.currentState.registers[reg] = append(state.currentState.registers[reg], predSlot.slot)
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
|
Loading…
Reference in New Issue
Block a user