1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -instcombine < %s | FileCheck %s 3 4declare double @llvm.pow.f64(double, double) 5 6define double @pow_ab_a(double %a, double %b) { 7; CHECK-LABEL: @pow_ab_a( 8; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 9; CHECK-NEXT: [[MUL:%.*]] = fmul double [[TMP1]], [[A]] 10; CHECK-NEXT: ret double [[MUL]] 11; 12 %1 = call double @llvm.pow.f64(double %a, double %b) 13 %mul = fmul double %1, %a 14 ret double %mul 15} 16 17define double @pow_ab_a_reassoc(double %a, double %b) { 18; CHECK-LABEL: @pow_ab_a_reassoc( 19; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 20; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[TMP1]], [[A]] 21; CHECK-NEXT: ret double [[MUL]] 22; 23 %1 = call double @llvm.pow.f64(double %a, double %b) 24 %mul = fmul reassoc double %1, %a 25 ret double %mul 26} 27 28define double @pow_ab_a_reassoc_commute(double %a, double %b) { 29; CHECK-LABEL: @pow_ab_a_reassoc_commute( 30; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 31; CHECK-NEXT: [[MUL:%.*]] = fdiv reassoc double [[TMP1]], [[A]] 32; CHECK-NEXT: ret double [[MUL]] 33; 34 %1 = fdiv double 1.0, %a 35 %2 = call double @llvm.pow.f64(double %a, double %b) 36 %mul = fmul reassoc double %1, %2 37 ret double %mul 38} 39 40define double @pow_ab_pow_cb(double %a, double %b, double %c) { 41; CHECK-LABEL: @pow_ab_pow_cb( 42; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 43; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.pow.f64(double [[C:%.*]], double [[B]]) 44; CHECK-NEXT: [[MUL:%.*]] = fmul double [[TMP2]], [[TMP1]] 45; CHECK-NEXT: ret double [[MUL]] 46; 47 %1 = call double @llvm.pow.f64(double %a, double %b) 48 %2 = call double @llvm.pow.f64(double %c, double %b) 49 %mul = fmul double %2, %1 50 ret double %mul 51} 52 53define double @pow_ab_pow_cb_reassoc(double %a, double %b, double %c) { 54; CHECK-LABEL: @pow_ab_pow_cb_reassoc( 55; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 56; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.pow.f64(double [[C:%.*]], double [[B]]) 57; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[TMP2]], [[TMP1]] 58; CHECK-NEXT: ret double [[MUL]] 59; 60 %1 = call double @llvm.pow.f64(double %a, double %b) 61 %2 = call double @llvm.pow.f64(double %c, double %b) 62 %mul = fmul reassoc double %2, %1 63 ret double %mul 64} 65 66define double @pow_ab_pow_ac(double %a, double %b, double %c) { 67; CHECK-LABEL: @pow_ab_pow_ac( 68; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 69; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.pow.f64(double [[A]], double [[C:%.*]]) 70; CHECK-NEXT: [[MUL:%.*]] = fmul double [[TMP2]], [[TMP1]] 71; CHECK-NEXT: ret double [[MUL]] 72; 73 %1 = call double @llvm.pow.f64(double %a, double %b) 74 %2 = call double @llvm.pow.f64(double %a, double %c) 75 %mul = fmul double %2, %1 76 ret double %mul 77} 78 79define double @pow_ab_x_pow_ac_reassoc(double %a, double %b, double %c) { 80; CHECK-LABEL: @pow_ab_x_pow_ac_reassoc( 81; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.pow.f64(double [[A:%.*]], double [[B:%.*]]) 82; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.pow.f64(double [[A]], double [[C:%.*]]) 83; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[TMP2]], [[TMP1]] 84; CHECK-NEXT: ret double [[MUL]] 85; 86 %1 = call double @llvm.pow.f64(double %a, double %b) 87 %2 = call double @llvm.pow.f64(double %a, double %c) 88 %mul = fmul reassoc double %2, %1 89 ret double %mul 90} 91