diff options
author | Keith Randall <khr@golang.org> | 2021-09-19 09:23:37 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2021-09-19 23:50:45 +0000 |
commit | 315dbd10c90db3b41af2c975a5fbfa2ec7615c1b (patch) | |
tree | abeeee7d13f3d084e9b027edd4b48cedeb1bb7ab /src | |
parent | 83b36ffb108cc6e6cc3282b94c090f70100b5ef0 (diff) | |
download | go-315dbd10c90db3b41af2c975a5fbfa2ec7615c1b.tar.gz go-315dbd10c90db3b41af2c975a5fbfa2ec7615c1b.zip |
cmd/compile: fold double negate on arm64
Fixes #48467
Change-Id: I52305dbf561ee3eee6c1f053e555a3a6ec1ab892
Reviewed-on: https://go-review.googlesource.com/c/go/+/350910
Trust: Keith Randall <khr@golang.org>
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/compile/internal/ssa/gen/ARM64.rules | 1 | ||||
-rw-r--r-- | src/cmd/compile/internal/ssa/rewriteARM64.go | 10 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index f63b2557c5..23ae3b1286 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1363,6 +1363,7 @@ (XOR x (MVN y)) => (EON x y) (OR x (MVN y)) => (ORN x y) (MVN (XOR x y)) => (EON x y) +(NEG (NEG x)) => x (CSEL [cc] (MOVDconst [-1]) (MOVDconst [0]) flag) => (CSETM [cc] flag) (CSEL [cc] (MOVDconst [0]) (MOVDconst [-1]) flag) => (CSETM [arm64Negate(cc)] flag) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 2bce96f0b2..661714307a 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -15691,6 +15691,16 @@ func rewriteValueARM64_OpARM64NEG(v *Value) bool { v.AddArg2(x, y) return true } + // match: (NEG (NEG x)) + // result: x + for { + if v_0.Op != OpARM64NEG { + break + } + x := v_0.Args[0] + v.copyOf(x) + return true + } // match: (NEG (MOVDconst [c])) // result: (MOVDconst [-c]) for { |