1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine double @log_pow(double %x, double %y) { 4*9880d681SAndroid Build Coastguard Worker %pow = call fast double @llvm.pow.f64(double %x, double %y) 5*9880d681SAndroid Build Coastguard Worker %call = call fast double @log(double %pow) 6*9880d681SAndroid Build Coastguard Worker ret double %call 7*9880d681SAndroid Build Coastguard Worker} 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define double @log_pow( 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %log = call fast double @log(double %x) 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul fast double %log, %y 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %mul 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine double @log_pow_not_fast(double %x, double %y) { 15*9880d681SAndroid Build Coastguard Worker %pow = call double @llvm.pow.f64(double %x, double %y) 16*9880d681SAndroid Build Coastguard Worker %call = call fast double @log(double %pow) 17*9880d681SAndroid Build Coastguard Worker ret double %call 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define double @log_pow_not_fast( 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %pow = call double @llvm.pow.f64(double %x, double %y) 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %call = call fast double @log(double %pow) 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %call 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine double @function_pointer(double ()* %fptr, double %p1) { 26*9880d681SAndroid Build Coastguard Worker %call1 = call double %fptr() 27*9880d681SAndroid Build Coastguard Worker %pow = call double @log(double %call1) 28*9880d681SAndroid Build Coastguard Worker ret double %pow 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @function_pointer 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %call1 = call double %fptr() 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %pow = call double @log(double %call1) 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %pow 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine double @log_exp2(double %x) { 37*9880d681SAndroid Build Coastguard Worker %call2 = call fast double @exp2(double %x) 38*9880d681SAndroid Build Coastguard Worker %call3 = call fast double @log(double %call2) 39*9880d681SAndroid Build Coastguard Worker ret double %call3 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @log_exp2 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %call2 = call fast double @exp2(double %x) 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %logmul = fmul fast double %x, 0x3FE62E42FEFA39EF 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %logmul 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine double @log_exp2_not_fast(double %x) { 48*9880d681SAndroid Build Coastguard Worker %call2 = call double @exp2(double %x) 49*9880d681SAndroid Build Coastguard Worker %call3 = call fast double @log(double %call2) 50*9880d681SAndroid Build Coastguard Worker ret double %call3 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @log_exp2_not_fast 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %call2 = call double @exp2(double %x) 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %call3 = call fast double @log(double %call2) 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %call3 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdeclare double @log(double) 59*9880d681SAndroid Build Coastguard Workerdeclare double @exp2(double) 60*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.pow.f64(double, double) 61*9880d681SAndroid Build Coastguard Worker 62