mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
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:
parent
795414d1c6
commit
c8caad423c
@ -559,6 +559,7 @@
|
||||
(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)
|
||||
|
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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)]
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user