diff options
author | Cherry Zhang <cherryyz@google.com> | 2021-04-11 14:33:28 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2021-04-12 16:44:49 +0000 |
commit | 70ed28e5f763d08ee0d3be7bde14b35ce3d6322e (patch) | |
tree | 9f354dc074b2fec5cd4318c3c8f6fa5a43d412c9 /src/cmd/compile/internal/ssa/gen | |
parent | 585b52261c1b4e26b029616581ee0e891ad49183 (diff) | |
download | go-70ed28e5f763d08ee0d3be7bde14b35ce3d6322e.tar.gz go-70ed28e5f763d08ee0d3be7bde14b35ce3d6322e.zip |
cmd/compile: support memmove inlining with register args
The rule that inlines memmove expects SSA ops that calls memmove
with arguments in memory. This CL adds a version that matches
it with arguments in registers, so the optimization works for
both situations.
Change-Id: Ideb64f65b7521481ab2ca7c9975a6cf7b70d5966
Reviewed-on: https://go-review.googlesource.com/c/go/+/309332
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/gen')
-rw-r--r-- | src/cmd/compile/internal/ssa/gen/generic.rules | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 6b5fd99c7e..aad7600d79 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -2055,12 +2055,13 @@ (IsNonNil (Addr _)) => (ConstBool [true]) (IsNonNil (LocalAddr _ _)) => (ConstBool [true]) -// TODO REGISTER ARGS this will need revision. -// Because expand calls runs after prove, constants useful to this pattern may not appear -// In the future both versions need to exist; the memory and register variants. - // Inline small or disjoint runtime.memmove calls with constant length. // See the comment in op Move in genericOps.go for discussion of the type. + +// Because expand calls runs after prove, constants useful to this pattern may not appear. +// Both versions need to exist; the memory and register variants. +// +// Match post-expansion calls, memory version. (SelectN [0] call:(StaticCall {sym} s1:(Store _ (Const(64|32) [sz]) s2:(Store _ src s3:(Store {t} _ dst mem))))) && sz >= 0 && isSameCall(sym, "runtime.memmove") @@ -2070,8 +2071,17 @@ && clobber(s1, s2, s3, call) => (Move {t.Elem()} [int64(sz)] dst src mem) -// Inline small or disjoint runtime.memmove calls with constant length. -// See the comment in op Move in genericOps.go for discussion of the type. +// Match post-expansion calls, register version. +(SelectN [0] call:(StaticCall {sym} dst src (Const(64|32) [sz]) mem)) + && sz >= 0 + && call.Uses == 1 // this will exclude all calls with results + && isSameCall(sym, "runtime.memmove") + && dst.Type.IsPtr() // avoids TUINTPTR, see issue 30061 + && isInlinableMemmove(dst, src, int64(sz), config) + && clobber(call) + => (Move {dst.Type.Elem()} [int64(sz)] dst src mem) + +// Match pre-expansion calls. (SelectN [0] call:(StaticLECall {sym} dst src (Const(64|32) [sz]) mem)) && sz >= 0 && call.Uses == 1 // this will exclude all calls with results |