[LibCallSimplifier] use instruction-level fast-math-flags to transform pow(x, 0.5) calls

Also, propagate the FMF to the newly created sqrt() call.

llvm-svn: 257503
This commit is contained in:
Sanjay Patel 2016-01-12 19:06:35 +00:00
parent 87b0fe075e
commit 53ba88dbb0
2 changed files with 10 additions and 9 deletions

View File

@ -1164,9 +1164,12 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
LibFunc::fabsl)) {
// In -ffast-math, pow(x, 0.5) -> sqrt(x).
if (UnsafeFPMath)
if (CI->hasUnsafeAlgebra()) {
IRBuilder<>::FastMathFlagGuard Guard(B);
B.setFastMathFlags(CI->getFastMathFlags());
return EmitUnaryFloatFnCall(Op1, TLI->getName(LibFunc::sqrt), B,
Callee->getAttributes());
}
// Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))).
// This is faster than calling pow, and still handles negative zero

View File

@ -1,15 +1,13 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
define double @mypow(double %x) #0 {
entry:
%pow = call double @llvm.pow.f64(double %x, double 5.000000e-01)
define double @pow_half(double %x) {
%pow = call fast double @llvm.pow.f64(double %x, double 5.000000e-01)
ret double %pow
}
; CHECK-LABEL: define double @mypow(
; CHECK: %sqrt = call double @sqrt(double %x) #1
; CHECK: ret double %sqrt
; CHECK: }
; CHECK-LABEL: define double @pow_half(
; CHECK-NEXT: %sqrt = call fast double @sqrt(double %x)
; CHECK-NEXT: ret double %sqrt
declare double @llvm.pow.f64(double, double)
attributes #0 = { "unsafe-fp-math"="true" }