Commit 3c16934f authored by David Chase's avatar David Chase

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: 's avatarHeschi Kreinick <heschi@google.com>
parent 867d07f3
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment