]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: attempt to preserve statement marks when empty blocks are trimmed.
authorDavid Chase <drchase@google.com>
Tue, 1 Oct 2019 15:07:43 +0000 (11:07 -0400)
committerDavid Chase <drchase@google.com>
Fri, 4 Oct 2019 17:31:51 +0000 (17:31 +0000)
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 <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/compile/internal/ssa/trim.go

index 1293548aad09851065412b8cf6b61d1578756131..c930a205c17f3b367b25556ff2449a046ddecb45 100644 (file)
@@ -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`.