]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: optimize (AND (MOVDconst [-1] x)) on PPC64
authorPaul E. Murphy <murp@ibm.com>
Mon, 18 Sep 2023 16:29:20 +0000 (11:29 -0500)
committerPaul Murphy <murp@ibm.com>
Fri, 22 Sep 2023 14:09:29 +0000 (14:09 +0000)
This sequence can show up in the lowering pass on PPC64. If it
makes it to the latelower pass, it will cause an error because
it looks like it can be turned into RLDICL, but -1 isn't an
accepted mask.

Also, print more debug info if panic is called from
encodePPC64RotateMask.

Fixes #62698

Change-Id: I0f3322e2205357abe7fc28f96e05e3f7ad65567c
Reviewed-on: https://go-review.googlesource.com/c/go/+/529195
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Run-TryBot: Paul Murphy <murp@ibm.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/ssa/_gen/PPC64.rules
src/cmd/compile/internal/ssa/rewrite.go
src/cmd/compile/internal/ssa/rewritePPC64.go
test/codegen/copy.go

index 97e592fd7e17225a47154d2774aa68f343bc10e6..4c4f7c8c17cb00ead54d9059cb69610136873db3 100644 (file)
 (NOR (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [^(c|d)])
 
 // Discover consts
+(AND x (MOVDconst [-1])) => x
 (AND x (MOVDconst [c])) && isU16Bit(c) => (Select0 (ANDCCconst [c] x))
 (XOR x (MOVDconst [c])) && isU32Bit(c) => (XORconst [c] x)
 (OR x (MOVDconst [c])) && isU32Bit(c) => (ORconst [c] x)
index efbaae4d465e55fec7d9f7844fb1aef096d1810d..eebedea68c9ed310545dad3dfc40af3be9cb5bfd 100644 (file)
@@ -1478,7 +1478,7 @@ func encodePPC64RotateMask(rotate, mask, nbits int64) int64 {
 
        // Determine boundaries and then decode them
        if mask == 0 || ^mask == 0 || rotate >= nbits {
-               panic("Invalid PPC64 rotate mask")
+               panic(fmt.Sprintf("invalid PPC64 rotate mask: %x %d %d", uint64(mask), rotate, nbits))
        } else if nbits == 32 {
                mb = bits.LeadingZeros32(uint32(mask))
                me = 32 - bits.TrailingZeros32(uint32(mask))
index d1c0c2b07f666eadd94e54012bf3b92bbed2a67a..2bcc27fbc83908c66c5faf6445f2d7bde2113b8c 100644 (file)
@@ -4226,6 +4226,19 @@ func rewriteValuePPC64_OpPPC64AND(v *Value) bool {
                }
                break
        }
+       // match: (AND x (MOVDconst [-1]))
+       // result: x
+       for {
+               for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+                       x := v_0
+                       if v_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 {
+                               continue
+                       }
+                       v.copyOf(x)
+                       return true
+               }
+               break
+       }
        // match: (AND x (MOVDconst [c]))
        // cond: isU16Bit(c)
        // result: (Select0 (ANDCCconst [c] x))
index 4c4c857460fa1d1c7028d2ed6db6a9c31f3e68b3..17ee8bc80761038c8f04d79ef631b2418ad44337 100644 (file)
@@ -151,3 +151,9 @@ func ptrBothOffset() {
        // s390x:-"BEQ",-"BNE"
        copy(x[1:], x[2:])
 }
+
+// Verify #62698 on PPC64.
+func noMaskOnCopy(a []int, s string, x int) int {
+       // ppc64x:-"MOVD\t$-1", -"AND"
+       return a[x&^copy([]byte{}, s)]
+}