[llvm] [InstCombine] Fold shift+cttz with power of 2 operands (PR #127055)
Matthew Devereau via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 17 02:42:14 PST 2025
================
@@ -1613,6 +1613,22 @@ Instruction *InstCombinerImpl::visitLShr(BinaryOperator &I) {
if (Instruction *Overflow = foldLShrOverflowBit(I))
return Overflow;
+ // Transform ((pow2 << x) >> cttz(pow2 << y)) -> ((1 << x) >> y)
+ Value *Shl0_Op0, *Shl0_Op1, *Shl1_Op0, *Shl1_Op1;
+ BinaryOperator *Shl1;
+ if (match(Op0, m_Shl(m_Value(Shl0_Op0), m_Value(Shl0_Op1))) &&
+ match(Op1, m_Intrinsic<Intrinsic::cttz>(m_BinOp(Shl1))) &&
+ match(Shl1, m_Shl(m_Value(Shl1_Op0), m_Value(Shl1_Op1))) &&
+ isKnownToBeAPowerOfTwo(Shl1, false, 0, SQ.getWithInstruction(&I).CxtI) &&
+ Shl0_Op0 == Shl1_Op0) {
+ auto *Shl0 = cast<BinaryOperator>(Op0);
+ if ((Shl0->hasNoUnsignedWrap() && Shl1->hasNoUnsignedWrap()) ||
+ (Shl0->hasNoSignedWrap() && Shl1->hasNoSignedWrap())) {
----------------
MDevereau wrote:
Done
https://github.com/llvm/llvm-project/pull/127055
More information about the llvm-commits
mailing list