[LibCallSimplifier] propagate FMF when shrinking binary calls

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256682 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sanjay Patel 2015-12-31 23:40:59 +00:00
parent 31e470b254
commit e193ff319c
2 changed files with 20 additions and 0 deletions

View File

@ -1033,6 +1033,10 @@ Value *LibCallSimplifier::optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B) {
if (V2 == nullptr)
return nullptr;
// Propagate fast-math flags from the existing call to the new call.
IRBuilder<>::FastMathFlagGuard Guard(B);
B.SetFastMathFlags(CI->getFastMathFlags());
// fmin((double)floatval1, (double)floatval2)
// -> (double)fminf(floatval1, floatval2)
// TODO: Handle intrinsics in the same way as in optimizeUnaryDoubleFP().

View File

@ -350,6 +350,22 @@ define double @tanh_test2(float %f) {
; CHECK: call fast double @tanh(double %conv)
}
; 'arcp' on an fmax() is meaningless. This test just proves that
; flags are propagated for shrunken *binary* double FP calls.
define float @max1(float %a, float %b) {
%c = fpext float %a to double
%d = fpext float %b to double
%e = call arcp double @fmax(double %c, double %d)
%f = fptrunc double %e to float
ret float %f
; CHECK-LABEL: max1(
; CHECK-NEXT: call arcp float @fmaxf(float %a, float %b)
; CHECK-NEXT: ret
}
declare double @fmax(double, double)
declare double @tanh(double) #1
declare double @tan(double) #1