[llvm] 78056e2 - [InstCombine] propagate FMF in exp2->ldexp fold
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 10 07:03:56 PST 2023
Author: Sanjay Patel
Date: 2023-02-10T10:02:25-05:00
New Revision: 78056e2f2d9510d2ace42fe7e9eb60e5abe8a3e7
URL: https://github.com/llvm/llvm-project/commit/78056e2f2d9510d2ace42fe7e9eb60e5abe8a3e7
DIFF: https://github.com/llvm/llvm-project/commit/78056e2f2d9510d2ace42fe7e9eb60e5abe8a3e7.diff
LOG: [InstCombine] propagate FMF in exp2->ldexp fold
Added:
Modified:
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/test/Transforms/InstCombine/exp2-1.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index a1ed93622f73..746f61f4796a 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2226,15 +2226,17 @@ Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) {
// exp2(sitofp(x)) -> ldexp(1.0, sext(x)) if sizeof(x) <= IntSize
// exp2(uitofp(x)) -> ldexp(1.0, zext(x)) if sizeof(x) < IntSize
- // TODO: This does not propagate FMF.
Value *Op = CI->getArgOperand(0);
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()))
+ if (Value *Exp = getIntToFPVal(Op, B, TLI->getIntSize())) {
+ 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 Ret;
diff --git a/llvm/test/Transforms/InstCombine/exp2-1.ll b/llvm/test/Transforms/InstCombine/exp2-1.ll
index c441073a4025..79aeded2fa5c 100644
--- a/llvm/test/Transforms/InstCombine/exp2-1.ll
+++ b/llvm/test/Transforms/InstCombine/exp2-1.ll
@@ -275,17 +275,15 @@ define float @test_simplify10(i8 zeroext %x) {
ret float %ret
}
-; TODO: FMF could be propagated when transforming.
-
define float @sitofp_scalar_intrinsic_with_FMF(i8 %x) {
; LDEXP32-LABEL: @sitofp_scalar_intrinsic_with_FMF(
; LDEXP32-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i32
-; LDEXP32-NEXT: [[LDEXPF:%.*]] = tail call float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
+; LDEXP32-NEXT: [[LDEXPF:%.*]] = tail call nnan float @ldexpf(float 1.000000e+00, i32 [[TMP1]])
; LDEXP32-NEXT: ret float [[LDEXPF]]
;
; LDEXP16-LABEL: @sitofp_scalar_intrinsic_with_FMF(
; LDEXP16-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i16
-; LDEXP16-NEXT: [[LDEXPF:%.*]] = tail call float @ldexpf(float 1.000000e+00, i16 [[TMP1]])
+; LDEXP16-NEXT: [[LDEXPF:%.*]] = tail call nnan float @ldexpf(float 1.000000e+00, i16 [[TMP1]])
; LDEXP16-NEXT: ret float [[LDEXPF]]
;
; NOLDEXPF-LABEL: @sitofp_scalar_intrinsic_with_FMF(
More information about the llvm-commits
mailing list