[llvm] [InstCombine] Simplify FMF propagation. NFC. (PR #121899)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 7 00:34:12 PST 2025
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/121899
This patch uses new FMF interfaces introduced by https://github.com/llvm/llvm-project/pull/121657 to simplify existing code with `andIRFlags` and `copyFastMathFlags`.
>From eaa7a0df2257705e13b47c28719d03ee2dc517e4 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 7 Jan 2025 16:30:09 +0800
Subject: [PATCH] [InstCombine] Simplify FMF propagation. NFC.
---
.../InstCombine/InstCombineAndOrXor.cpp | 11 +++---
.../InstCombine/InstCombineCalls.cpp | 34 +++++++------------
2 files changed, 18 insertions(+), 27 deletions(-)
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);
}
}
More information about the llvm-commits
mailing list