From: Davide Italiano Date: Tue, 10 Jan 2017 18:02:05 +0000 (+0000) Subject: [SimplifyLibCalls] Propagate fast math flags while optimizing pow(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b614cd308de0d0f485edda290ac0a49fbb356eff;p=llvm [SimplifyLibCalls] Propagate fast math flags while optimizing pow(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291577 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp index 5237ce5b399..8eaeb1073a7 100644 --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -1139,6 +1139,10 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) { !V.isInteger()) return nullptr; + // Propagate fast math flags. + IRBuilder<>::FastMathFlagGuard Guard(B); + B.setFastMathFlags(CI->getFastMathFlags()); + // We will memoize intermediate products of the Addition Chain. Value *InnerChain[33] = {nullptr}; InnerChain[1] = Op1; @@ -1149,7 +1153,6 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) { bool ignored; V.convert(APFloat::IEEEdouble(), APFloat::rmTowardZero, &ignored); - // TODO: Should the new instructions propagate the 'fast' flag of the pow()? Value *FMul = getPow(InnerChain, V.convertToDouble(), B); // For negative exponents simply compute the reciprocal. if (Op2C->isNegative()) diff --git a/test/Transforms/InstCombine/pow-4.ll b/test/Transforms/InstCombine/pow-4.ll index 911ab4d94c6..9293f14cb10 100644 --- a/test/Transforms/InstCombine/pow-4.ll +++ b/test/Transforms/InstCombine/pow-4.ll @@ -10,8 +10,8 @@ declare float @llvm.pow.f32(float, float) define float @test_simplify_4f(float %x) { ; CHECK-LABEL: @test_simplify_4f( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul float %x, %x -; CHECK-NEXT: %2 = fmul float %1, %1 +; CHECK-NEXT: %1 = fmul fast float %x, %x +; CHECK-NEXT: %2 = fmul fast float %1, %1 ; CHECK-NEXT: ret float %2 %1 = call fast float @llvm.pow.f32(float %x, float 4.000000e+00) ret float %1 @@ -21,8 +21,8 @@ define float @test_simplify_4f(float %x) { define double @test_simplify_3(double %x) { ; CHECK-LABEL: @test_simplify_3( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %x +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %x ; CHECK-NEXT: ret double %2 %1 = call fast double @llvm.pow.f64(double %x, double 3.000000e+00) ret double %1 @@ -32,8 +32,8 @@ define double @test_simplify_3(double %x) { define double @test_simplify_4(double %x) { ; CHECK-LABEL: @test_simplify_4( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %1 +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %1 ; CHECK-NEXT: ret double %2 %1 = call fast double @llvm.pow.f64(double %x, double 4.000000e+00) ret double %1 @@ -43,11 +43,11 @@ define double @test_simplify_4(double %x) { define double @test_simplify_15(double %x) { ; CHECK-LABEL: @test_simplify_15( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %x -; CHECK-NEXT: %3 = fmul double %2, %2 -; CHECK-NEXT: %4 = fmul double %3, %3 -; CHECK-NEXT: %5 = fmul double %2, %4 +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %x +; CHECK-NEXT: %3 = fmul fast double %2, %2 +; CHECK-NEXT: %4 = fmul fast double %3, %3 +; CHECK-NEXT: %5 = fmul fast double %2, %4 ; CHECK-NEXT: ret double %5 %1 = call fast double @llvm.pow.f64(double %x, double 1.500000e+01) ret double %1 @@ -57,11 +57,11 @@ define double @test_simplify_15(double %x) { define double @test_simplify_neg_7(double %x) { ; CHECK-LABEL: @test_simplify_neg_7( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %x -; CHECK-NEXT: %3 = fmul double %1, %2 -; CHECK-NEXT: %4 = fmul double %1, %3 -; CHECK-NEXT: %5 = fdiv double 1.000000e+00, %4 +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %1 +; CHECK-NEXT: %3 = fmul fast double %2, %x +; CHECK-NEXT: %4 = fmul fast double %1, %3 +; CHECK-NEXT: %5 = fdiv fast double 1.000000e+00, %4 ; CHECK-NEXT: ret double %5 %1 = call fast double @llvm.pow.f64(double %x, double -7.000000e+00) ret double %1 @@ -71,13 +71,13 @@ define double @test_simplify_neg_7(double %x) { define double @test_simplify_neg_19(double %x) { ; CHECK-LABEL: @test_simplify_neg_19( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %1 -; CHECK-NEXT: %3 = fmul double %2, %2 -; CHECK-NEXT: %4 = fmul double %3, %3 -; CHECK-NEXT: %5 = fmul double %1, %4 -; CHECK-NEXT: %6 = fmul double %5, %x -; CHECK-NEXT: %7 = fdiv double 1.000000e+00, %6 +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %1 +; CHECK-NEXT: %3 = fmul fast double %2, %2 +; CHECK-NEXT: %4 = fmul fast double %3, %3 +; CHECK-NEXT: %5 = fmul fast double %1, %4 +; CHECK-NEXT: %6 = fmul fast double %5, %x +; CHECK-NEXT: %7 = fdiv fast double 1.000000e+00, %6 ; CHECK-NEXT: ret double %7 %1 = call fast double @llvm.pow.f64(double %x, double -1.900000e+01) ret double %1 @@ -97,11 +97,11 @@ define double @test_simplify_11_23(double %x) { define double @test_simplify_32(double %x) { ; CHECK-LABEL: @test_simplify_32( ; CHECK-NOT: pow -; CHECK-NEXT: %1 = fmul double %x, %x -; CHECK-NEXT: %2 = fmul double %1, %1 -; CHECK-NEXT: %3 = fmul double %2, %2 -; CHECK-NEXT: %4 = fmul double %3, %3 -; CHECK-NEXT: %5 = fmul double %4, %4 +; CHECK-NEXT: %1 = fmul fast double %x, %x +; CHECK-NEXT: %2 = fmul fast double %1, %1 +; CHECK-NEXT: %3 = fmul fast double %2, %2 +; CHECK-NEXT: %4 = fmul fast double %3, %3 +; CHECK-NEXT: %5 = fmul fast double %4, %4 ; CHECK-NEXT: ret double %5 %1 = call fast double @llvm.pow.f64(double %x, double 3.200000e+01) ret double %1