1*3b3590aaSSushant Gokhale; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*3b3590aaSSushant Gokhale; RUN: opt -S -passes='instcombine<no-verify-fixpoint>' < %s | FileCheck %s 3*3b3590aaSSushant Gokhale 4*3b3590aaSSushant Gokhale@x = global double 0.000000e+00 5*3b3590aaSSushant Gokhale@r1 = global double 0.000000e+00 6*3b3590aaSSushant Gokhale@r2 = global double 0.000000e+00 7*3b3590aaSSushant Gokhale@r3 = global double 0.000000e+00 8*3b3590aaSSushant Gokhale@v = global [2 x double] zeroinitializer 9*3b3590aaSSushant Gokhale@v1 = global [2 x double] zeroinitializer 10*3b3590aaSSushant Gokhale@v2 = global [2 x double] zeroinitializer 11*3b3590aaSSushant Gokhale 12*3b3590aaSSushant Gokhale; div/mul/div1 in the same block. 13*3b3590aaSSushant Gokhaledefine void @bb_constraint_case1(double %a) { 14*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case1( 15*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 16*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 17*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 18*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 19*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]] 20*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 21*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 22*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 23*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 24*3b3590aaSSushant Gokhale; 25*3b3590aaSSushant Gokhaleentry: 26*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 27*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 28*3b3590aaSSushant Gokhale store double %div, ptr @x 29*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 30*3b3590aaSSushant Gokhale store double %mul, ptr @r1 31*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 32*3b3590aaSSushant Gokhale store double %div1, ptr @r2 33*3b3590aaSSushant Gokhale ret void 34*3b3590aaSSushant Gokhale} 35*3b3590aaSSushant Gokhale 36*3b3590aaSSushant Gokhale; div/mul in one block and div1 in other block with conditional guard. 37*3b3590aaSSushant Gokhaledefine void @bb_constraint_case2(double %a, i32 %d) { 38*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case2( 39*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) { 40*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 41*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 42*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 43*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]] 44*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 45*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 46*3b3590aaSSushant Gokhale; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0 47*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 48*3b3590aaSSushant Gokhale; CHECK: if.then: 49*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 50*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 51*3b3590aaSSushant Gokhale; CHECK: if.end: 52*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 53*3b3590aaSSushant Gokhale; 54*3b3590aaSSushant Gokhaleentry: 55*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 56*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 57*3b3590aaSSushant Gokhale store double %div, ptr @x 58*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 59*3b3590aaSSushant Gokhale store double %mul, ptr @r1 60*3b3590aaSSushant Gokhale %d.not = icmp eq i32 %d, 0 61*3b3590aaSSushant Gokhale br i1 %d.not, label %if.end, label %if.then 62*3b3590aaSSushant Gokhale 63*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 64*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 65*3b3590aaSSushant Gokhale store double %div1, ptr @r2 66*3b3590aaSSushant Gokhale br label %if.end 67*3b3590aaSSushant Gokhale 68*3b3590aaSSushant Gokhaleif.end: ; preds = %if.then, %entry 69*3b3590aaSSushant Gokhale ret void 70*3b3590aaSSushant Gokhale} 71*3b3590aaSSushant Gokhale 72*3b3590aaSSushant Gokhale; div in one block. mul/div1 in other block and conditionally guarded. Don't optimize. 73*3b3590aaSSushant Gokhaledefine void @bb_constraint_case3(double %a, i32 %d) { 74*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case3( 75*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) { 76*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 77*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 78*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 79*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 80*3b3590aaSSushant Gokhale; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0 81*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 82*3b3590aaSSushant Gokhale; CHECK: if.then: 83*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 84*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 85*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 86*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 87*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 88*3b3590aaSSushant Gokhale; CHECK: if.end: 89*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 90*3b3590aaSSushant Gokhale; 91*3b3590aaSSushant Gokhaleentry: 92*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 93*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 94*3b3590aaSSushant Gokhale store double %div, ptr @x 95*3b3590aaSSushant Gokhale %d.not = icmp eq i32 %d, 0 96*3b3590aaSSushant Gokhale br i1 %d.not, label %if.end, label %if.then 97*3b3590aaSSushant Gokhale 98*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 99*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 100*3b3590aaSSushant Gokhale store double %mul, ptr @r1 101*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 102*3b3590aaSSushant Gokhale store double %div1, ptr @r2 103*3b3590aaSSushant Gokhale br label %if.end 104*3b3590aaSSushant Gokhale 105*3b3590aaSSushant Gokhaleif.end: ; preds = %if.then, %entry 106*3b3590aaSSushant Gokhale ret void 107*3b3590aaSSushant Gokhale} 108*3b3590aaSSushant Gokhale 109*3b3590aaSSushant Gokhale; div in one block. mul/div1 each in different block and conditionally guarded. Don't optimize. 110*3b3590aaSSushant Gokhaledefine void @bb_constraint_case4(double %a, i32 %c, i32 %d) { 111*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case4( 112*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) { 113*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 114*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 115*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 116*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 117*3b3590aaSSushant Gokhale; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0 118*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 119*3b3590aaSSushant Gokhale; CHECK: if.then: 120*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 121*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 122*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 123*3b3590aaSSushant Gokhale; CHECK: if.end: 124*3b3590aaSSushant Gokhale; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0 125*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_END1:%.*]], label [[IF_THEN1:%.*]] 126*3b3590aaSSushant Gokhale; CHECK: if.then1: 127*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 128*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 129*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END1]] 130*3b3590aaSSushant Gokhale; CHECK: if.end1: 131*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 132*3b3590aaSSushant Gokhale; 133*3b3590aaSSushant Gokhaleentry: 134*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 135*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 136*3b3590aaSSushant Gokhale store double %div, ptr @x 137*3b3590aaSSushant Gokhale %c.not = icmp eq i32 %c, 0 138*3b3590aaSSushant Gokhale br i1 %c.not, label %if.end, label %if.then 139*3b3590aaSSushant Gokhale 140*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 141*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 142*3b3590aaSSushant Gokhale store double %mul, ptr @r1 143*3b3590aaSSushant Gokhale br label %if.end 144*3b3590aaSSushant Gokhale 145*3b3590aaSSushant Gokhaleif.end: ; preds = %if.then, %entry 146*3b3590aaSSushant Gokhale %d.not = icmp eq i32 %d, 0 147*3b3590aaSSushant Gokhale br i1 %d.not, label %if.end1, label %if.then1 148*3b3590aaSSushant Gokhale 149*3b3590aaSSushant Gokhaleif.then1: ; preds = %if.end 150*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 151*3b3590aaSSushant Gokhale store double %div1, ptr @r2 152*3b3590aaSSushant Gokhale br label %if.end1 153*3b3590aaSSushant Gokhale 154*3b3590aaSSushant Gokhaleif.end1: ; preds = %if.then1, %if.end 155*3b3590aaSSushant Gokhale ret void 156*3b3590aaSSushant Gokhale} 157*3b3590aaSSushant Gokhale 158*3b3590aaSSushant Gokhale; sqrt value comes from different blocks. Don't optimize. 159*3b3590aaSSushant Gokhaledefine void @bb_constraint_case5(double %a, i32 %c) { 160*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case5( 161*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) { 162*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 163*3b3590aaSSushant Gokhale; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0 164*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] 165*3b3590aaSSushant Gokhale; CHECK: if.then: 166*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 167*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END:%.*]] 168*3b3590aaSSushant Gokhale; CHECK: if.else: 169*3b3590aaSSushant Gokhale; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], 1.000000e+01 170*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[ADD]]) 171*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 172*3b3590aaSSushant Gokhale; CHECK: if.end: 173*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = phi double [ [[TMP0]], [[IF_THEN]] ], [ [[TMP1]], [[IF_ELSE]] ] 174*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 175*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 176*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 177*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 178*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 179*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 180*3b3590aaSSushant Gokhale; 181*3b3590aaSSushant Gokhaleentry: 182*3b3590aaSSushant Gokhale %c.not = icmp eq i32 %c, 0 183*3b3590aaSSushant Gokhale br i1 %c.not, label %if.else, label %if.then 184*3b3590aaSSushant Gokhale 185*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 186*3b3590aaSSushant Gokhale %0 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 187*3b3590aaSSushant Gokhale br label %if.end 188*3b3590aaSSushant Gokhale 189*3b3590aaSSushant Gokhaleif.else: ; preds = %entry 190*3b3590aaSSushant Gokhale %add = fadd double %a, 1.000000e+01 191*3b3590aaSSushant Gokhale %1 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %add) 192*3b3590aaSSushant Gokhale br label %if.end 193*3b3590aaSSushant Gokhale 194*3b3590aaSSushant Gokhaleif.end: ; preds = %if.else, %if.then 195*3b3590aaSSushant Gokhale %sqrt = phi double[ %0, %if.then], [ %1, %if.else] 196*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 197*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 198*3b3590aaSSushant Gokhale store double %mul, ptr @r1 199*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 200*3b3590aaSSushant Gokhale store double %div1, ptr @r2 201*3b3590aaSSushant Gokhale ret void 202*3b3590aaSSushant Gokhale} 203*3b3590aaSSushant Gokhale 204*3b3590aaSSushant Gokhale; div in one block and conditionally guarded. mul/div1 in other block. Don't optimize. 205*3b3590aaSSushant Gokhaledefine void @bb_constraint_case6(double %a, i32 %d) { 206*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case6( 207*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) { 208*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 209*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 210*3b3590aaSSushant Gokhale; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0 211*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] 212*3b3590aaSSushant Gokhale; CHECK: if.else: 213*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr @x, align 8 214*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END:%.*]] 215*3b3590aaSSushant Gokhale; CHECK: if.then: 216*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 217*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP1]], ptr @x, align 8 218*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 219*3b3590aaSSushant Gokhale; CHECK: if.end: 220*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = phi double [ [[TMP0]], [[IF_ELSE]] ], [ [[TMP1]], [[IF_THEN]] ] 221*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 222*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 223*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 224*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 225*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 226*3b3590aaSSushant Gokhale; 227*3b3590aaSSushant Gokhaleentry: 228*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 229*3b3590aaSSushant Gokhale %d.not = icmp eq i32 %d, 0 230*3b3590aaSSushant Gokhale br i1 %d.not, label %if.else, label %if.then 231*3b3590aaSSushant Gokhale 232*3b3590aaSSushant Gokhaleif.else: ; preds = %entry 233*3b3590aaSSushant Gokhale %1 = load double, ptr @x 234*3b3590aaSSushant Gokhale br label %if.end 235*3b3590aaSSushant Gokhale 236*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 237*3b3590aaSSushant Gokhale %2 = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 238*3b3590aaSSushant Gokhale store double %2, ptr @x 239*3b3590aaSSushant Gokhale br label %if.end 240*3b3590aaSSushant Gokhale 241*3b3590aaSSushant Gokhaleif.end: ; preds = %if.else, %if.then 242*3b3590aaSSushant Gokhale %div = phi double [ %1, %if.else ], [ %2, %if.then ] 243*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 244*3b3590aaSSushant Gokhale store double %mul, ptr @r1 245*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 246*3b3590aaSSushant Gokhale store double %div1, ptr @r2 247*3b3590aaSSushant Gokhale ret void 248*3b3590aaSSushant Gokhale} 249*3b3590aaSSushant Gokhale 250*3b3590aaSSushant Gokhale; value for mul comes from different blocks. Don't optimize. 251*3b3590aaSSushant Gokhaledefine void @bb_constraint_case7(double %a, i32 %c, i32 %d) { 252*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case7( 253*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) { 254*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 255*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 256*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 257*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 258*3b3590aaSSushant Gokhale; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0 259*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] 260*3b3590aaSSushant Gokhale; CHECK: if.then: 261*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv double 3.000000e+00, [[A]] 262*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END:%.*]] 263*3b3590aaSSushant Gokhale; CHECK: if.else: 264*3b3590aaSSushant Gokhale; CHECK-NEXT: [[D_NOT:%.*]] = icmp eq i32 [[D]], 0 265*3b3590aaSSushant Gokhale; CHECK-NEXT: br i1 [[D_NOT]], label [[IF_ELSE1:%.*]], label [[IF_THEN1:%.*]] 266*3b3590aaSSushant Gokhale; CHECK: if.then1: 267*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = fdiv double 2.000000e+00, [[A]] 268*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 269*3b3590aaSSushant Gokhale; CHECK: if.else1: 270*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP2:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 271*3b3590aaSSushant Gokhale; CHECK-NEXT: br label [[IF_END]] 272*3b3590aaSSushant Gokhale; CHECK: if.end: 273*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = phi double [ [[TMP1]], [[IF_THEN1]] ], [ [[TMP2]], [[IF_ELSE1]] ], [ [[TMP0]], [[IF_THEN]] ] 274*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 275*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 276*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 277*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 278*3b3590aaSSushant Gokhale; 279*3b3590aaSSushant Gokhaleentry: 280*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 281*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 282*3b3590aaSSushant Gokhale store double %div, ptr @x 283*3b3590aaSSushant Gokhale %c.not = icmp eq i32 %c, 0 284*3b3590aaSSushant Gokhale br i1 %c.not, label %if.else, label %if.then 285*3b3590aaSSushant Gokhale 286*3b3590aaSSushant Gokhaleif.then: ; preds = %entry 287*3b3590aaSSushant Gokhale %1 = fdiv double 3.000000e+00, %a 288*3b3590aaSSushant Gokhale br label %if.end 289*3b3590aaSSushant Gokhale 290*3b3590aaSSushant Gokhaleif.else: ; preds = %entry 291*3b3590aaSSushant Gokhale %d.not = icmp eq i32 %d, 0 292*3b3590aaSSushant Gokhale br i1 %d.not, label %if.else1, label %if.then1 293*3b3590aaSSushant Gokhale 294*3b3590aaSSushant Gokhaleif.then1: ; preds = %if.else 295*3b3590aaSSushant Gokhale %2 = fdiv double 2.000000e+00, %a 296*3b3590aaSSushant Gokhale br label %if.end 297*3b3590aaSSushant Gokhale 298*3b3590aaSSushant Gokhaleif.else1: ; preds = %if.else 299*3b3590aaSSushant Gokhale %3 = fmul reassoc double %div, %div 300*3b3590aaSSushant Gokhale br label %if.end 301*3b3590aaSSushant Gokhale 302*3b3590aaSSushant Gokhaleif.end: ; preds = %if.then1, %if.else1, %if.then 303*3b3590aaSSushant Gokhale %mul = phi double [ %2, %if.then1 ], [ %3, %if.else1 ], [ %1, %if.then ] 304*3b3590aaSSushant Gokhale store double %mul, ptr @r1 305*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 306*3b3590aaSSushant Gokhale store double %div1, ptr @r2 307*3b3590aaSSushant Gokhale ret void 308*3b3590aaSSushant Gokhale} 309*3b3590aaSSushant Gokhale 310*3b3590aaSSushant Gokhale; value of mul comes from two different blocks(as shown by select ins). 311*3b3590aaSSushant Gokhaledefine void @bb_constraint_case8(double %a, i32 %c) { 312*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case8( 313*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) { 314*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 315*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 316*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 317*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]] 318*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 319*3b3590aaSSushant Gokhale; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0 320*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = fmul double [[A]], [[A]] 321*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP0]] 322*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 323*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 324*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 325*3b3590aaSSushant Gokhale; 326*3b3590aaSSushant Gokhaleentry: 327*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 328*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 329*3b3590aaSSushant Gokhale store double %div, ptr @x 330*3b3590aaSSushant Gokhale %c.not = icmp eq i32 %c, 0 331*3b3590aaSSushant Gokhale %1 = fmul double %a, %a 332*3b3590aaSSushant Gokhale %2 = fmul reassoc double %div, %div 333*3b3590aaSSushant Gokhale %mul = select i1 %c.not, double %1, double %2 334*3b3590aaSSushant Gokhale store double %mul, ptr @r1 335*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 336*3b3590aaSSushant Gokhale store double %div1, ptr @r2 337*3b3590aaSSushant Gokhale ret void 338*3b3590aaSSushant Gokhale} 339*3b3590aaSSushant Gokhale 340*3b3590aaSSushant Gokhale; multiple instances of multiply ops to optimize. Optimize all. 341*3b3590aaSSushant Gokhaledefine void @mutiple_multiply_instances(double %a, i32 %c) { 342*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @mutiple_multiply_instances( 343*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) { 344*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 345*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 346*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 347*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP1]], [[SQRT1]] 348*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 349*3b3590aaSSushant Gokhale; CHECK-NEXT: [[C_NOT:%.*]] = icmp eq i32 [[C]], 0 350*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP2:%.*]] = fmul double [[A]], [[A]] 351*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP3:%.*]] = fmul double [[A]], [[A]] 352*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL1:%.*]] = select i1 [[C_NOT]], double [[TMP2]], double [[TMP1]] 353*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL2:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP3]] 354*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL1]], ptr @r1, align 8 355*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL2]], ptr @r3, align 8 356*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 357*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 358*3b3590aaSSushant Gokhale; 359*3b3590aaSSushant Gokhaleentry: 360*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 361*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 362*3b3590aaSSushant Gokhale store double %div, ptr @x 363*3b3590aaSSushant Gokhale %c.not = icmp eq i32 %c, 0 364*3b3590aaSSushant Gokhale %1 = fmul double %a, %a 365*3b3590aaSSushant Gokhale %2 = fmul double %a, %a 366*3b3590aaSSushant Gokhale %3 = fmul reassoc double %div, %div 367*3b3590aaSSushant Gokhale %4 = fmul reassoc double %div, %div 368*3b3590aaSSushant Gokhale %mul1 = select i1 %c.not, double %1, double %3 369*3b3590aaSSushant Gokhale %mul2 = select i1 %c.not, double %4, double %2 370*3b3590aaSSushant Gokhale store double %mul1, ptr @r1 371*3b3590aaSSushant Gokhale store double %mul2, ptr @r3 372*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 373*3b3590aaSSushant Gokhale store double %div1, ptr @r2 374*3b3590aaSSushant Gokhale ret void 375*3b3590aaSSushant Gokhale} 376*3b3590aaSSushant Gokhale 377*3b3590aaSSushant Gokhale; missing flags for optimization. 378*3b3590aaSSushant Gokhaledefine void @missing_arcp_flag_on_div(double %a) { 379*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_arcp_flag_on_div( 380*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 381*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 382*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 383*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf double 1.000000e+00, [[SQRT]] 384*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 385*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 386*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 387*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 388*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 389*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 390*3b3590aaSSushant Gokhale; 391*3b3590aaSSushant Gokhaleentry: 392*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 393*3b3590aaSSushant Gokhale %div = fdiv reassoc ninf double 1.000000e+00, %sqrt 394*3b3590aaSSushant Gokhale store double %div, ptr @x 395*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 396*3b3590aaSSushant Gokhale store double %mul, ptr @r1 397*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 398*3b3590aaSSushant Gokhale store double %div1, ptr @r2 399*3b3590aaSSushant Gokhale ret void 400*3b3590aaSSushant Gokhale} 401*3b3590aaSSushant Gokhale 402*3b3590aaSSushant Gokhale; missing flags for optimization. 403*3b3590aaSSushant Gokhaledefine void @missing_reassoc_flag_on_mul(double %a) { 404*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_reassoc_flag_on_mul( 405*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 406*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 407*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 408*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 409*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 410*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul double [[DIV]], [[DIV]] 411*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 412*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]] 413*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 414*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 415*3b3590aaSSushant Gokhale; 416*3b3590aaSSushant Gokhaleentry: 417*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 418*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 419*3b3590aaSSushant Gokhale store double %div, ptr @x 420*3b3590aaSSushant Gokhale %mul = fmul double %div, %div 421*3b3590aaSSushant Gokhale store double %mul, ptr @r1 422*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 423*3b3590aaSSushant Gokhale store double %div1, ptr @r2 424*3b3590aaSSushant Gokhale ret void 425*3b3590aaSSushant Gokhale} 426*3b3590aaSSushant Gokhale 427*3b3590aaSSushant Gokhale; missing flags for optimization. 428*3b3590aaSSushant Gokhaledefine void @missing_reassoc_flag_on_div1(double %a) { 429*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_reassoc_flag_on_div1( 430*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 431*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 432*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]]) 433*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]] 434*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 435*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]] 436*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 437*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[A]], [[SQRT]] 438*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV1]], ptr @r2, align 8 439*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 440*3b3590aaSSushant Gokhale; 441*3b3590aaSSushant Gokhaleentry: 442*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 443*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 444*3b3590aaSSushant Gokhale store double %div, ptr @x 445*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 446*3b3590aaSSushant Gokhale store double %mul, ptr @r1 447*3b3590aaSSushant Gokhale %div1 = fdiv double %a, %sqrt 448*3b3590aaSSushant Gokhale store double %div1, ptr @r2 449*3b3590aaSSushant Gokhale ret void 450*3b3590aaSSushant Gokhale} 451*3b3590aaSSushant Gokhale 452*3b3590aaSSushant Gokhale; div = -1/sqrt(a) 453*3b3590aaSSushant Gokhaledefine void @negative_fdiv_val(double %a) { 454*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @negative_fdiv_val( 455*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 456*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 457*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 458*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 459*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP1:%.*]] = fneg reassoc double [[SQRT1]] 460*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[TMP1]] 461*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 462*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 463*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 464*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 465*3b3590aaSSushant Gokhale; 466*3b3590aaSSushant Gokhaleentry: 467*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 468*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double -1.000000e+00, %sqrt 469*3b3590aaSSushant Gokhale store double %div, ptr @x 470*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 471*3b3590aaSSushant Gokhale store double %mul, ptr @r1 472*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 473*3b3590aaSSushant Gokhale store double %div1, ptr @r2 474*3b3590aaSSushant Gokhale ret void 475*3b3590aaSSushant Gokhale} 476*3b3590aaSSushant Gokhale 477*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_div1(double %a) { 478*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_div1( 479*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 480*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 481*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0:![0-9]+]] 482*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 483*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]] 484*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 485*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 486*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 487*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 488*3b3590aaSSushant Gokhale; 489*3b3590aaSSushant Gokhaleentry: 490*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 491*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 492*3b3590aaSSushant Gokhale store double %div, ptr @x 493*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 494*3b3590aaSSushant Gokhale store double %mul, ptr @r1 495*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3 496*3b3590aaSSushant Gokhale store double %div1, ptr @r2 497*3b3590aaSSushant Gokhale ret void 498*3b3590aaSSushant Gokhale} 499*3b3590aaSSushant Gokhale 500*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_mul(double %a) { 501*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_mul( 502*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 503*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 504*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 505*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1:![0-9]+]] 506*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]] 507*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 508*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 509*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 510*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 511*3b3590aaSSushant Gokhale; 512*3b3590aaSSushant Gokhaleentry: 513*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 514*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt 515*3b3590aaSSushant Gokhale store double %div, ptr @x 516*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div, !fpmath !2 517*3b3590aaSSushant Gokhale store double %mul, ptr @r1 518*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 519*3b3590aaSSushant Gokhale store double %div1, ptr @r2 520*3b3590aaSSushant Gokhale ret void 521*3b3590aaSSushant Gokhale} 522*3b3590aaSSushant Gokhale 523*3b3590aaSSushant Gokhale; FIXME: DIV in the result should get the fpmath metadata from %div. 524*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_div(double %a) { 525*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_div( 526*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 527*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 528*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]) 529*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]] 530*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2:![0-9]+]] 531*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 532*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 533*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 534*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 535*3b3590aaSSushant Gokhale; 536*3b3590aaSSushant Gokhaleentry: 537*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a) 538*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1 539*3b3590aaSSushant Gokhale store double %div, ptr @x 540*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div 541*3b3590aaSSushant Gokhale store double %mul, ptr @r1 542*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt 543*3b3590aaSSushant Gokhale store double %div1, ptr @r2 544*3b3590aaSSushant Gokhale ret void 545*3b3590aaSSushant Gokhale} 546*3b3590aaSSushant Gokhale 547*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_all(double %a) { 548*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_all( 549*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 550*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 551*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0]] 552*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1]] 553*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2]] 554*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 555*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[TMP0]], ptr @r1, align 8 556*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[SQRT1]], ptr @r2, align 8 557*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 558*3b3590aaSSushant Gokhale; 559*3b3590aaSSushant Gokhaleentry: 560*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a), !fpmath !0 561*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1 562*3b3590aaSSushant Gokhale store double %div, ptr @x 563*3b3590aaSSushant Gokhale %mul = fmul reassoc double %div, %div, !fpmath !2 564*3b3590aaSSushant Gokhale store double %mul, ptr @r1 565*3b3590aaSSushant Gokhale %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3 566*3b3590aaSSushant Gokhale store double %div1, ptr @r2 567*3b3590aaSSushant Gokhale ret void 568*3b3590aaSSushant Gokhale} 569*3b3590aaSSushant Gokhale 570*3b3590aaSSushant Gokhaledefine void @vector_input(<2 x double> %a) { 571*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @vector_input( 572*3b3590aaSSushant Gokhale; CHECK-SAME: <2 x double> [[A:%.*]]) { 573*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 574*3b3590aaSSushant Gokhale; CHECK-NEXT: [[SQRT1:%.*]] = call reassoc <2 x double> @llvm.sqrt.v2f64(<2 x double> [[A]]) 575*3b3590aaSSushant Gokhale; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc <2 x double> splat (double 1.000000e+00), [[A]] 576*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = fmul reassoc <2 x double> [[TMP0]], [[SQRT1]] 577*3b3590aaSSushant Gokhale; CHECK-NEXT: store <2 x double> [[DIV]], ptr @v, align 16 578*3b3590aaSSushant Gokhale; CHECK-NEXT: store <2 x double> [[TMP0]], ptr @v1, align 16 579*3b3590aaSSushant Gokhale; CHECK-NEXT: store <2 x double> [[SQRT1]], ptr @v2, align 16 580*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 581*3b3590aaSSushant Gokhale; 582*3b3590aaSSushant Gokhaleentry: 583*3b3590aaSSushant Gokhale %sqrt = call reassoc nnan nsz ninf <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) 584*3b3590aaSSushant Gokhale %div = fdiv reassoc arcp ninf <2 x double><double 1.000000e+00, double 1.000000e+00>, %sqrt 585*3b3590aaSSushant Gokhale store <2 x double> %div, ptr @v 586*3b3590aaSSushant Gokhale %mul = fmul reassoc <2 x double> %div, %div 587*3b3590aaSSushant Gokhale store <2 x double> %mul, ptr @v1 588*3b3590aaSSushant Gokhale %div1 = fdiv reassoc <2 x double> %a, %sqrt 589*3b3590aaSSushant Gokhale store <2 x double> %div1, ptr @v2 590*3b3590aaSSushant Gokhale ret void 591*3b3590aaSSushant Gokhale} 592*3b3590aaSSushant Gokhale 593*3b3590aaSSushant Gokhaledefine void @strict_fp_metadata(double %a) { 594*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @strict_fp_metadata( 595*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) { 596*3b3590aaSSushant Gokhale; CHECK-NEXT: entry: 597*3b3590aaSSushant Gokhale; CHECK-NEXT: [[CONV:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict") 598*3b3590aaSSushant Gokhale; CHECK-NEXT: [[CALL:%.*]] = call double @llvm.sqrt.f64(double noundef [[A]]) 599*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[CONV]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict") 600*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV]], ptr @x, align 8 601*3b3590aaSSushant Gokhale; CHECK-NEXT: [[MUL:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[DIV]], double [[DIV]], metadata !"round.dynamic", metadata !"fpexcept.strict") 602*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[MUL]], ptr @r1, align 8 603*3b3590aaSSushant Gokhale; CHECK-NEXT: [[DIV2:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict") 604*3b3590aaSSushant Gokhale; CHECK-NEXT: store double [[DIV2]], ptr @r2, align 8 605*3b3590aaSSushant Gokhale; CHECK-NEXT: ret void 606*3b3590aaSSushant Gokhale; 607*3b3590aaSSushant Gokhaleentry: 608*3b3590aaSSushant Gokhale %conv = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict") 609*3b3590aaSSushant Gokhale %call = call double @llvm.sqrt.f64(double noundef %a) 610*3b3590aaSSushant Gokhale %div = call double @llvm.experimental.constrained.fdiv.f64(double %conv, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict") 611*3b3590aaSSushant Gokhale store double %div, ptr @x 612*3b3590aaSSushant Gokhale %mul = call double @llvm.experimental.constrained.fmul.f64(double %div, double %div, metadata !"round.dynamic", metadata !"fpexcept.strict") 613*3b3590aaSSushant Gokhale store double %mul, ptr @r1 614*3b3590aaSSushant Gokhale %div2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict") 615*3b3590aaSSushant Gokhale store double %div2, ptr @r2 616*3b3590aaSSushant Gokhale ret void 617*3b3590aaSSushant Gokhale} 618*3b3590aaSSushant Gokhale 619*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata) 620*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata) 621*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata) 622*3b3590aaSSushant Gokhaledeclare double @llvm.sqrt.f64(double) 623*3b3590aaSSushant Gokhaledeclare <2 x double> @llvm.sqrt.v2f64(<2 x double>) 624*3b3590aaSSushant Gokhale 625*3b3590aaSSushant Gokhale!0 = !{float 2.5} 626*3b3590aaSSushant Gokhale!1 = !{float 3.5} 627*3b3590aaSSushant Gokhale!2 = !{float 4.5} 628*3b3590aaSSushant Gokhale!3 = !{float 5.5} 629*3b3590aaSSushant Gokhale; CHECK: [[META0]] = !{float 5.500000e+00} 630*3b3590aaSSushant Gokhale; CHECK: [[META1]] = !{float 4.500000e+00} 631*3b3590aaSSushant Gokhale; CHECK: [[META2]] = !{float 3.500000e+00} 632