[llvm] [InstCombine] Improve shamt range calculation (PR #72535)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 16 09:15:37 PST 2023
================
@@ -962,16 +963,13 @@ static bool setShiftFlags(BinaryOperator &I, const SimplifyQuery &Q) {
}
// Compute what we know about shift count.
- KnownBits KnownCnt =
- computeKnownBits(I.getOperand(1), Q.DL, /*Depth*/ 0, Q.AC, Q.CxtI, Q.DT);
- // If we know nothing about shift count or its a poison shift, we won't be
- // able to prove anything so return before computing shift amount.
- if (KnownCnt.isUnknown())
- return false;
+ ConstantRange KnownCnt = computeConstantRangeIncludingKnownBits(
+ I.getOperand(1), /* ForSigned */ false, Q);
unsigned BitWidth = KnownCnt.getBitWidth();
- APInt MaxCnt = KnownCnt.getMaxValue();
- if (MaxCnt.uge(BitWidth))
- return false;
+ // Since shift produces a poison value if RHS is equal to or larger than the
+ // bit width, we can safely assume that RHS is less than the bit width.
+ APInt MaxCnt(BitWidth, BitWidth - 1);
+ MaxCnt = APIntOps::umin(MaxCnt, KnownCnt.getUnsignedMax());
----------------
nikic wrote:
```suggestion
uint64_t MaxCnt = KnownCnt.getUnsignedMax().getLimitedValue(BitWidth - 1);
```
I think in this case it's easier to switch to working on plain integer?
https://github.com/llvm/llvm-project/pull/72535
More information about the llvm-commits
mailing list