[llvm] [InstCombine] Remove shl if we only demand known signbits of shift source (PR #79014)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 29 07:26:54 PST 2024
================
@@ -640,25 +640,31 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
DemandedMask, Known))
return R;
- // TODO: If we only want bits that already match the signbit then we don't
+ uint64_t ShiftAmt = SA->getLimitedValue(BitWidth - 1);
+ // If we only want bits that already match the signbit then we don't
// need to shift.
+ if (DemandedMask.countr_zero() >= ShiftAmt) {
+ unsigned NumHiDemandedBits = BitWidth - DemandedMask.countr_zero();
+ unsigned SignBits =
+ ComputeNumSignBits(I->getOperand(0), Depth + 1, CxtI);
+ if (SignBits > ShiftAmt && SignBits - ShiftAmt >= NumHiDemandedBits)
+ return I->getOperand(0);
- // If we can pre-shift a right-shifted constant to the left without
- // losing any high bits amd we don't demand the low bits, then eliminate
- // the left-shift:
- // (C >> X) << LeftShiftAmtC --> (C << RightShiftAmtC) >> X
- uint64_t ShiftAmt = SA->getLimitedValue(BitWidth-1);
- Value *X;
- Constant *C;
- if (DemandedMask.countr_zero() >= ShiftAmt &&
- match(I->getOperand(0), m_LShr(m_ImmConstant(C), m_Value(X)))) {
- Constant *LeftShiftAmtC = ConstantInt::get(VTy, ShiftAmt);
- Constant *NewC = ConstantFoldBinaryOpOperands(Instruction::Shl, C,
- LeftShiftAmtC, DL);
- if (ConstantFoldBinaryOpOperands(Instruction::LShr, NewC, LeftShiftAmtC,
- DL) == C) {
- Instruction *Lshr = BinaryOperator::CreateLShr(NewC, X);
- return InsertNewInstWith(Lshr, I->getIterator());
+ // If we can pre-shift a right-shifted constant to the left without
+ // losing any high bits amd we don't demand the low bits, then eliminate
+ // the left-shift:
+ // (C >> X) << LeftShiftAmtC --> (C << RightShiftAmtC) >> X
----------------
nikic wrote:
```suggestion
// losing any high bits and we don't demand the low bits, then eliminate
// the left-shift:
// (C >> X) << LeftShiftAmtC --> (C << LeftShiftAmtC) >> X
```
Pre-existing, but if you're touching the code anyway...
https://github.com/llvm/llvm-project/pull/79014
More information about the llvm-commits
mailing list