]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: match register-ABI version of memmove call on ARM64
authorCherry Mui <cherryyz@google.com>
Sat, 29 May 2021 02:32:41 +0000 (22:32 -0400)
committerCherry Mui <cherryyz@google.com>
Tue, 1 Jun 2021 22:33:10 +0000 (22:33 +0000)
Update the rule to match register-ABI version of the call for
inlining memmove.

Change-Id: Ic6da810e4d7ac391ffb766fcdc943985f0739624
Reviewed-on: https://go-review.googlesource.com/c/go/+/323930
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/ssa/gen/ARM64.rules
src/cmd/compile/internal/ssa/rewriteARM64.go

index 62699f290c2149e6308c4f0d3d82b9b20e3d7738..530e48bcb259a4e84a039d2896b020c93967386b 100644 (file)
        && isInlinableMemmove(dst, src, sz, config)
        && clobber(s1, s2, s3, call)
        => (Move [sz] dst src mem)
+
+// Match post-lowering calls, register version.
+(SelectN [0] call:(CALLstatic {sym} dst src (MOVDconst [sz]) mem))
+       && sz >= 0
+       && isSameCall(sym, "runtime.memmove")
+       && call.Uses == 1
+       && isInlinableMemmove(dst, src, sz, config)
+       && clobber(call)
+       => (Move [sz] dst src mem)
index debe5f2c2a6321aee7c4571836c46cb23d31f08f..f7840c5503975476d26d3d9531762cd5d41123a9 100644 (file)
@@ -26031,6 +26031,34 @@ func rewriteValueARM64_OpSelectN(v *Value) bool {
                v.AddArg3(dst, src, mem)
                return true
        }
+       // match: (SelectN [0] call:(CALLstatic {sym} dst src (MOVDconst [sz]) mem))
+       // cond: sz >= 0 && isSameCall(sym, "runtime.memmove") && call.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(call)
+       // result: (Move [sz] dst src mem)
+       for {
+               if auxIntToInt64(v.AuxInt) != 0 {
+                       break
+               }
+               call := v_0
+               if call.Op != OpARM64CALLstatic || len(call.Args) != 4 {
+                       break
+               }
+               sym := auxToCall(call.Aux)
+               mem := call.Args[3]
+               dst := call.Args[0]
+               src := call.Args[1]
+               call_2 := call.Args[2]
+               if call_2.Op != OpARM64MOVDconst {
+                       break
+               }
+               sz := auxIntToInt64(call_2.AuxInt)
+               if !(sz >= 0 && isSameCall(sym, "runtime.memmove") && call.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(call)) {
+                       break
+               }
+               v.reset(OpMove)
+               v.AuxInt = int64ToAuxInt(sz)
+               v.AddArg3(dst, src, mem)
+               return true
+       }
        return false
 }
 func rewriteValueARM64_OpSlicemask(v *Value) bool {