summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2022-02-03 15:55:55 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2022-02-03 16:02:45 +0000
commitea7a3e6a6a131ef61dbc2dd5802e7cb6caf56f74 (patch)
treed6eae907936604a248f16377c84811f5bb7c7161
parent9b65641d5e8cf67662e0c50502964e1cead9f95a (diff)
[X86] simplifyX86varShift - use KnownBits.getMaxValue().ult() to check for out of bounds shift amounts
This is easier to grok than MaskedValueIsZero for high bits.
-rw-r--r--llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp7
1 files changed, 3 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
index ff8710634e89..1b021ada6b66 100644
--- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
+++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
@@ -354,10 +354,9 @@ static Value *simplifyX86varShift(const IntrinsicInst &II,
// If the shift amount is guaranteed to be in-range we can replace it with a
// generic shift.
- APInt UpperBits =
- APInt::getHighBitsSet(BitWidth, BitWidth - Log2_32(BitWidth));
- if (llvm::MaskedValueIsZero(Amt, UpperBits,
- II.getModule()->getDataLayout())) {
+ KnownBits KnownAmt =
+ llvm::computeKnownBits(Amt, II.getModule()->getDataLayout());
+ if (KnownAmt.getMaxValue().ult(BitWidth)) {
return (LogicalShift ? (ShiftLeft ? Builder.CreateShl(Vec, Amt)
: Builder.CreateLShr(Vec, Amt))
: Builder.CreateAShr(Vec, Amt));