mirror of
https://github.com/golang/go
synced 2024-11-18 12:24:48 -07: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")
|
||||
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
|
||||
-> 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.
|
||||
// they will be deadcode eliminated soon afterwards.
|
||||
(NilCheck (Load (OffPtr [c] (SP)) mem) mem)
|
||||
|
@ -541,3 +541,13 @@ func experiment(f *Func) bool {
|
||||
}
|
||||
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)
|
||||
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
|
||||
}
|
||||
func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {
|
||||
|
Loading…
Reference in New Issue
Block a user