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

See also:
http://reviews.llvm.org/rL255555
http://reviews.llvm.org/rL256871
http://reviews.llvm.org/rL256964
http://reviews.llvm.org/rL257400
http://reviews.llvm.org/rL257404
http://reviews.llvm.org/rL257414

llvm-svn: 257491
diff --git a/llvm/test/Transforms/InstCombine/pow-exp.ll b/llvm/test/Transforms/InstCombine/pow-exp.ll
index f1b4a3a..594594a 100644
--- a/llvm/test/Transforms/InstCombine/pow-exp.ll
+++ b/llvm/test/Transforms/InstCombine/pow-exp.ll
@@ -1,7 +1,7 @@
 ; RUN: opt < %s -instcombine -S | FileCheck %s
 
-define double @pow_exp(double %x, double %y) #0 {
-  %call = call fast double @exp(double %x) #0
+define double @pow_exp(double %x, double %y) {
+  %call = call fast double @exp(double %x) nounwind readnone
   %pow = call fast double @llvm.pow.f64(double %call, double %y)
   ret double %pow
 }
@@ -11,8 +11,8 @@
 ; CHECK-NEXT:  %exp = call fast double @exp(double %mul)
 ; CHECK-NEXT:  ret double %exp
 
-define double @pow_exp2(double %x, double %y) #0 {
-  %call = call fast double @exp2(double %x) #0
+define double @pow_exp2(double %x, double %y) {
+  %call = call fast double @exp2(double %x) nounwind readnone
   %pow = call fast double @llvm.pow.f64(double %call, double %y)
   ret double %pow
 }
@@ -22,8 +22,7 @@
 ; CHECK-NEXT:  %exp2 = call fast double @exp2(double %mul)
 ; CHECK-NEXT:  ret double %exp2
 
-; FIXME: This should not be transformed because the 'exp' call is not fast.
-define double @pow_exp_not_fast(double %x, double %y) #0 {
+define double @pow_exp_not_fast(double %x, double %y) {
   %call = call double @exp(double %x)
   %pow = call fast double @llvm.pow.f64(double %call, double %y)
   ret double %pow
@@ -31,11 +30,10 @@
 
 ; CHECK-LABEL: define double @pow_exp_not_fast(
 ; CHECK-NEXT:  %call = call double @exp(double %x)
-; CHECK-NEXT:  %mul = fmul fast double %x, %y
-; CHECK-NEXT:  %exp = call fast double @exp(double %mul)
-; CHECK-NEXT:  ret double %exp
+; CHECK-NEXT:  %pow = call fast double @llvm.pow.f64(double %call, double %y)
+; CHECK-NEXT:  ret double %pow
 
-define double @function_pointer(double ()* %fptr, double %p1) #0 {
+define double @function_pointer(double ()* %fptr, double %p1) {
   %call1 = call fast double %fptr()
   %pow = call fast double @llvm.pow.f64(double %call1, double %p1)
   ret double %pow
@@ -48,5 +46,4 @@
 declare double @exp(double)
 declare double @exp2(double)
 declare double @llvm.pow.f64(double, double)
-attributes #0 = { "unsafe-fp-math"="true" nounwind readnone }