[clang] c37764c - [IRBuilder][NFC] Add `CreateFAbs` helper (#193421)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 22 02:50:23 PDT 2026
Author: Kiva
Date: 2026-04-22T10:50:17+01:00
New Revision: c37764cc00f235bbd18e0ff496dfd2d40e6a64ec
URL: https://github.com/llvm/llvm-project/commit/c37764cc00f235bbd18e0ff496dfd2d40e6a64ec
DIFF: https://github.com/llvm/llvm-project/commit/c37764cc00f235bbd18e0ff496dfd2d40e6a64ec.diff
LOG: [IRBuilder][NFC] Add `CreateFAbs` helper (#193421)
This PR refactors the common logic for creating the `llvm.fabs`
intrinsic into a shared helper.
The refactoring was found while reviewing #192182. As it affects code
beyond the scope of that original change, it is split into a seprate PR
here.
NFC intended.
Added:
Modified:
clang/lib/CodeGen/CGBuiltin.cpp
clang/lib/CodeGen/CGExprComplex.cpp
clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
clang/lib/CodeGen/TargetBuiltins/PPC.cpp
clang/lib/CodeGen/TargetBuiltins/SystemZ.cpp
clang/lib/CodeGen/TargetBuiltins/WebAssembly.cpp
llvm/include/llvm/IR/IRBuilder.h
llvm/lib/CodeGen/ExpandIRInsts.cpp
llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/unittests/IR/IRBuilderTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index d72be84ff4bb1..7a745b6e36138 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -752,8 +752,7 @@ static llvm::Value *emitModfBuiltin(CodeGenFunction &CGF, const CallExpr *E,
/// EmitFAbs - Emit a call to @llvm.fabs().
static Value *EmitFAbs(CodeGenFunction &CGF, Value *V) {
- Function *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType());
- llvm::CallInst *Call = CGF.Builder.CreateCall(F, V);
+ llvm::CallInst *Call = CGF.Builder.CreateFAbs(V);
Call->setDoesNotAccessMemory();
return Call;
}
diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp
index 757663eb50f58..4d98ee9957418 100644
--- a/clang/lib/CodeGen/CGExprComplex.cpp
+++ b/clang/lib/CodeGen/CGExprComplex.cpp
@@ -949,10 +949,7 @@ ComplexPairTy ComplexExprEmitter::EmitAlgebraicDiv(llvm::Value *LHSr,
// EmitFAbs - Emit a call to @llvm.fabs.
static llvm::Value *EmitllvmFAbs(CodeGenFunction &CGF, llvm::Value *Value) {
- llvm::Function *Func =
- CGF.CGM.getIntrinsic(llvm::Intrinsic::fabs, Value->getType());
- llvm::Value *Call = CGF.Builder.CreateCall(Func, Value);
- return Call;
+ return CGF.Builder.CreateFAbs(Value);
}
// EmitRangeReductionDiv - Implements Smith's algorithm for complex division.
diff --git a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
index 423a7a3097119..e2d494103a5c9 100644
--- a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
@@ -1108,8 +1108,7 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID,
return Builder.CreateUnaryIntrinsic(Intrinsic::nvvm_fabs_ftz,
EmitScalarExpr(E->getArg(0)));
case NVPTX::BI__nvvm_fabs_d:
- return Builder.CreateUnaryIntrinsic(Intrinsic::fabs,
- EmitScalarExpr(E->getArg(0)));
+ return Builder.CreateFAbs(EmitScalarExpr(E->getArg(0)));
case NVPTX::BI__nvvm_ex2_approx_d:
case NVPTX::BI__nvvm_ex2_approx_f:
return Builder.CreateUnaryIntrinsic(Intrinsic::nvvm_ex2_approx,
diff --git a/clang/lib/CodeGen/TargetBuiltins/PPC.cpp b/clang/lib/CodeGen/TargetBuiltins/PPC.cpp
index aa92ae29813b9..796efb7a8ad18 100644
--- a/clang/lib/CodeGen/TargetBuiltins/PPC.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/PPC.cpp
@@ -791,10 +791,8 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
// Absolute value
case PPC::BI__builtin_vsx_xvabsdp:
case PPC::BI__builtin_vsx_xvabssp: {
- llvm::Type *ResultType = ConvertType(E->getType());
Value *X = EmitScalarExpr(E->getArg(0));
- llvm::Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
- return Builder.CreateCall(F, X);
+ return Builder.CreateFAbs(X);
}
// Fastmath by default
diff --git a/clang/lib/CodeGen/TargetBuiltins/SystemZ.cpp b/clang/lib/CodeGen/TargetBuiltins/SystemZ.cpp
index a7c25b29d1dba..c33d7581f50b8 100644
--- a/clang/lib/CodeGen/TargetBuiltins/SystemZ.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/SystemZ.cpp
@@ -196,17 +196,13 @@ Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
}
case SystemZ::BI__builtin_s390_vflpsb:
case SystemZ::BI__builtin_s390_vflpdb: {
- llvm::Type *ResultType = ConvertType(E->getType());
Value *X = EmitScalarExpr(E->getArg(0));
- Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
- return Builder.CreateCall(F, X);
+ return Builder.CreateFAbs(X);
}
case SystemZ::BI__builtin_s390_vflnsb:
case SystemZ::BI__builtin_s390_vflndb: {
- llvm::Type *ResultType = ConvertType(E->getType());
Value *X = EmitScalarExpr(E->getArg(0));
- Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
- return Builder.CreateFNeg(Builder.CreateCall(F, X), "neg");
+ return Builder.CreateFNeg(Builder.CreateFAbs(X), "neg");
}
case SystemZ::BI__builtin_s390_vfisb:
case SystemZ::BI__builtin_s390_vfidb: {
diff --git a/clang/lib/CodeGen/TargetBuiltins/WebAssembly.cpp b/clang/lib/CodeGen/TargetBuiltins/WebAssembly.cpp
index edaba6e5998fc..e7bdb91d49ce8 100644
--- a/clang/lib/CodeGen/TargetBuiltins/WebAssembly.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/WebAssembly.cpp
@@ -372,8 +372,7 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
case WebAssembly::BI__builtin_wasm_abs_f32x4:
case WebAssembly::BI__builtin_wasm_abs_f64x2: {
Value *Vec = EmitScalarExpr(E->getArg(0));
- Function *Callee = CGM.getIntrinsic(Intrinsic::fabs, Vec->getType());
- return Builder.CreateCall(Callee, {Vec});
+ return Builder.CreateFAbs(Vec);
}
case WebAssembly::BI__builtin_wasm_sqrt_f16x8:
case WebAssembly::BI__builtin_wasm_sqrt_f32x4:
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index c55559516802e..a48e9ebe178b9 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -1043,6 +1043,12 @@ class IRBuilderBase {
return CreateIntrinsic(ID, /*Types=*/{}, Args, FMFSource, Name);
}
+ /// Create call to the fabs intrinsic.
+ CallInst *CreateFAbs(Value *V, FMFSource FMFSource = {},
+ const Twine &Name = "") {
+ return CreateUnaryIntrinsic(Intrinsic::fabs, V, FMFSource, Name);
+ }
+
/// Create call to the minnum intrinsic.
Value *CreateMinNum(Value *LHS, Value *RHS, FMFSource FMFSource = {},
const Twine &Name = "") {
diff --git a/llvm/lib/CodeGen/ExpandIRInsts.cpp b/llvm/lib/CodeGen/ExpandIRInsts.cpp
index d8a856d00ae3b..e18f556208ab6 100644
--- a/llvm/lib/CodeGen/ExpandIRInsts.cpp
+++ b/llvm/lib/CodeGen/ExpandIRInsts.cpp
@@ -429,8 +429,7 @@ class FRemExpander {
Value *XFinite =
NoInfs || (SQ && isKnownNeverInfinity(X, *SQ))
? B.getTrue()
- : B.CreateFCmpULT(B.CreateUnaryIntrinsic(Intrinsic::fabs, X),
- ConstantFP::getInfinity(FremTy));
+ : B.CreateFCmpULT(B.CreateFAbs(X), ConstantFP::getInfinity(FremTy));
Ret = B.CreateSelect(XFinite, Ret, Nan);
return Ret;
@@ -465,8 +464,8 @@ Value *FRemExpander::buildFRem(Value *X, Value *Y,
// { ret = x or 0 with sign of x }
// Adjust ret to NaN/inf in input
// return ret
- Value *Ax = B.CreateUnaryIntrinsic(Intrinsic::fabs, X, {}, "ax");
- Value *Ay = B.CreateUnaryIntrinsic(Intrinsic::fabs, Y, {}, "ay");
+ Value *Ax = B.CreateFAbs(X, {}, "ax");
+ Value *Ay = B.CreateFAbs(Y, {}, "ay");
if (ComputeFpTy != X->getType()) {
Ax = B.CreateFPExt(Ax, ComputeFpTy, "ax");
Ay = B.CreateFPExt(Ay, ComputeFpTy, "ay");
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
index d049df810c476..915d2116bd268 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
@@ -1129,10 +1129,10 @@ Value *AMDGPUCodeGenPrepareImpl::expandDivRem24Impl(
: Builder.CreateFPToUI(FQ, I32Ty);
// fr = fabs(fr);
- FR = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, FR, FQ);
+ FR = Builder.CreateFAbs(FR, FQ);
// fb = fabs(fb);
- FB = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, FB, FQ);
+ FB = Builder.CreateFAbs(FB, FQ);
// int cv = fr >= fb;
Value *CV = Builder.CreateFCmpOGE(FR, FB);
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp b/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp
index a26ad67458359..dd4650245ca77 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp
@@ -1084,7 +1084,7 @@ bool AMDGPULibCalls::fold_pow(FPMathOperator *FPOp, IRBuilder<> &B,
Value *nval;
if (needabs) {
- nval = B.CreateUnaryIntrinsic(Intrinsic::fabs, opr0, nullptr, "__fabs");
+ nval = B.CreateFAbs(opr0, nullptr, "__fabs");
} else {
nval = cnval ? cnval : opr0;
}
@@ -1259,13 +1259,13 @@ static Value *emitIsOddInteger(IRBuilder<> &B, Value *Y) {
// isinf(val) => fabs(val) == +inf
static Value *emitIsInf(IRBuilder<> &B, Value *val) {
- auto *fabsVal = B.CreateUnaryIntrinsic(Intrinsic::fabs, val);
+ auto *fabsVal = B.CreateFAbs(val);
return B.CreateFCmpOEQ(fabsVal, ConstantFP::getInfinity(val->getType()));
}
// y * log2(fabs(x))
static Value *emitFastExpYLnx(IRBuilder<> &B, Value *X, Value *Y) {
- Value *AbsX = B.CreateUnaryIntrinsic(Intrinsic::fabs, X);
+ Value *AbsX = B.CreateFAbs(X);
Value *LogAbsX = B.CreateUnaryIntrinsic(Intrinsic::log2, AbsX);
Value *YTimesLogX = B.CreateFMul(Y, LogAbsX);
return B.CreateUnaryIntrinsic(Intrinsic::exp2, YTimesLogX);
@@ -1304,10 +1304,10 @@ static Value *emitPowFixup(IRBuilder<> &B, Value *X, Value *Y, Value *ExpYLnX,
// mixed sign constant infinities.
Value *YIsInf = emitIsInf(B, Y);
- Value *AY = B.CreateUnaryIntrinsic(Intrinsic::fabs, Y);
+ Value *AY = B.CreateFAbs(Y);
Value *YIsNegInf = B.CreateFCmpUNE(Y, AY);
- Value *AX = B.CreateUnaryIntrinsic(Intrinsic::fabs, X);
+ Value *AX = B.CreateFAbs(X);
Value *AxEqOne = B.CreateFCmpOEQ(AX, One);
Value *AxLtOne = B.CreateFCmpOLT(AX, One);
Value *XorCond = B.CreateXor(AxLtOne, YIsNegInf);
@@ -1368,7 +1368,7 @@ static Value *emitPowFixup(IRBuilder<> &B, Value *X, Value *Y, Value *ExpYLnX,
Value *Ret = B.CreateCopySign(ExpYLnX, SelSign);
// if (isinf(x) || x == 0.0f)
- Value *FabsX = B.CreateUnaryIntrinsic(Intrinsic::fabs, X);
+ Value *FabsX = B.CreateFAbs(X);
Value *XIsInf = B.CreateFCmpOEQ(FabsX, PInf);
Value *XEqZero = B.CreateFCmpOEQ(X, Zero);
Value *InfOrZero = B.CreateOr(XIsInf, XEqZero);
@@ -1396,7 +1396,7 @@ static Value *emitPowFixup(IRBuilder<> &B, Value *X, Value *Y, Value *ExpYLnX,
Value *Ret = B.CreateCopySign(ExpYLnX, SelSign);
// if (isinf(x) || x == 0.0f)
- Value *FabsX = B.CreateUnaryIntrinsic(Intrinsic::fabs, X);
+ Value *FabsX = B.CreateFAbs(X);
Value *IsInfX = B.CreateFCmpOEQ(FabsX, PInf);
Value *XEqZero = B.CreateFCmpOEQ(X, Zero);
Value *CondInfOrZero = B.CreateOr(IsInfX, XEqZero);
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 02aa1b381e15f..d81ed56290476 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1558,8 +1558,7 @@ Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS,
if (!IsLogicalSelect)
NewFlag |= RHS->getFastMathFlags();
- Value *FAbs =
- Builder.CreateUnaryIntrinsic(Intrinsic::fabs, LHS0, NewFlag);
+ Value *FAbs = Builder.CreateFAbs(LHS0, NewFlag);
return Builder.CreateFCmpFMF(
PredL, FAbs, ConstantFP::get(LHS0->getType(), *LHSC), NewFlag);
}
@@ -2692,7 +2691,7 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
Type *EltTy = CastOp->getType()->getScalarType();
if (EltTy->isFloatingPointTy() &&
APFloat::hasSignBitInMSB(EltTy->getFltSemantics())) {
- Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
+ Value *FAbs = Builder.CreateFAbs(CastOp);
return new BitCastInst(FAbs, I.getType());
}
}
@@ -4638,7 +4637,7 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
Type *EltTy = CastOp->getType()->getScalarType();
if (EltTy->isFloatingPointTy() &&
APFloat::hasSignBitInMSB(EltTy->getFltSemantics())) {
- Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
+ Value *FAbs = Builder.CreateFAbs(CastOp);
Value *FNegFAbs = Builder.CreateFNeg(FAbs);
return new BitCastInst(FNegFAbs, I.getType());
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index d97c66025cee7..131982ad7c1d2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1084,7 +1084,7 @@ Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) {
if (OrderedInvertedMask == fcInf)
Pred = IsUnordered ? FCmpInst::FCMP_UNE : FCmpInst::FCMP_ONE;
- Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Src0);
+ Value *Fabs = Builder.CreateFAbs(Src0);
Value *CmpInf = Builder.CreateFCmp(Pred, Fabs, Inf);
CmpInf->takeName(&II);
return replaceInstUsesWith(II, CmpInf);
@@ -2938,7 +2938,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
};
if (IsMinMaxOrXNegX(Arg0, Arg1) || IsMinMaxOrXNegX(Arg1, Arg0)) {
- Value *R = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, II);
+ Value *R = Builder.CreateFAbs(X, II);
if (IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
IID == Intrinsic::minimumnum)
R = Builder.CreateFNegFMF(R, II);
@@ -3060,13 +3060,13 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
if (*KnownSignBit) {
// If we know that the sign argument is negative, reduce to FNABS:
// copysign Mag, -Sign --> fneg (fabs Mag)
- Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Mag, II);
+ Value *Fabs = Builder.CreateFAbs(Mag, II);
return replaceInstUsesWith(*II, Builder.CreateFNegFMF(Fabs, II));
}
// If we know that the sign argument is positive, reduce to FABS:
// copysign Mag, +Sign --> fabs Mag
- Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Mag, II);
+ Value *Fabs = Builder.CreateFAbs(Mag, II);
return replaceInstUsesWith(*II, Fabs);
}
@@ -3117,8 +3117,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
Value *X;
// fabs (-X) --> fabs (X)
if (match(Arg, m_FNeg(m_Value(X)))) {
- CallInst *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, II);
- return replaceInstUsesWith(CI, Fabs);
+ CallInst *Fabs = Builder.CreateFAbs(X, II);
+ return replaceInstUsesWith(CI, Fabs);
}
if (match(Arg, m_Select(m_Value(Cond), m_Value(TVal), m_Value(FVal)))) {
@@ -3147,8 +3147,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
if (match(II->getArgOperand(0),
m_CopySign(m_Value(Magnitude), m_Value(Sign)))) {
// fabs (copysign x, y) -> (fabs x)
- CallInst *AbsSign =
- Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Magnitude, II);
+ CallInst *AbsSign = Builder.CreateFAbs(Magnitude, II);
return replaceInstUsesWith(*II, AbsSign);
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index 80b8bd27b7086..384f38b2c5362 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -624,8 +624,7 @@ Instruction *InstCombinerImpl::foldFPSignBitOps(BinaryOperator &I) {
if (match(Op0, m_FAbs(m_Value(X))) && match(Op1, m_FAbs(m_Value(Y))) &&
(Op0->hasOneUse() || Op1->hasOneUse())) {
Value *XY = Builder.CreateBinOpFMF(Opcode, X, Y, &I);
- Value *Fabs =
- Builder.CreateUnaryIntrinsic(Intrinsic::fabs, XY, &I, I.getName());
+ Value *Fabs = Builder.CreateFAbs(XY, &I, I.getName());
return replaceInstUsesWith(I, Fabs);
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index bffc887d93535..82954ee6f2457 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -3245,11 +3245,11 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
isKnownNeverNaN(X, IC.getSimplifyQuery().getWithInstruction(
cast<Instruction>(CondVal))))) {
if (!Swap && (Pred == FCmpInst::FCMP_OLE || Pred == FCmpInst::FCMP_ULE)) {
- Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
+ Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
return IC.replaceInstUsesWith(SI, Fabs);
}
if (Swap && (Pred == FCmpInst::FCMP_OGT || Pred == FCmpInst::FCMP_UGT)) {
- Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
+ Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
return IC.replaceInstUsesWith(SI, Fabs);
}
}
@@ -3303,11 +3303,11 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
Pred == FCmpInst::FCMP_UGT || Pred == FCmpInst::FCMP_UGE;
if (IsLTOrLE) {
- Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
+ Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
return IC.replaceInstUsesWith(SI, Fabs);
}
if (IsGTOrGE) {
- Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
+ Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
Instruction *NewFNeg = UnaryOperator::CreateFNeg(Fabs);
NewFNeg->setFastMathFlags(SI.getFastMathFlags());
return NewFNeg;
@@ -3338,7 +3338,7 @@ static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI,
// Fold (IsNeg ? -X : X) or (!IsNeg ? X : -X) to fabs(X)
// Fold (IsNeg ? X : -X) or (!IsNeg ? -X : X) to -fabs(X)
- Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI);
+ Value *Fabs = IC.Builder.CreateFAbs(X, &SI);
if (Swap != TrueIfSigned)
return IC.replaceInstUsesWith(SI, Fabs);
return UnaryOperator::CreateFNegFMF(Fabs, &SI);
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 28cfa55b968dc..26d77dabdfd0b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2536,7 +2536,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
// Note: Dropping canonicalize.
IRBuilderBase::InsertPointGuard Guard(Builder);
Builder.SetInsertPoint(I);
- Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, FMF);
+ Value *Fabs = Builder.CreateFAbs(X, FMF);
Fabs->takeName(I);
return Fabs;
}
@@ -2665,8 +2665,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
Value *IsZeroOrNan = Builder.CreateFCmpFMF(
FCmpInst::FCMP_UEQ, I->getOperand(0), ConstantFP::getZero(VTy), FMF);
- Value *Fabs =
- Builder.CreateUnaryIntrinsic(Intrinsic::fabs, I->getOperand(0), FMF);
+ Value *Fabs = Builder.CreateFAbs(I->getOperand(0), FMF);
Value *IsInfOrNan = Builder.CreateFCmpFMF(
FCmpInst::FCMP_UEQ, Fabs, ConstantFP::getInfinity(VTy), FMF);
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 80d354ccaa826..6bd250aecd977 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2080,8 +2080,7 @@ Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) {
}
if (AbsOp)
- return copyFlags(
- *CI, B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, CI, "cabs"));
+ return copyFlags(*CI, B.CreateFAbs(AbsOp, CI, "cabs"));
if (!CI->isFast())
return nullptr;
@@ -2343,7 +2342,7 @@ Value *LibCallSimplifier::replacePowWithSqrt(CallInst *Pow, IRBuilderBase &B) {
// Handle signed zero base by expanding to fabs(sqrt(x)).
if (!Pow->hasNoSignedZeros())
- Sqrt = B.CreateUnaryIntrinsic(Intrinsic::fabs, Sqrt, nullptr, "abs");
+ Sqrt = B.CreateFAbs(Sqrt, nullptr, "abs");
Sqrt = copyFlags(*Pow, Sqrt);
@@ -2840,8 +2839,7 @@ Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) {
// If we found a repeated factor, hoist it out of the square root and
// replace it with the fabs of that factor.
- Value *FabsCall =
- B.CreateUnaryIntrinsic(Intrinsic::fabs, RepeatOp, I, "fabs");
+ Value *FabsCall = B.CreateFAbs(RepeatOp, I, "fabs");
if (OtherOp) {
// If we found a non-repeated factor, we still need to get its square
// root. We then multiply that by the value that was simplified out
diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp
index 8c4daf56bbfa4..b4f1c97f03aca 100644
--- a/llvm/unittests/IR/IRBuilderTest.cpp
+++ b/llvm/unittests/IR/IRBuilderTest.cpp
@@ -105,6 +105,18 @@ TEST_F(IRBuilderTest, Intrinsics) {
EXPECT_TRUE(II->hasNoInfs());
EXPECT_FALSE(II->hasNoNaNs());
+ Result = Builder.CreateFAbs(V);
+ II = cast<IntrinsicInst>(Result);
+ EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs);
+ EXPECT_FALSE(II->hasNoInfs());
+ EXPECT_FALSE(II->hasNoNaNs());
+
+ Result = Builder.CreateFAbs(V, I);
+ II = cast<IntrinsicInst>(Result);
+ EXPECT_EQ(II->getIntrinsicID(), Intrinsic::fabs);
+ EXPECT_TRUE(II->hasNoInfs());
+ EXPECT_FALSE(II->hasNoNaNs());
+
Result = Builder.CreateBinaryIntrinsic(Intrinsic::pow, V, V);
II = cast<IntrinsicInst>(Result);
EXPECT_EQ(II->getIntrinsicID(), Intrinsic::pow);
More information about the cfe-commits
mailing list