]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: make nilcheck more careful about statement relocations
authorDavid Chase <drchase@google.com>
Mon, 30 Sep 2019 15:10:36 +0000 (11:10 -0400)
committerDavid Chase <drchase@google.com>
Thu, 3 Oct 2019 21:10:26 +0000 (21:10 +0000)
The earlier code was picking nodes that were "poor choices" and
thus sometimes losing statements altogether.

Change-Id: Ibe5ed800ffbd3c926c0ab1bc10c77d72d3042e45
Reviewed-on: https://go-review.googlesource.com/c/go/+/198478
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/compile/internal/ssa/nilcheck.go

index 009c68afa1a872c1b3cdbbafa7572df9306bc4d3..9516d58a6e9ea17e7bd26189fcba22631e1cdae1 100644 (file)
@@ -153,12 +153,20 @@ func nilcheckelim(f *Func) {
                                        work = append(work, bp{op: ClearPtr, ptr: ptr})
                                        fallthrough // a non-eliminated nil check might be a good place for a statement boundary.
                                default:
-                                       if pendingLines.contains(v.Pos) && v.Pos.IsStmt() != src.PosNotStmt {
+                                       if v.Pos.IsStmt() != src.PosNotStmt && !isPoorStatementOp(v.Op) && pendingLines.contains(v.Pos) {
                                                v.Pos = v.Pos.WithIsStmt()
                                                pendingLines.remove(v.Pos)
                                        }
                                }
                        }
+                       // This reduces the lost statement count in "go" by 5 (out of 500 total).
+                       for j := 0; j < i; j++ { // is this an ordering problem?
+                               v := b.Values[j]
+                               if v.Pos.IsStmt() != src.PosNotStmt && !isPoorStatementOp(v.Op) && pendingLines.contains(v.Pos) {
+                                       v.Pos = v.Pos.WithIsStmt()
+                                       pendingLines.remove(v.Pos)
+                               }
+                       }
                        if pendingLines.contains(b.Pos) {
                                b.Pos = b.Pos.WithIsStmt()
                                pendingLines.remove(b.Pos)