[llvm] [IRBuilder] Add a helper function to intersect FMFs from two instructions (PR #122059)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 7 22:59:44 PST 2025
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/122059
Address review comment in https://github.com/llvm/llvm-project/pull/121899#discussion_r1905765776
>From 4c696e912f989582d569f435e33be0e859c731b8 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 8 Jan 2025 14:38:22 +0800
Subject: [PATCH] [IRBuilder] Add a helper function to intersect FMFs from two
instructions
---
llvm/include/llvm/IR/IRBuilder.h | 5 +++++
.../Transforms/InstCombine/InstCombineAndOrXor.cpp | 12 +++++-------
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 5 ++---
3 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index b73309175f20d1..0332a6cc2e76ea 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -102,6 +102,11 @@ class FMFSource {
FastMathFlags get(FastMathFlags Default) const {
return FMF.value_or(Default);
}
+ /// Intersect the FMF from two instructions.
+ static FMFSource intersect(Value *A, Value *B) {
+ return FMFSource(cast<FPMathOperator>(A)->getFastMathFlags() &
+ cast<FPMathOperator>(B)->getFastMathFlags());
+ }
};
/// Common base class shared among various IRBuilders.
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 37a7c4d88b234d..051c00652fe337 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -39,8 +39,7 @@ static Value *getNewICmpValue(unsigned Code, bool Sign, Value *LHS, Value *RHS,
/// This is the complement of getFCmpCode, which turns an opcode and two
/// operands into either a FCmp instruction, or a true/false constant.
static Value *getFCmpValue(unsigned Code, Value *LHS, Value *RHS,
- InstCombiner::BuilderTy &Builder,
- FastMathFlags FMF) {
+ InstCombiner::BuilderTy &Builder, FMFSource FMF) {
FCmpInst::Predicate NewPred;
if (Constant *TorF = getPredForFCmpCode(Code, LHS->getType(), NewPred))
return TorF;
@@ -1431,8 +1430,7 @@ static Value *matchIsFiniteTest(InstCombiner::BuilderTy &Builder, FCmpInst *LHS,
return nullptr;
return Builder.CreateFCmpFMF(FCmpInst::getOrderedPredicate(PredR), RHS0, RHS1,
- LHS->getFastMathFlags() &
- RHS->getFastMathFlags());
+ FMFSource::intersect(LHS, RHS));
}
Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS,
@@ -1469,7 +1467,7 @@ Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS,
// Intersect the fast math flags.
// TODO: We can union the fast math flags unless this is a logical select.
return getFCmpValue(NewPred, LHS0, LHS1, Builder,
- LHS->getFastMathFlags() & RHS->getFastMathFlags());
+ FMFSource::intersect(LHS, RHS));
}
// This transform is not valid for a logical select.
@@ -1486,8 +1484,8 @@ Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS,
// Ignore the constants because they are obviously not NANs:
// (fcmp ord x, 0.0) & (fcmp ord y, 0.0) -> (fcmp ord x, y)
// (fcmp uno x, 0.0) | (fcmp uno y, 0.0) -> (fcmp uno x, y)
- return Builder.CreateFCmpFMF(
- PredL, LHS0, RHS0, LHS->getFastMathFlags() & RHS->getFastMathFlags());
+ return Builder.CreateFCmpFMF(PredL, LHS0, RHS0,
+ FMFSource::intersect(LHS, RHS));
}
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 5494c70b34b1ef..c55c40c88bc845 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -2674,9 +2674,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// copysign Mag, (copysign ?, X) --> copysign Mag, X
Value *X;
if (match(Sign, m_Intrinsic<Intrinsic::copysign>(m_Value(), m_Value(X)))) {
- Value *CopySign = Builder.CreateCopySign(
- Mag, X,
- II->getFastMathFlags() & cast<Instruction>(Sign)->getFastMathFlags());
+ Value *CopySign =
+ Builder.CreateCopySign(Mag, X, FMFSource::intersect(II, Sign));
return replaceInstUsesWith(*II, CopySign);
}
More information about the llvm-commits
mailing list