mirror of
https://github.com/golang/go.git
synced 2025-05-16 04:44:39 +00:00
cmd/compile: remove zeroing after newobject
The Zero op right after newobject has been removed. But this rule does not cover Store of constant zero (for SSA-able types). Add rules to cover Store op as well. Updates #19027. Change-Id: I5d2b62eeca0aa9ce8dc7205b264b779de01c660b Reviewed-on: https://go-review.googlesource.com/36836 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
9b480521d8
commit
c8eaeb8cba
@ -1390,6 +1390,18 @@
|
|||||||
&& isSameSym(mem.Aux, "runtime.newobject")
|
&& isSameSym(mem.Aux, "runtime.newobject")
|
||||||
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||||
-> mem
|
-> mem
|
||||||
|
(Store (Load (OffPtr [c] (SP)) mem) x mem)
|
||||||
|
&& isConstZero(x)
|
||||||
|
&& mem.Op == OpStaticCall
|
||||||
|
&& isSameSym(mem.Aux, "runtime.newobject")
|
||||||
|
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||||
|
-> mem
|
||||||
|
(Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem)
|
||||||
|
&& isConstZero(x)
|
||||||
|
&& mem.Op == OpStaticCall
|
||||||
|
&& isSameSym(mem.Aux, "runtime.newobject")
|
||||||
|
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||||
|
-> mem
|
||||||
// nil checks just need to rewrite to something useless.
|
// nil checks just need to rewrite to something useless.
|
||||||
// they will be deadcode eliminated soon afterwards.
|
// they will be deadcode eliminated soon afterwards.
|
||||||
(NilCheck (Load (OffPtr [c] (SP)) mem) mem)
|
(NilCheck (Load (OffPtr [c] (SP)) mem) mem)
|
||||||
|
@ -541,3 +541,13 @@ func experiment(f *Func) bool {
|
|||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isConstZero(v *Value) bool {
|
||||||
|
switch v.Op {
|
||||||
|
case OpConstNil:
|
||||||
|
return true
|
||||||
|
case OpConst64, OpConst32, OpConst16, OpConst8, OpConstBool, OpConst32F, OpConst64F:
|
||||||
|
return v.AuxInt == 0
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@ -14668,6 +14668,70 @@ func rewriteValuegeneric_OpStore(v *Value, config *Config) bool {
|
|||||||
v.AddArg(mem)
|
v.AddArg(mem)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (Store (Load (OffPtr [c] (SP)) mem) x mem)
|
||||||
|
// cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize
|
||||||
|
// result: mem
|
||||||
|
for {
|
||||||
|
v_0 := v.Args[0]
|
||||||
|
if v_0.Op != OpLoad {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v_0_0 := v_0.Args[0]
|
||||||
|
if v_0_0.Op != OpOffPtr {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
c := v_0_0.AuxInt
|
||||||
|
v_0_0_0 := v_0_0.Args[0]
|
||||||
|
if v_0_0_0.Op != OpSP {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
mem := v_0.Args[1]
|
||||||
|
x := v.Args[1]
|
||||||
|
if mem != v.Args[2] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.reset(OpCopy)
|
||||||
|
v.Type = mem.Type
|
||||||
|
v.AddArg(mem)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem)
|
||||||
|
// cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize
|
||||||
|
// result: mem
|
||||||
|
for {
|
||||||
|
v_0 := v.Args[0]
|
||||||
|
if v_0.Op != OpOffPtr {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v_0_0 := v_0.Args[0]
|
||||||
|
if v_0_0.Op != OpLoad {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v_0_0_0 := v_0_0.Args[0]
|
||||||
|
if v_0_0_0.Op != OpOffPtr {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
c := v_0_0_0.AuxInt
|
||||||
|
v_0_0_0_0 := v_0_0_0.Args[0]
|
||||||
|
if v_0_0_0_0.Op != OpSP {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
mem := v_0_0.Args[1]
|
||||||
|
x := v.Args[1]
|
||||||
|
if mem != v.Args[2] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.reset(OpCopy)
|
||||||
|
v.Type = mem.Type
|
||||||
|
v.AddArg(mem)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {
|
func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user