[llvm] 2938f1c - [InstCombine] Refactor powi(X,Y) / X to call foldPowiReassoc, NFC
via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 27 01:49:06 PDT 2024
Author: zhongyunde 00443407
Date: 2024-03-27T16:47:03+08:00
New Revision: 2938f1cff9f880d03c900a2bdcd078af937d9433
URL: https://github.com/llvm/llvm-project/commit/2938f1cff9f880d03c900a2bdcd078af937d9433
DIFF: https://github.com/llvm/llvm-project/commit/2938f1cff9f880d03c900a2bdcd078af937d9433.diff
LOG: [InstCombine] Refactor powi(X,Y) / X to call foldPowiReassoc, NFC
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index af238a43b11a05..a9f0a16be0b8c9 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -611,6 +611,18 @@ Instruction *InstCombinerImpl::foldPowiReassoc(BinaryOperator &I) {
Y->getType() == Z->getType())
return createPowiExpr(I, *this, X, Y, Z);
+ // powi(X, Y) / X --> powi(X, Y-1)
+ // This is legal when (Y - 1) can't wraparound, in which case reassoc and nnan
+ // are required.
+ // TODO: Multi-use may be also better off creating Powi(x,y-1)
+ if (I.hasAllowReassoc() && I.hasNoNaNs() &&
+ match(Op0, m_OneUse(m_Intrinsic<Intrinsic::powi>(m_Specific(Op1),
+ m_Value(Y)))) &&
+ willNotOverflowSignedSub(Y, ConstantInt::get(Y->getType(), 1), I)) {
+ Constant *NegOne = ConstantInt::getAllOnesValue(Y->getType());
+ return createPowiExpr(I, *this, Op1, Y, NegOne);
+ }
+
return nullptr;
}
@@ -1904,20 +1916,8 @@ Instruction *InstCombinerImpl::visitFDiv(BinaryOperator &I) {
return replaceInstUsesWith(I, Pow);
}
- // powi(X, Y) / X --> powi(X, Y-1)
- // This is legal when (Y - 1) can't wraparound, in which case reassoc and nnan
- // are required.
- // TODO: Multi-use may be also better off creating Powi(x,y-1)
- if (I.hasAllowReassoc() && I.hasNoNaNs() &&
- match(Op0, m_OneUse(m_Intrinsic<Intrinsic::powi>(m_Specific(Op1),
- m_Value(Y)))) &&
- willNotOverflowSignedSub(Y, ConstantInt::get(Y->getType(), 1), I)) {
- Constant *NegOne = ConstantInt::getAllOnesValue(Y->getType());
- Value *Y1 = Builder.CreateAdd(Y, NegOne);
- Type *Types[] = {Op1->getType(), Y1->getType()};
- Value *Pow = Builder.CreateIntrinsic(Intrinsic::powi, Types, {Op1, Y1}, &I);
- return replaceInstUsesWith(I, Pow);
- }
+ if (Instruction *FoldedPowi = foldPowiReassoc(I))
+ return FoldedPowi;
return nullptr;
}
More information about the llvm-commits
mailing list