cmd/compile: add rules to simplify AddPtr
Fixes #14849
Change-Id: I86e2dc27ca73bb6b24261a68cbf0094a63167414
Reviewed-on: https://go-review.googlesource.com/20833
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index bf08dd1..9b304d8 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -20,6 +20,8 @@
return rewriteValuegeneric_OpAdd64F(v, config)
case OpAdd8:
return rewriteValuegeneric_OpAdd8(v, config)
+ case OpAddPtr:
+ return rewriteValuegeneric_OpAddPtr(v, config)
case OpAnd16:
return rewriteValuegeneric_OpAnd16(v, config)
case OpAnd32:
@@ -617,6 +619,27 @@
}
return false
}
+func rewriteValuegeneric_OpAddPtr(v *Value, config *Config) bool {
+ b := v.Block
+ _ = b
+ // match: (AddPtr <t> x (Const64 [c]))
+ // cond:
+ // result: (OffPtr <t> x [c])
+ for {
+ t := v.Type
+ x := v.Args[0]
+ if v.Args[1].Op != OpConst64 {
+ break
+ }
+ c := v.Args[1].AuxInt
+ v.reset(OpOffPtr)
+ v.Type = t
+ v.AddArg(x)
+ v.AuxInt = c
+ return true
+ }
+ return false
+}
func rewriteValuegeneric_OpAnd16(v *Value, config *Config) bool {
b := v.Block
_ = b
@@ -5242,6 +5265,22 @@
v.AuxInt = a + b
return true
}
+ // match: (OffPtr p [0])
+ // cond: v.Type.Compare(p.Type) == CMPeq
+ // result: p
+ for {
+ p := v.Args[0]
+ if v.AuxInt != 0 {
+ break
+ }
+ if !(v.Type.Compare(p.Type) == CMPeq) {
+ break
+ }
+ v.reset(OpCopy)
+ v.Type = p.Type
+ v.AddArg(p)
+ return true
+ }
return false
}
func rewriteValuegeneric_OpOr16(v *Value, config *Config) bool {