[llvm] 6d9c57b - [LLVM][InstSimplify] Refactor simplifyBinaryIntrinsic to remove Call operand. (#196309)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 8 06:11:50 PDT 2026
Author: Paul Walker
Date: 2026-05-08T14:11:45+01:00
New Revision: 6d9c57ba52c9511eb82722c38bc23f7cd6fea6a3
URL: https://github.com/llvm/llvm-project/commit/6d9c57ba52c9511eb82722c38bc23f7cd6fea6a3
DIFF: https://github.com/llvm/llvm-project/commit/6d9c57ba52c9511eb82722c38bc23f7cd6fea6a3.diff
LOG: [LLVM][InstSimplify] Refactor simplifyBinaryIntrinsic to remove Call operand. (#196309)
Added:
Modified:
llvm/include/llvm/Analysis/InstSimplifyFolder.h
llvm/include/llvm/Analysis/InstructionSimplify.h
llvm/lib/Analysis/InstructionSimplify.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/InstSimplifyFolder.h b/llvm/include/llvm/Analysis/InstSimplifyFolder.h
index 2832beb9e337c..e1f102fee9259 100644
--- a/llvm/include/llvm/Analysis/InstSimplifyFolder.h
+++ b/llvm/include/llvm/Analysis/InstSimplifyFolder.h
@@ -121,8 +121,10 @@ class LLVM_ABI InstSimplifyFolder final : public IRBuilderFolder {
Value *FoldBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, Type *Ty,
Instruction *FMFSource = nullptr) const override {
- return simplifyBinaryIntrinsic(ID, Ty, LHS, RHS, SQ,
- dyn_cast_if_present<CallBase>(FMFSource));
+ FastMathFlags FMF;
+ if (auto *FPMO = dyn_cast_if_present<FPMathOperator>(FMFSource))
+ FMF = FPMO->getFastMathFlags();
+ return simplifyBinaryIntrinsic(ID, Ty, LHS, RHS, FMF, SQ);
}
//===--------------------------------------------------------------------===//
diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h
index b5fdd8422ab9a..488adad5cc1cf 100644
--- a/llvm/include/llvm/Analysis/InstructionSimplify.h
+++ b/llvm/include/llvm/Analysis/InstructionSimplify.h
@@ -198,8 +198,8 @@ LLVM_ABI Value *simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
/// The \p `Call` argument is optional and may be null.
LLVM_ABI Value *simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
Value *Op0, Value *Op1,
- const SimplifyQuery &Q,
- const CallBase *Call);
+ FastMathFlags FMF,
+ const SimplifyQuery &Q);
/// Given operands for a ShuffleVectorInst, fold the result or return null.
/// See class ShuffleVectorInst for a description of the mask representation.
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 2bd0eb269510f..c842bdf8ff492 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -6722,7 +6722,7 @@ enum class MinMaxOptResult {
// quieted), or to choose either option in the case of undef/poison.
static MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst,
const Intrinsic::ID IID,
- const CallBase *Call,
+ FastMathFlags FMF,
Constant **OutNewConstVal) {
assert(OutNewConstVal != nullptr);
@@ -6758,15 +6758,14 @@ static MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst,
return MinMaxOptResult::UseOtherVal;
}
- if (CAPF.isInfinity() || (Call && Call->hasNoInfs() && CAPF.isLargest())) {
+ if (CAPF.isInfinity() || (FMF.noInfs() && CAPF.isLargest())) {
// minnum(X, -inf) -> -inf (ignoring sNaN -> qNaN propagation)
// maxnum(X, +inf) -> +inf (ignoring sNaN -> qNaN propagation)
// minimum(X, -inf) -> -inf if nnan
// maximum(X, +inf) -> +inf if nnan
// minimumnum(X, -inf) -> -inf
// maximumnum(X, +inf) -> +inf
- if (CAPF.isNegative() == IsMin &&
- (!PropagateNaN || (Call && Call->hasNoNaNs()))) {
+ if (CAPF.isNegative() == IsMin && (!PropagateNaN || FMF.noNaNs())) {
*OutNewConstVal = const_cast<Constant *>(RHSConst);
return MinMaxOptResult::UseNewConstVal;
}
@@ -6777,8 +6776,7 @@ static MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst,
// maximum(X, -inf) -> X (ignoring quieting of sNaNs)
// minimumnum(X, +inf) -> X if nnan
// maximumnum(X, -inf) -> X if nnan
- if (CAPF.isNegative() != IsMin &&
- (PropagateNaN || (Call && Call->hasNoNaNs())))
+ if (CAPF.isNegative() != IsMin && (PropagateNaN || FMF.noNaNs()))
return MinMaxOptResult::UseOtherVal;
}
return MinMaxOptResult::CannotOptimize;
@@ -6841,19 +6839,18 @@ static Value *simplifySVEIntReduction(Intrinsic::ID IID, Type *ReturnType,
}
Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
- Value *Op0, Value *Op1,
- const SimplifyQuery &Q,
- const CallBase *Call) {
+ Value *Op0, Value *Op1, FastMathFlags FMF,
+ const SimplifyQuery &Q) {
unsigned BitWidth = ReturnType->getScalarSizeInBits();
switch (IID) {
case Intrinsic::get_active_lane_mask: {
if (match(Op1, m_Zero()))
return ConstantInt::getFalse(ReturnType);
- if (!Call)
+ if (!Q.CxtI)
break;
- const Function *F = Call->getFunction();
+ const Function *F = Q.CxtI->getFunction();
auto *ScalableTy = dyn_cast<ScalableVectorType>(ReturnType);
Attribute Attr = F->getFnAttribute(Attribute::VScaleRange);
if (ScalableTy && Attr.isValid()) {
@@ -7138,7 +7135,7 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
if (Constant *SplatVal = C->getSplatValue()) {
// Handle splat vectors (including scalable vectors)
- OptResult = OptimizeConstMinMax(SplatVal, IID, Call, &NewConst);
+ OptResult = OptimizeConstMinMax(SplatVal, IID, FMF, &NewConst);
if (OptResult == MinMaxOptResult::UseNewConstVal)
NewConst = ConstantVector::getSplat(ElemCount, NewConst);
@@ -7157,7 +7154,7 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
OptResult = MinMaxOptResult::CannotOptimize;
break;
}
- auto ElemResult = OptimizeConstMinMax(Elt, IID, Call, &NewConst);
+ auto ElemResult = OptimizeConstMinMax(Elt, IID, FMF, &NewConst);
if (ElemResult == MinMaxOptResult::CannotOptimize ||
(ElemResult != OptResult &&
OptResult != MinMaxOptResult::UseEither &&
@@ -7174,7 +7171,7 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
}
} else {
// Handle scalar inputs
- OptResult = OptimizeConstMinMax(C, IID, Call, &NewConst);
+ OptResult = OptimizeConstMinMax(C, IID, FMF, &NewConst);
}
if (OptResult == MinMaxOptResult::UseOtherVal ||
@@ -7253,9 +7250,13 @@ static Value *simplifyIntrinsic(CallBase *Call, Value *Callee,
if (NumOperands == 1)
return simplifyUnaryIntrinsic(F, Args[0], Q, Call);
- if (NumOperands == 2)
- return simplifyBinaryIntrinsic(IID, F->getReturnType(), Args[0], Args[1], Q,
- Call);
+ if (NumOperands == 2) {
+ FastMathFlags FMF;
+ if (auto *FPMO = dyn_cast<FPMathOperator>(Call))
+ FMF = FPMO->getFastMathFlags();
+ return simplifyBinaryIntrinsic(IID, F->getReturnType(), Args[0], Args[1],
+ FMF, Q.getWithInstruction(Call));
+ }
// Handle intrinsics with 3 or more arguments.
switch (IID) {
More information about the llvm-commits
mailing list