diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2024-05-15 07:41:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-15 07:41:28 +0200 |
commit | d7bb0723fe79d2b75d41789d2ffadda3567dd94e (patch) | |
tree | 119557db41f1cc00d6d506a9ca4e9c3b0a643733 /llvm/lib/Transforms | |
parent | 0980f715cf7c3d78be6ba64e902bd2dfad3ebc75 (diff) | |
download | llvm-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')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 17 |
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())); } } |