[llvm] [InstCombine] Narrow trunc(lshr) in more cases (PR #139645)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon May 12 20:52:16 PDT 2025
================
@@ -319,13 +321,21 @@ static bool canEvaluateTruncated(Value *V, Type *Ty, InstCombinerImpl &IC,
// zero - use AmtKnownBits.getMaxValue().
uint32_t OrigBitWidth = OrigTy->getScalarSizeInBits();
uint32_t BitWidth = Ty->getScalarSizeInBits();
- KnownBits AmtKnownBits =
- llvm::computeKnownBits(I->getOperand(1), IC.getDataLayout());
+ KnownBits AmtKnownBits = IC.computeKnownBits(I->getOperand(1), 0, CxtI);
+ APInt MaxShiftAmt = AmtKnownBits.getMaxValue();
APInt ShiftedBits = APInt::getBitsSetFrom(OrigBitWidth, BitWidth);
- if (AmtKnownBits.getMaxValue().ult(BitWidth) &&
- IC.MaskedValueIsZero(I->getOperand(0), ShiftedBits, 0, CxtI)) {
- return canEvaluateTruncated(I->getOperand(0), Ty, IC, CxtI) &&
- canEvaluateTruncated(I->getOperand(1), Ty, IC, CxtI);
+ if (MaxShiftAmt.ult(BitWidth)) {
+ // If the only user is a trunc then we can narrow the shift if any new
+ // MSBs are not going to be used.
+ if (auto *Trunc = dyn_cast<TruncInst>(V->user_back())) {
+ auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
+ if ((MaxShiftAmt + DemandedBits).ule(BitWidth))
----------------
dtcxzyw wrote:
Oh, this is enough.
https://github.com/llvm/llvm-project/pull/139645
More information about the llvm-commits
mailing list