aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2024-05-15 07:41:28 +0200
committerGitHub <noreply@github.com>2024-05-15 07:41:28 +0200
commitd7bb0723fe79d2b75d41789d2ffadda3567dd94e (patch)
tree119557db41f1cc00d6d506a9ca4e9c3b0a643733 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
parent0980f715cf7c3d78be6ba64e902bd2dfad3ebc75 (diff)
downloadllvm-d7bb0723fe79d2b75d41789d2ffadda3567dd94e.zip
llvm-d7bb0723fe79d2b75d41789d2ffadda3567dd94e.tar.gz
llvm-d7bb0723fe79d2b75d41789d2ffadda3567dd94e.tar.bz2
InstCombine: Emit ldexp intrinsic in exp2->ldexp combine (#92039)
Prefer to emit the intrinsic over a libcall in the intrinsic or no-math-errno case.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 174cc7a..9cb8e20 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2389,12 +2389,21 @@ Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) {
if ((isa<SIToFPInst>(Op) || isa<UIToFPInst>(Op)) &&
hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl)) {
if (Value *Exp = getIntToFPVal(Op, B, TLI->getIntSize())) {
+ Constant *One = ConstantFP::get(Ty, 1.0);
+
+ // TODO: Emitting the intrinsic should not depend on whether the libcall
+ // is available.
+ if (CI->doesNotAccessMemory()) {
+ return copyFlags(*CI, B.CreateIntrinsic(Intrinsic::ldexp,
+ {Ty, Exp->getType()},
+ {One, Exp}, CI));
+ }
+
IRBuilderBase::FastMathFlagGuard Guard(B);
B.setFastMathFlags(CI->getFastMathFlags());
- return copyFlags(
- *CI, emitBinaryFloatFnCall(ConstantFP::get(Ty, 1.0), Exp, TLI,
- LibFunc_ldexp, LibFunc_ldexpf,
- LibFunc_ldexpl, B, AttributeList()));
+ return copyFlags(*CI, emitBinaryFloatFnCall(
+ One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
+ LibFunc_ldexpl, B, AttributeList()));
}
}