-
Notifications
You must be signed in to change notification settings - Fork 14.1k
[InstCombine] Simplify FMF propagation. NFC. #121899
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Yingwei Zheng (dtcxzyw) ChangesThis patch uses new FMF interfaces introduced by #121657 to simplify existing code with Full diff: https://github.com/llvm/llvm-project/pull/121899.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 37a7c4d88b234d..29fa01ebf003dd 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1699,12 +1699,11 @@ static Instruction *reassociateFCmps(BinaryOperator &BO,
// and (fcmp ord X, 0), (and (fcmp ord Y, 0), Z) --> and (fcmp ord X, Y), Z
// or (fcmp uno X, 0), (or (fcmp uno Y, 0), Z) --> or (fcmp uno X, Y), Z
- Value *NewFCmp = Builder.CreateFCmp(NanPred, X, Y);
- if (auto *NewFCmpInst = dyn_cast<FCmpInst>(NewFCmp)) {
- // Intersect FMF from the 2 source fcmps.
- NewFCmpInst->copyIRFlags(Op0);
- NewFCmpInst->andIRFlags(BO10);
- }
+ // Intersect FMF from the 2 source fcmps.
+ Value *NewFCmp =
+ Builder.CreateFCmpFMF(NanPred, X, Y,
+ cast<Instruction>(Op0)->getFastMathFlags() &
+ cast<Instruction>(BO10)->getFastMathFlags());
return BinaryOperator::Create(Opcode, NewFCmp, BO11);
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 5494c70b34b1ef..49836aa57492cb 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -2500,13 +2500,12 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
default:
llvm_unreachable("unexpected intrinsic ID");
}
- Value *V = Builder.CreateBinaryIntrinsic(
- IID, X, ConstantFP::get(Arg0->getType(), Res), II);
// TODO: Conservatively intersecting FMF. If Res == C2, the transform
// was a simplification (so Arg0 and its original flags could
// propagate?)
- if (auto *CI = dyn_cast<CallInst>(V))
- CI->andIRFlags(M);
+ Value *V = Builder.CreateBinaryIntrinsic(
+ IID, X, ConstantFP::get(Arg0->getType(), Res),
+ II->getFastMathFlags() & M->getFastMathFlags());
return replaceInstUsesWith(*II, V);
}
}
@@ -2601,13 +2600,11 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
case Intrinsic::fmuladd: {
// Try to simplify the underlying FMul.
- if (Value *V = simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
- II->getFastMathFlags(),
- SQ.getWithInstruction(II))) {
- auto *FAdd = BinaryOperator::CreateFAdd(V, II->getArgOperand(2));
- FAdd->copyFastMathFlags(II);
- return FAdd;
- }
+ if (Value *V =
+ simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
+ II->getFastMathFlags(), SQ.getWithInstruction(II)))
+ return BinaryOperator::CreateFAddFMF(V, II->getArgOperand(2),
+ II->getFastMathFlags());
[[fallthrough]];
}
@@ -2634,11 +2631,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// Try to simplify the underlying FMul. We can only apply simplifications
// that do not require rounding.
if (Value *V = simplifyFMAFMul(Src0, Src1, II->getFastMathFlags(),
- SQ.getWithInstruction(II))) {
- auto *FAdd = BinaryOperator::CreateFAdd(V, Src2);
- FAdd->copyFastMathFlags(II);
- return FAdd;
- }
+ SQ.getWithInstruction(II)))
+ return BinaryOperator::CreateFAddFMF(V, Src2, II->getFastMathFlags());
// fma x, y, 0 -> fmul x, y
// This is always valid for -0.0, but requires nsz for +0.0 as
@@ -2733,8 +2727,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
m_CopySign(m_Value(Magnitude), m_Value(Sign)))) {
// fabs (copysign x, y) -> (fabs x)
CallInst *AbsSign =
- Builder.CreateCall(II->getCalledFunction(), {Magnitude});
- AbsSign->copyFastMathFlags(II);
+ Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Magnitude, II);
return replaceInstUsesWith(*II, AbsSign);
}
@@ -2841,16 +2834,15 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
Value *NewLdexp = nullptr;
Value *Select = nullptr;
if (match(SelectRHS, m_ZeroInt())) {
- NewLdexp = Builder.CreateLdexp(Src, SelectLHS);
+ NewLdexp = Builder.CreateLdexp(Src, SelectLHS, II);
Select = Builder.CreateSelect(SelectCond, NewLdexp, Src);
} else if (match(SelectLHS, m_ZeroInt())) {
- NewLdexp = Builder.CreateLdexp(Src, SelectRHS);
+ NewLdexp = Builder.CreateLdexp(Src, SelectRHS, II);
Select = Builder.CreateSelect(SelectCond, Src, NewLdexp);
}
if (NewLdexp) {
Select->takeName(II);
- cast<Instruction>(NewLdexp)->copyFastMathFlags(II);
return replaceInstUsesWith(*II, Select);
}
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
cast<Instruction>(Op0)->getFastMathFlags() & | ||
cast<Instruction>(BO10)->getFastMathFlags()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't looked through InstCombine to know how common the pattern is, but I wonder if it would make sense to give FMFSource a constructor that would let you pass in multiple instructions and have it do the extraction of FMF and and them for you.
…ions (#122059) Address review comment in #121899 (comment)
…wo instructions (#122059) Address review comment in llvm/llvm-project#121899 (comment)
This patch uses new FMF interfaces introduced by #121657 to simplify existing code with
andIRFlags
andcopyFastMathFlags
.