Commit 08a87938 authored by David Chase's avatar David Chase

cmd/compile: make nilcheck more careful about statement relocations

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: default avatarJeremy Faller <jeremy@golang.org>
parent 53bd9151
...@@ -153,12 +153,20 @@ func nilcheckelim(f *Func) { ...@@ -153,12 +153,20 @@ func nilcheckelim(f *Func) {
work = append(work, bp{op: ClearPtr, ptr: ptr}) work = append(work, bp{op: ClearPtr, ptr: ptr})
fallthrough // a non-eliminated nil check might be a good place for a statement boundary. fallthrough // a non-eliminated nil check might be a good place for a statement boundary.
default: 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() v.Pos = v.Pos.WithIsStmt()
pendingLines.remove(v.Pos) 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) { if pendingLines.contains(b.Pos) {
b.Pos = b.Pos.WithIsStmt() b.Pos = b.Pos.WithIsStmt()
pendingLines.remove(b.Pos) pendingLines.remove(b.Pos)
......
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