cmd/compile/internal/ssa: optimize (AND (MOVDconst [-1] x)) on PPC64

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>
This commit is contained in:
Paul E. Murphy 2023-09-18 11:29:20 -05:00 committed by Paul Murphy
parent 795414d1c6
commit c8caad423c
4 changed files with 21 additions and 1 deletions

View File

@ -559,6 +559,7 @@
(NOR (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [^(c|d)]) (NOR (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [^(c|d)])
// Discover consts // Discover consts
(AND x (MOVDconst [-1])) => x
(AND x (MOVDconst [c])) && isU16Bit(c) => (Select0 (ANDCCconst [c] x)) (AND x (MOVDconst [c])) && isU16Bit(c) => (Select0 (ANDCCconst [c] x))
(XOR x (MOVDconst [c])) && isU32Bit(c) => (XORconst [c] x) (XOR x (MOVDconst [c])) && isU32Bit(c) => (XORconst [c] x)
(OR x (MOVDconst [c])) && isU32Bit(c) => (ORconst [c] x) (OR x (MOVDconst [c])) && isU32Bit(c) => (ORconst [c] x)

View File

@ -1478,7 +1478,7 @@ func encodePPC64RotateMask(rotate, mask, nbits int64) int64 {
// Determine boundaries and then decode them // Determine boundaries and then decode them
if mask == 0 || ^mask == 0 || rotate >= nbits { 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 { } else if nbits == 32 {
mb = bits.LeadingZeros32(uint32(mask)) mb = bits.LeadingZeros32(uint32(mask))
me = 32 - bits.TrailingZeros32(uint32(mask)) me = 32 - bits.TrailingZeros32(uint32(mask))

View File

@ -4226,6 +4226,19 @@ func rewriteValuePPC64_OpPPC64AND(v *Value) bool {
} }
break 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])) // match: (AND x (MOVDconst [c]))
// cond: isU16Bit(c) // cond: isU16Bit(c)
// result: (Select0 (ANDCCconst [c] x)) // result: (Select0 (ANDCCconst [c] x))

View File

@ -151,3 +151,9 @@ func ptrBothOffset() {
// s390x:-"BEQ",-"BNE" // s390x:-"BEQ",-"BNE"
copy(x[1:], x[2:]) 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)]
}