From: David Chase Date: Tue, 1 Oct 2019 15:07:43 +0000 (-0400) Subject: cmd/compile: attempt to preserve statement marks when empty blocks are trimmed. X-Git-Tag: go1.14beta1~864 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=91b55b4fa3a5351aba0e9f79f1c94e27ab2004e7;p=gostls13.git cmd/compile: attempt to preserve statement marks when empty blocks are trimmed. This was a cause of some statements being lost. Change-Id: Ia4805c2dafd7a880d485a678a48427de8930d57e Reviewed-on: https://go-review.googlesource.com/c/go/+/198482 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- diff --git a/src/cmd/compile/internal/ssa/trim.go b/src/cmd/compile/internal/ssa/trim.go index 1293548aad..c930a205c1 100644 --- a/src/cmd/compile/internal/ssa/trim.go +++ b/src/cmd/compile/internal/ssa/trim.go @@ -4,6 +4,8 @@ package ssa +import "cmd/internal/src" + // trim removes blocks with no code in them. // These blocks were inserted to remove critical edges. func trim(f *Func) { @@ -15,6 +17,9 @@ func trim(f *Func) { continue } + bPos := b.Pos + bIsStmt := bPos.IsStmt() == src.PosIsStmt + // Splice b out of the graph. NOTE: `mergePhi` depends on the // order, in which the predecessors edges are merged here. p, i := b.Preds[0].b, b.Preds[0].i @@ -29,6 +34,23 @@ func trim(f *Func) { s.Preds = append(s.Preds, Edge{p, i}) } + // Attempt to preserve a statement boundary + if bIsStmt { + sawStmt := false + for _, v := range s.Values { + if isPoorStatementOp(v.Op) { + continue + } + if v.Pos.SameFileAndLine(bPos) { + v.Pos = v.Pos.WithIsStmt() + } + sawStmt = true + break + } + if !sawStmt && s.Pos.SameFileAndLine(bPos) { + s.Pos = s.Pos.WithIsStmt() + } + } // If `s` had more than one predecessor, update its phi-ops to // account for the merge. if ns > 1 { @@ -36,6 +58,7 @@ func trim(f *Func) { if v.Op == OpPhi { mergePhi(v, j, b) } + } // Remove the phi-ops from `b` if they were merged into the // phi-ops of `s`.