From a7a199947a15d48d405be809278a7ea7c6ebf03a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexandru=20Mo=C8=99oi?= Date: Fri, 18 Mar 2016 10:50:00 +0100 Subject: [PATCH] cmd/compile: add rules to simplify AddPtr MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Fixes #14849 Change-Id: I86e2dc27ca73bb6b24261a68cbf0094a63167414 Reviewed-on: https://go-review.googlesource.com/20833 Reviewed-by: Keith Randall Run-TryBot: Alexandru Moșoi TryBot-Result: Gobot Gobot --- .../compile/internal/ssa/gen/generic.rules | 3 ++ .../compile/internal/ssa/rewritegeneric.go | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index cbb8fc625c..8458619bf2 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -48,6 +48,7 @@ (Add32F (Const32F [c]) (Const32F [d])) -> (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) // ensure we combine the operands with 32 bit precision (Add64F (Const64F [c]) (Const64F [d])) -> (Const64F [f2i(i2f(c) + i2f(d))]) +(AddPtr x (Const64 [c])) -> (OffPtr x [c]) (Sub8 (Const8 [c]) (Const8 [d])) -> (Const8 [c-d]) (Sub16 (Const16 [c]) (Const16 [d])) -> (Const16 [c-d]) @@ -156,6 +157,7 @@ (Neq8 x (Const8 [c])) && x.Op != OpConst8 -> (Neq8 (Const8 [c]) x) (Neq8 x (ConstBool [c])) && x.Op != OpConstBool -> (Neq8 (ConstBool [c]) x) +// AddPtr is not canonicalized because nilcheck ptr checks the first argument to be non-nil. (Add64 x (Const64 [c])) && x.Op != OpConst64 -> (Add64 (Const64 [c]) x) (Add32 x (Const32 [c])) && x.Op != OpConst32 -> (Add32 (Const32 [c]) x) (Add16 x (Const16 [c])) && x.Op != OpConst16 -> (Add16 (Const16 [c]) x) @@ -443,6 +445,7 @@ // Collapse OffPtr (OffPtr (OffPtr p [b]) [a]) -> (OffPtr p [a+b]) +(OffPtr p [0]) && v.Type.Compare(p.Type) == CMPeq -> p // indexing operations diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index bf08dd102b..9b304d8acf 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -20,6 +20,8 @@ func rewriteValuegeneric(v *Value, config *Config) bool { 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 @@ func rewriteValuegeneric_OpAdd8(v *Value, config *Config) bool { } return false } +func rewriteValuegeneric_OpAddPtr(v *Value, config *Config) bool { + b := v.Block + _ = b + // match: (AddPtr x (Const64 [c])) + // cond: + // result: (OffPtr 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 @@ func rewriteValuegeneric_OpOffPtr(v *Value, config *Config) bool { 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 { -- 2.48.1