From 934104630291d3bb8b1023e44fe06687e1c0b9c8 Mon Sep 17 00:00:00 2001 From: Jayanth Krishnamurthy Date: Wed, 1 Nov 2023 14:43:42 -0500 Subject: [PATCH] cmd/compile: adding rule to eliminate ANDCCconst For example, the Slicemask rule in PPC64 generates a sequence wherein there is andi operation, after an sradi, which can be replaced by srdi. This new rule eliminates ANDCCconst. Change-Id: I27aaadf76b9c749a60bcdc5e87b1ebb8167d2fd4 Reviewed-on: https://go-review.googlesource.com/c/go/+/539055 Run-TryBot: Lynn Boger TryBot-Result: Gopher Robot Reviewed-by: Lynn Boger Reviewed-by: Jayanth Krishnamurthy LUCI-TryBot-Result: Go LUCI Reviewed-by: Heschi Kreinick Reviewed-by: Cherry Mui --- src/cmd/compile/internal/ssa/_gen/PPC64.rules | 1 + src/cmd/compile/internal/ssa/rewritePPC64.go | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/cmd/compile/internal/ssa/_gen/PPC64.rules b/src/cmd/compile/internal/ssa/_gen/PPC64.rules index 5780260c24..c9cd34b9a6 100644 --- a/src/cmd/compile/internal/ssa/_gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/_gen/PPC64.rules @@ -800,6 +800,7 @@ (AtomicOr(8|32) ...) => (LoweredAtomicOr(8|32) ...) (Slicemask x) => (SRADconst (NEG x) [63]) +(Select0 (ANDCCconst [1] z:(SRADconst [63] x))) && z.Uses == 1 => (SRDconst [63] x) // Note that MOV??reg returns a 64-bit int, x is not necessarily that wide // This may interact with other patterns in the future. (Compare with arm64) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 7ec6bb4e46..473a8ff9d9 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -14552,6 +14552,26 @@ func rewriteValuePPC64_OpSelect0(v *Value) bool { v.AddArg(v0) return true } + // match: (Select0 (ANDCCconst [1] z:(SRADconst [63] x))) + // cond: z.Uses == 1 + // result: (SRDconst [63] x) + for { + if v_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + z := v_0.Args[0] + if z.Op != OpPPC64SRADconst || auxIntToInt64(z.AuxInt) != 63 { + break + } + x := z.Args[0] + if !(z.Uses == 1) { + break + } + v.reset(OpPPC64SRDconst) + v.AuxInt = int64ToAuxInt(63) + v.AddArg(x) + return true + } return false } func rewriteValuePPC64_OpSelect1(v *Value) bool { -- 2.44.0