From: Cherry Zhang Date: Fri, 3 Mar 2017 18:53:13 +0000 (-0500) Subject: cmd/compile: fix optimization of Zero newobject on amd64p32 X-Git-Tag: go1.9beta1~1320 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9b480521d84654c90f6030675e1e10655b180274;p=gostls13.git cmd/compile: fix optimization of Zero newobject on amd64p32 On amd64p32, PtrSize and RegSize don't agree, and function return value is aligned with RegSize. Fix this rule. Other architectures are not affected, where PtrSize and RegSize are the same. Change-Id: If187d3dfde3dc3b931b8e97db5eeff49a781551b Reviewed-on: https://go-review.googlesource.com/37720 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 740ba8606a..4adbc9e45f 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -1386,9 +1386,9 @@ // recognize runtime.newobject and don't Zero/Nilcheck it (Zero (Load (OffPtr [c] (SP)) mem) mem) - && mem.Op == OpStaticCall + && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") - && c == config.ctxt.FixedFrameSize() + config.PtrSize // offset of return value + && 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. diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index f17bf3343c..0709eb89bb 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -17210,7 +17210,7 @@ func rewriteValuegeneric_OpZero(v *Value, config *Config) bool { b := v.Block _ = b // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) - // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.PtrSize + // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { v_0 := v.Args[0] @@ -17230,7 +17230,7 @@ func rewriteValuegeneric_OpZero(v *Value, config *Config) bool { if mem != v.Args[1] { break } - if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.PtrSize) { + if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } v.reset(OpCopy)