Skip to content

Commit

Permalink
cmd/compile: fix failure to reset reused bit of storage
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dr2chase committed Mar 13, 2018
1 parent 867d07f commit 3c16934
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions src/cmd/compile/internal/ssa/debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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
Expand Down

0 comments on commit 3c16934

Please sign in to comment.