summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorannamthomas <anna@azul.com>2023-11-08 10:25:11 -0500
committerGitHub <noreply@github.com>2023-11-08 10:25:11 -0500
commit98d8b688bd351850ca99d3e5e9dfdf582c83c4f4 (patch)
tree33eaf28d60b167b665fb65e712aa1ec499bbf603
parentea82853499cc8780cfc86a6913d851f05d527188 (diff)
[InstSimplify] Check call for FMF instead of CtxI (#71585)
This code was incorrectly checking that the CtxI has required FMF, but the context instruction need not always be the instrinsic call. Check that the intrinsic call has the required FMF. Fixes PR71548.
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp29
1 files changed, 15 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index ad51e1630620..2fff10df5503 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -6161,7 +6161,8 @@ static Value *simplifyLdexp(Value *Op0, Value *Op1, const SimplifyQuery &Q,
}
static Value *simplifyUnaryIntrinsic(Function *F, Value *Op0,
- const SimplifyQuery &Q) {
+ const SimplifyQuery &Q,
+ const CallBase *Call) {
// Idempotent functions return the same result when called repeatedly.
Intrinsic::ID IID = F->getIntrinsicID();
if (isIdempotent(IID))
@@ -6212,31 +6213,31 @@ static Value *simplifyUnaryIntrinsic(Function *F, Value *Op0,
}
case Intrinsic::exp:
// exp(log(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
match(Op0, m_Intrinsic<Intrinsic::log>(m_Value(X))))
return X;
break;
case Intrinsic::exp2:
// exp2(log2(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
match(Op0, m_Intrinsic<Intrinsic::log2>(m_Value(X))))
return X;
break;
case Intrinsic::exp10:
// exp10(log10(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
match(Op0, m_Intrinsic<Intrinsic::log10>(m_Value(X))))
return X;
break;
case Intrinsic::log:
// log(exp(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
match(Op0, m_Intrinsic<Intrinsic::exp>(m_Value(X))))
return X;
break;
case Intrinsic::log2:
// log2(exp2(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
(match(Op0, m_Intrinsic<Intrinsic::exp2>(m_Value(X))) ||
match(Op0,
m_Intrinsic<Intrinsic::pow>(m_SpecificFP(2.0), m_Value(X)))))
@@ -6245,7 +6246,7 @@ static Value *simplifyUnaryIntrinsic(Function *F, Value *Op0,
case Intrinsic::log10:
// log10(pow(10.0, x)) -> x
// log10(exp10(x)) -> x
- if (Q.CxtI->hasAllowReassoc() &&
+ if (Call->hasAllowReassoc() &&
(match(Op0, m_Intrinsic<Intrinsic::exp10>(m_Value(X))) ||
match(Op0,
m_Intrinsic<Intrinsic::pow>(m_SpecificFP(10.0), m_Value(X)))))
@@ -6346,7 +6347,8 @@ static Value *foldMinimumMaximumSharedOp(Intrinsic::ID IID, Value *Op0,
}
static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1,
- const SimplifyQuery &Q) {
+ const SimplifyQuery &Q,
+ const CallBase *Call) {
Intrinsic::ID IID = F->getIntrinsicID();
Type *ReturnType = F->getReturnType();
unsigned BitWidth = ReturnType->getScalarSizeInBits();
@@ -6606,20 +6608,19 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1,
// float, if the ninf flag is set.
const APFloat *C;
if (match(Op1, m_APFloat(C)) &&
- (C->isInfinity() || (isa<FPMathOperator>(Q.CxtI) &&
- Q.CxtI->hasNoInfs() && C->isLargest()))) {
+ (C->isInfinity() || (Call->hasNoInfs() && C->isLargest()))) {
// minnum(X, -inf) -> -inf
// maxnum(X, +inf) -> +inf
// minimum(X, -inf) -> -inf if nnan
// maximum(X, +inf) -> +inf if nnan
- if (C->isNegative() == IsMin && (!PropagateNaN || Q.CxtI->hasNoNaNs()))
+ if (C->isNegative() == IsMin && (!PropagateNaN || Call->hasNoNaNs()))
return ConstantFP::get(ReturnType, *C);
// minnum(X, +inf) -> X if nnan
// maxnum(X, -inf) -> X if nnan
// minimum(X, +inf) -> X
// maximum(X, -inf) -> X
- if (C->isNegative() != IsMin && (PropagateNaN || Q.CxtI->hasNoNaNs()))
+ if (C->isNegative() != IsMin && (PropagateNaN || Call->hasNoNaNs()))
return Op0;
}
@@ -6678,10 +6679,10 @@ static Value *simplifyIntrinsic(CallBase *Call, Value *Callee,
}
if (NumOperands == 1)
- return simplifyUnaryIntrinsic(F, Args[0], Q);
+ return simplifyUnaryIntrinsic(F, Args[0], Q, Call);
if (NumOperands == 2)
- return simplifyBinaryIntrinsic(F, Args[0], Args[1], Q);
+ return simplifyBinaryIntrinsic(F, Args[0], Args[1], Q, Call);
// Handle intrinsics with 3 or more arguments.
switch (IID) {