[dev.ssa] cmd/compile: rewrite user nil check as OpIsNonNil
Rewite user nil checks as OpIsNonNil so our nil check elimination pass
can take advantage and remove redundant checks.
With make.bash this removes 10% more nilchecks (34110 vs 31088).
Change-Id: Ifb01d1b6d2d759f5e2a5aaa0470e1d5a2a680212
Reviewed-on: https://go-review.googlesource.com/14321
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index 3a06805..dc6604f 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -478,6 +478,49 @@
goto end6f10fb57a906a2c23667c770acb6abf9
end6f10fb57a906a2c23667c770acb6abf9:
;
+ case OpEqPtr:
+ // match: (EqPtr p (ConstNil))
+ // cond:
+ // result: (Not (IsNonNil p))
+ {
+ p := v.Args[0]
+ if v.Args[1].Op != OpConstNil {
+ goto ende701cdb6a2c1fff4d4b283b7f8f6178b
+ }
+ v.Op = OpNot
+ v.AuxInt = 0
+ v.Aux = nil
+ v.resetArgs()
+ v0 := b.NewValue0(v.Line, OpIsNonNil, TypeInvalid)
+ v0.AddArg(p)
+ v0.Type = config.fe.TypeBool()
+ v.AddArg(v0)
+ return true
+ }
+ goto ende701cdb6a2c1fff4d4b283b7f8f6178b
+ ende701cdb6a2c1fff4d4b283b7f8f6178b:
+ ;
+ // match: (EqPtr (ConstNil) p)
+ // cond:
+ // result: (Not (IsNonNil p))
+ {
+ if v.Args[0].Op != OpConstNil {
+ goto end7cdc0d5c38fbffe6287c8928803b038e
+ }
+ p := v.Args[1]
+ v.Op = OpNot
+ v.AuxInt = 0
+ v.Aux = nil
+ v.resetArgs()
+ v0 := b.NewValue0(v.Line, OpIsNonNil, TypeInvalid)
+ v0.AddArg(p)
+ v0.Type = config.fe.TypeBool()
+ v.AddArg(v0)
+ return true
+ }
+ goto end7cdc0d5c38fbffe6287c8928803b038e
+ end7cdc0d5c38fbffe6287c8928803b038e:
+ ;
case OpIData:
// match: (IData (IMake _ data))
// cond:
@@ -961,6 +1004,43 @@
goto end3ffd7685735a83eaee8dc2577ae89d79
end3ffd7685735a83eaee8dc2577ae89d79:
;
+ case OpNeqPtr:
+ // match: (NeqPtr p (ConstNil))
+ // cond:
+ // result: (IsNonNil p)
+ {
+ p := v.Args[0]
+ if v.Args[1].Op != OpConstNil {
+ goto endba798520b4d41172b110347158c44791
+ }
+ v.Op = OpIsNonNil
+ v.AuxInt = 0
+ v.Aux = nil
+ v.resetArgs()
+ v.AddArg(p)
+ return true
+ }
+ goto endba798520b4d41172b110347158c44791
+ endba798520b4d41172b110347158c44791:
+ ;
+ // match: (NeqPtr (ConstNil) p)
+ // cond:
+ // result: (IsNonNil p)
+ {
+ if v.Args[0].Op != OpConstNil {
+ goto enddd95e9c3606d9fd48034f1a703561e45
+ }
+ p := v.Args[1]
+ v.Op = OpIsNonNil
+ v.AuxInt = 0
+ v.Aux = nil
+ v.resetArgs()
+ v.AddArg(p)
+ return true
+ }
+ goto enddd95e9c3606d9fd48034f1a703561e45
+ enddd95e9c3606d9fd48034f1a703561e45:
+ ;
case OpOr16:
// match: (Or16 x x)
// cond: