[llvm] [InstCombine] Convert fshl(x, 0, y) to shl(x, y) or shl(X, and(Y, BitWidth - 1)) (PR #122362)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 9 13:49:21 PST 2025
================
@@ -2229,6 +2229,19 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
return BitOp;
}
+ // fshal(X, 0, Y) --> shl(X, and(Y, BitWidth - 1))
+ // fshal(X, 0, Y) --> Shl(X, Y) if Y within the range 0 to type bit width
+ if (match(Op1, m_ZeroInt())) {
+ unsigned BitWidth = Ty->getScalarSizeInBits();
+ Value *Op2 = II->getArgOperand(2);
+ if (auto Range = II->getRange(); Range && Range->getLower().sge(0) &&
+ Range->getUpper().sle(BitWidth)) {
+ return BinaryOperator::CreateShl(Op0, Op2);
+ }
+ Value *And = Builder.CreateAnd(Op2, ConstantInt::get(Ty, BitWidth - 1));
----------------
nikic wrote:
This transform needs to be limited to power of two bitwidths, otherwise this is incorrect.
https://github.com/llvm/llvm-project/pull/122362
More information about the llvm-commits
mailing list