forked from OSchip/llvm-project
[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:
parent
87b0fe075e
commit
53ba88dbb0
|
@ -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
|
||||
|
|
|
@ -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" }
|
||||
|
||||
|
|
Loading…
Reference in New Issue