Skip to content

Commit c8eaeb8

Browse files
committed
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 9b48052 commit c8eaeb8

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

src/cmd/compile/internal/ssa/gen/generic.rules

+12
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,18 @@
13901390
&& isSameSym(mem.Aux, "runtime.newobject")
13911391
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
13921392
-> mem
1393+
(Store (Load (OffPtr [c] (SP)) mem) x mem)
1394+
&& isConstZero(x)
1395+
&& mem.Op == OpStaticCall
1396+
&& isSameSym(mem.Aux, "runtime.newobject")
1397+
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
1398+
-> mem
1399+
(Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem)
1400+
&& isConstZero(x)
1401+
&& mem.Op == OpStaticCall
1402+
&& isSameSym(mem.Aux, "runtime.newobject")
1403+
&& c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value
1404+
-> mem
13931405
// nil checks just need to rewrite to something useless.
13941406
// they will be deadcode eliminated soon afterwards.
13951407
(NilCheck (Load (OffPtr [c] (SP)) mem) mem)

src/cmd/compile/internal/ssa/rewrite.go

+10
Original file line numberDiff line numberDiff line change
@@ -541,3 +541,13 @@ func experiment(f *Func) bool {
541541
}
542542
return r
543543
}
544+
545+
func isConstZero(v *Value) bool {
546+
switch v.Op {
547+
case OpConstNil:
548+
return true
549+
case OpConst64, OpConst32, OpConst16, OpConst8, OpConstBool, OpConst32F, OpConst64F:
550+
return v.AuxInt == 0
551+
}
552+
return false
553+
}

src/cmd/compile/internal/ssa/rewritegeneric.go

+64
Original file line numberDiff line numberDiff line change
@@ -14668,6 +14668,70 @@ func rewriteValuegeneric_OpStore(v *Value, config *Config) bool {
1466814668
v.AddArg(mem)
1466914669
return true
1467014670
}
14671+
// match: (Store (Load (OffPtr [c] (SP)) mem) x mem)
14672+
// cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize
14673+
// result: mem
14674+
for {
14675+
v_0 := v.Args[0]
14676+
if v_0.Op != OpLoad {
14677+
break
14678+
}
14679+
v_0_0 := v_0.Args[0]
14680+
if v_0_0.Op != OpOffPtr {
14681+
break
14682+
}
14683+
c := v_0_0.AuxInt
14684+
v_0_0_0 := v_0_0.Args[0]
14685+
if v_0_0_0.Op != OpSP {
14686+
break
14687+
}
14688+
mem := v_0.Args[1]
14689+
x := v.Args[1]
14690+
if mem != v.Args[2] {
14691+
break
14692+
}
14693+
if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) {
14694+
break
14695+
}
14696+
v.reset(OpCopy)
14697+
v.Type = mem.Type
14698+
v.AddArg(mem)
14699+
return true
14700+
}
14701+
// match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem)
14702+
// cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize
14703+
// result: mem
14704+
for {
14705+
v_0 := v.Args[0]
14706+
if v_0.Op != OpOffPtr {
14707+
break
14708+
}
14709+
v_0_0 := v_0.Args[0]
14710+
if v_0_0.Op != OpLoad {
14711+
break
14712+
}
14713+
v_0_0_0 := v_0_0.Args[0]
14714+
if v_0_0_0.Op != OpOffPtr {
14715+
break
14716+
}
14717+
c := v_0_0_0.AuxInt
14718+
v_0_0_0_0 := v_0_0_0.Args[0]
14719+
if v_0_0_0_0.Op != OpSP {
14720+
break
14721+
}
14722+
mem := v_0_0.Args[1]
14723+
x := v.Args[1]
14724+
if mem != v.Args[2] {
14725+
break
14726+
}
14727+
if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) {
14728+
break
14729+
}
14730+
v.reset(OpCopy)
14731+
v.Type = mem.Type
14732+
v.AddArg(mem)
14733+
return true
14734+
}
1467114735
return false
1467214736
}
1467314737
func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {

0 commit comments

Comments
 (0)