1; RUN: opt < %s -instcombine -S | FileCheck %s 2 3define double @pow_exp(double %x, double %y) { 4 %call = call fast double @exp(double %x) nounwind readnone 5 %pow = call fast double @llvm.pow.f64(double %call, double %y) 6 ret double %pow 7} 8 9; CHECK-LABEL: define double @pow_exp( 10; CHECK-NEXT: %mul = fmul fast double %x, %y 11; CHECK-NEXT: %exp = call fast double @exp(double %mul) 12; CHECK-NEXT: ret double %exp 13 14define double @pow_exp2(double %x, double %y) { 15 %call = call fast double @exp2(double %x) nounwind readnone 16 %pow = call fast double @llvm.pow.f64(double %call, double %y) 17 ret double %pow 18} 19 20; CHECK-LABEL: define double @pow_exp2( 21; CHECK-NEXT: %mul = fmul fast double %x, %y 22; CHECK-NEXT: %exp2 = call fast double @exp2(double %mul) 23; CHECK-NEXT: ret double %exp2 24 25define double @pow_exp_not_fast(double %x, double %y) { 26 %call = call double @exp(double %x) 27 %pow = call fast double @llvm.pow.f64(double %call, double %y) 28 ret double %pow 29} 30 31; CHECK-LABEL: define double @pow_exp_not_fast( 32; CHECK-NEXT: %call = call double @exp(double %x) 33; CHECK-NEXT: %pow = call fast double @llvm.pow.f64(double %call, double %y) 34; CHECK-NEXT: ret double %pow 35 36define double @function_pointer(double ()* %fptr, double %p1) { 37 %call1 = call fast double %fptr() 38 %pow = call fast double @llvm.pow.f64(double %call1, double %p1) 39 ret double %pow 40} 41 42; CHECK-LABEL: @function_pointer 43; CHECK-NEXT: %call1 = call fast double %fptr() 44; CHECK-NEXT: %pow = call fast double @llvm.pow.f64(double %call1, double %p1) 45 46declare double @exp(double) 47declare double @exp2(double) 48declare double @llvm.pow.f64(double, double) 49 50