1*8674a023SChia; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*8674a023SChia; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3*8674a023SChia 4*8674a023SChiadeclare void @dummy() 5*8674a023SChia 6*8674a023SChiadeclare i32 @llvm.smax.i32(i32 %a, i32 %b) 7*8674a023SChiadeclare i32 @llvm.smin.i32(i32 %a, i32 %b) 8*8674a023SChiadeclare i32 @llvm.umax.i32(i32 %a, i32 %b) 9*8674a023SChiadeclare i32 @llvm.umin.i32(i32 %a, i32 %b) 10*8674a023SChiadeclare float @llvm.maxnum.f32(float %a, float %b) 11*8674a023SChiadeclare float @llvm.minnum.f32(float %a, float %b) 12*8674a023SChiadeclare float @llvm.maximum.f32(float %a, float %b) 13*8674a023SChiadeclare float @llvm.minimum.f32(float %a, float %b) 14*8674a023SChiadeclare float @llvm.pow.f32(float %a, float %b) 15*8674a023SChia 16*8674a023SChiadefine i8 @fold_phi_mul(i1 %c, i8 %a, i8 %b) { 17*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul( 18*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 19*8674a023SChia; CHECK-NEXT: entry: 20*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 21*8674a023SChia; CHECK: then: 22*8674a023SChia; CHECK-NEXT: call void @dummy() 23*8674a023SChia; CHECK-NEXT: br label [[END]] 24*8674a023SChia; CHECK: end: 25*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul i8 [[A]], [[B]] 26*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 27*8674a023SChia; 28*8674a023SChiaentry: 29*8674a023SChia br i1 %c, label %then, label %end 30*8674a023SChiathen: 31*8674a023SChia call void @dummy() 32*8674a023SChia br label %end 33*8674a023SChiaend: 34*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 35*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 36*8674a023SChia %ret = mul i8 %phi1, %phi2 37*8674a023SChia ret i8 %ret 38*8674a023SChia} 39*8674a023SChia 40*8674a023SChiadefine i8 @fold_phi_mul_three(i1 %c, i1 %d, i8 %a, i8 %b) { 41*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_three( 42*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 43*8674a023SChia; CHECK-NEXT: entry: 44*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]] 45*8674a023SChia; CHECK: then1: 46*8674a023SChia; CHECK-NEXT: call void @dummy() 47*8674a023SChia; CHECK-NEXT: br i1 [[D]], label [[THEN2:%.*]], label [[END]] 48*8674a023SChia; CHECK: then2: 49*8674a023SChia; CHECK-NEXT: call void @dummy() 50*8674a023SChia; CHECK-NEXT: br label [[END]] 51*8674a023SChia; CHECK: end: 52*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul i8 [[A]], [[B]] 53*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 54*8674a023SChia; 55*8674a023SChiaentry: 56*8674a023SChia br i1 %c, label %then1, label %end 57*8674a023SChiathen1: 58*8674a023SChia call void @dummy() 59*8674a023SChia br i1 %d, label %then2, label %end 60*8674a023SChiathen2: 61*8674a023SChia call void @dummy() 62*8674a023SChia br label %end 63*8674a023SChiaend: 64*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2] 65*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then1], [%b, %then2] 66*8674a023SChia %ret = mul i8 %phi1, %phi2 67*8674a023SChia ret i8 %ret 68*8674a023SChia} 69*8674a023SChia 70*8674a023SChiadefine i8 @fold_phi_mul_three_notopt(i1 %c, i1 %d, i8 %a, i8 %b) { 71*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_three_notopt( 72*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 73*8674a023SChia; CHECK-NEXT: entry: 74*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN1:%.*]], label [[END:%.*]] 75*8674a023SChia; CHECK: then1: 76*8674a023SChia; CHECK-NEXT: call void @dummy() 77*8674a023SChia; CHECK-NEXT: br i1 [[D]], label [[THEN2:%.*]], label [[END]] 78*8674a023SChia; CHECK: then2: 79*8674a023SChia; CHECK-NEXT: call void @dummy() 80*8674a023SChia; CHECK-NEXT: br label [[END]] 81*8674a023SChia; CHECK: end: 82*8674a023SChia; CHECK-NEXT: [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN1]] ], [ [[A]], [[THEN2]] ] 83*8674a023SChia; CHECK-NEXT: [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN1]] ], [ [[A]], [[THEN2]] ] 84*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]] 85*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 86*8674a023SChia; 87*8674a023SChiaentry: 88*8674a023SChia br i1 %c, label %then1, label %end 89*8674a023SChiathen1: 90*8674a023SChia call void @dummy() 91*8674a023SChia br i1 %d, label %then2, label %end 92*8674a023SChiathen2: 93*8674a023SChia call void @dummy() 94*8674a023SChia br label %end 95*8674a023SChiaend: 96*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then1], [%a, %then2] 97*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then1], [%a, %then2] 98*8674a023SChia %ret = mul i8 %phi1, %phi2 99*8674a023SChia ret i8 %ret 100*8674a023SChia} 101*8674a023SChia 102*8674a023SChiadefine i8 @fold_phi_mul_nsw_nuw(i1 %c, i8 %a, i8 %b) { 103*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_nsw_nuw( 104*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 105*8674a023SChia; CHECK-NEXT: entry: 106*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 107*8674a023SChia; CHECK: then: 108*8674a023SChia; CHECK-NEXT: call void @dummy() 109*8674a023SChia; CHECK-NEXT: br label [[END]] 110*8674a023SChia; CHECK: end: 111*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul nuw nsw i8 [[A]], [[B]] 112*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 113*8674a023SChia; 114*8674a023SChiaentry: 115*8674a023SChia br i1 %c, label %then, label %end 116*8674a023SChiathen: 117*8674a023SChia call void @dummy() 118*8674a023SChia br label %end 119*8674a023SChiaend: 120*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 121*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 122*8674a023SChia %ret = mul nsw nuw i8 %phi1, %phi2 123*8674a023SChia ret i8 %ret 124*8674a023SChia} 125*8674a023SChia 126*8674a023SChiadefine <2 x i8> @fold_phi_mul_fix_vec(i1 %c, <2 x i8> %a, <2 x i8> %b) { 127*8674a023SChia; CHECK-LABEL: define <2 x i8> @fold_phi_mul_fix_vec( 128*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]], <2 x i8> [[B:%.*]]) { 129*8674a023SChia; CHECK-NEXT: entry: 130*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 131*8674a023SChia; CHECK: then: 132*8674a023SChia; CHECK-NEXT: call void @dummy() 133*8674a023SChia; CHECK-NEXT: br label [[END]] 134*8674a023SChia; CHECK: end: 135*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul <2 x i8> [[A]], [[B]] 136*8674a023SChia; CHECK-NEXT: ret <2 x i8> [[RET]] 137*8674a023SChia; 138*8674a023SChiaentry: 139*8674a023SChia br i1 %c, label %then, label %end 140*8674a023SChiathen: 141*8674a023SChia call void @dummy() 142*8674a023SChia br label %end 143*8674a023SChiaend: 144*8674a023SChia %phi1 = phi <2 x i8> [%a, %entry], [%b, %then] 145*8674a023SChia %phi2 = phi <2 x i8> [%b, %entry], [%a, %then] 146*8674a023SChia %ret = mul <2 x i8> %phi1, %phi2 147*8674a023SChia ret <2 x i8> %ret 148*8674a023SChia} 149*8674a023SChia 150*8674a023SChiadefine <vscale x 2 x i8> @fold_phi_mul_scale_vec(i1 %c, <vscale x 2 x i8> %a, <vscale x 2 x i8> %b) { 151*8674a023SChia; CHECK-LABEL: define <vscale x 2 x i8> @fold_phi_mul_scale_vec( 152*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], <vscale x 2 x i8> [[A:%.*]], <vscale x 2 x i8> [[B:%.*]]) { 153*8674a023SChia; CHECK-NEXT: entry: 154*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 155*8674a023SChia; CHECK: then: 156*8674a023SChia; CHECK-NEXT: call void @dummy() 157*8674a023SChia; CHECK-NEXT: br label [[END]] 158*8674a023SChia; CHECK: end: 159*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul <vscale x 2 x i8> [[A]], [[B]] 160*8674a023SChia; CHECK-NEXT: ret <vscale x 2 x i8> [[RET]] 161*8674a023SChia; 162*8674a023SChiaentry: 163*8674a023SChia br i1 %c, label %then, label %end 164*8674a023SChiathen: 165*8674a023SChia call void @dummy() 166*8674a023SChia br label %end 167*8674a023SChiaend: 168*8674a023SChia %phi1 = phi <vscale x 2 x i8> [%a, %entry], [%b, %then] 169*8674a023SChia %phi2 = phi <vscale x 2 x i8> [%b, %entry], [%a, %then] 170*8674a023SChia %ret = mul <vscale x 2 x i8> %phi1, %phi2 171*8674a023SChia ret <vscale x 2 x i8> %ret 172*8674a023SChia} 173*8674a023SChia 174*8674a023SChiadefine i8 @fold_phi_mul_commute(i1 %c, i8 %a, i8 %b) { 175*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_commute( 176*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 177*8674a023SChia; CHECK-NEXT: entry: 178*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 179*8674a023SChia; CHECK: then: 180*8674a023SChia; CHECK-NEXT: call void @dummy() 181*8674a023SChia; CHECK-NEXT: br label [[END]] 182*8674a023SChia; CHECK: end: 183*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul i8 [[A]], [[B]] 184*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 185*8674a023SChia; 186*8674a023SChiaentry: 187*8674a023SChia br i1 %c, label %then, label %end 188*8674a023SChiathen: 189*8674a023SChia call void @dummy() 190*8674a023SChia br label %end 191*8674a023SChiaend: 192*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 193*8674a023SChia %phi2 = phi i8 [%a, %then], [%b, %entry] 194*8674a023SChia %ret = mul i8 %phi1, %phi2 195*8674a023SChia ret i8 %ret 196*8674a023SChia} 197*8674a023SChia 198*8674a023SChia 199*8674a023SChiadefine i8 @fold_phi_mul_notopt(i1 %c, i8 %a, i8 %b, i8 %d) { 200*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_mul_notopt( 201*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]], i8 [[D:%.*]]) { 202*8674a023SChia; CHECK-NEXT: entry: 203*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 204*8674a023SChia; CHECK: then: 205*8674a023SChia; CHECK-NEXT: call void @dummy() 206*8674a023SChia; CHECK-NEXT: br label [[END]] 207*8674a023SChia; CHECK: end: 208*8674a023SChia; CHECK-NEXT: [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ] 209*8674a023SChia; CHECK-NEXT: [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[D]], [[THEN]] ] 210*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = mul i8 [[PHI1]], [[PHI2]] 211*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 212*8674a023SChia; 213*8674a023SChiaentry: 214*8674a023SChia br i1 %c, label %then, label %end 215*8674a023SChiathen: 216*8674a023SChia call void @dummy() 217*8674a023SChia br label %end 218*8674a023SChiaend: 219*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 220*8674a023SChia %phi2 = phi i8 [%b, %entry], [%d, %then] 221*8674a023SChia %ret = mul i8 %phi1, %phi2 222*8674a023SChia ret i8 %ret 223*8674a023SChia} 224*8674a023SChia 225*8674a023SChia 226*8674a023SChiadefine i8 @fold_phi_sub(i1 %c, i8 %a, i8 %b) { 227*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_sub( 228*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 229*8674a023SChia; CHECK-NEXT: entry: 230*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 231*8674a023SChia; CHECK: then: 232*8674a023SChia; CHECK-NEXT: call void @dummy() 233*8674a023SChia; CHECK-NEXT: br label [[END]] 234*8674a023SChia; CHECK: end: 235*8674a023SChia; CHECK-NEXT: [[PHI1:%.*]] = phi i8 [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ] 236*8674a023SChia; CHECK-NEXT: [[PHI2:%.*]] = phi i8 [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ] 237*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = sub i8 [[PHI1]], [[PHI2]] 238*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 239*8674a023SChia; 240*8674a023SChiaentry: 241*8674a023SChia br i1 %c, label %then, label %end 242*8674a023SChiathen: 243*8674a023SChia call void @dummy() 244*8674a023SChia br label %end 245*8674a023SChiaend: 246*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 247*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 248*8674a023SChia %ret = sub i8 %phi1, %phi2 249*8674a023SChia ret i8 %ret 250*8674a023SChia} 251*8674a023SChia 252*8674a023SChia 253*8674a023SChiadefine i8 @fold_phi_add(i1 %c, i8 %a, i8 %b) { 254*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_add( 255*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 256*8674a023SChia; CHECK-NEXT: entry: 257*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 258*8674a023SChia; CHECK: then: 259*8674a023SChia; CHECK-NEXT: call void @dummy() 260*8674a023SChia; CHECK-NEXT: br label [[END]] 261*8674a023SChia; CHECK: end: 262*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = add i8 [[A]], [[B]] 263*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 264*8674a023SChia; 265*8674a023SChiaentry: 266*8674a023SChia br i1 %c, label %then, label %end 267*8674a023SChiathen: 268*8674a023SChia call void @dummy() 269*8674a023SChia br label %end 270*8674a023SChiaend: 271*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 272*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 273*8674a023SChia %ret = add i8 %phi1, %phi2 274*8674a023SChia ret i8 %ret 275*8674a023SChia} 276*8674a023SChia 277*8674a023SChiadefine i8 @fold_phi_and(i1 %c, i8 %a, i8 %b) { 278*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_and( 279*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 280*8674a023SChia; CHECK-NEXT: entry: 281*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 282*8674a023SChia; CHECK: then: 283*8674a023SChia; CHECK-NEXT: call void @dummy() 284*8674a023SChia; CHECK-NEXT: br label [[END]] 285*8674a023SChia; CHECK: end: 286*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = and i8 [[A]], [[B]] 287*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 288*8674a023SChia; 289*8674a023SChiaentry: 290*8674a023SChia br i1 %c, label %then, label %end 291*8674a023SChiathen: 292*8674a023SChia call void @dummy() 293*8674a023SChia br label %end 294*8674a023SChiaend: 295*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 296*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 297*8674a023SChia %ret = and i8 %phi1, %phi2 298*8674a023SChia ret i8 %ret 299*8674a023SChia} 300*8674a023SChia 301*8674a023SChiadefine i8 @fold_phi_or(i1 %c, i8 %a, i8 %b) { 302*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_or( 303*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 304*8674a023SChia; CHECK-NEXT: entry: 305*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 306*8674a023SChia; CHECK: then: 307*8674a023SChia; CHECK-NEXT: call void @dummy() 308*8674a023SChia; CHECK-NEXT: br label [[END]] 309*8674a023SChia; CHECK: end: 310*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = or i8 [[A]], [[B]] 311*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 312*8674a023SChia; 313*8674a023SChiaentry: 314*8674a023SChia br i1 %c, label %then, label %end 315*8674a023SChiathen: 316*8674a023SChia call void @dummy() 317*8674a023SChia br label %end 318*8674a023SChiaend: 319*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 320*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 321*8674a023SChia %ret = or i8 %phi1, %phi2 322*8674a023SChia ret i8 %ret 323*8674a023SChia} 324*8674a023SChia 325*8674a023SChia 326*8674a023SChiadefine i8 @fold_phi_xor(i1 %c, i8 %a, i8 %b) { 327*8674a023SChia; CHECK-LABEL: define i8 @fold_phi_xor( 328*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 329*8674a023SChia; CHECK-NEXT: entry: 330*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 331*8674a023SChia; CHECK: then: 332*8674a023SChia; CHECK-NEXT: call void @dummy() 333*8674a023SChia; CHECK-NEXT: br label [[END]] 334*8674a023SChia; CHECK: end: 335*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = xor i8 [[A]], [[B]] 336*8674a023SChia; CHECK-NEXT: ret i8 [[RET]] 337*8674a023SChia; 338*8674a023SChiaentry: 339*8674a023SChia br i1 %c, label %then, label %end 340*8674a023SChiathen: 341*8674a023SChia call void @dummy() 342*8674a023SChia br label %end 343*8674a023SChiaend: 344*8674a023SChia %phi1 = phi i8 [%a, %entry], [%b, %then] 345*8674a023SChia %phi2 = phi i8 [%b, %entry], [%a, %then] 346*8674a023SChia %ret = xor i8 %phi1, %phi2 347*8674a023SChia ret i8 %ret 348*8674a023SChia} 349*8674a023SChia 350*8674a023SChia 351*8674a023SChiadefine float @fold_phi_fadd(i1 %c, float %a, float %b) { 352*8674a023SChia; CHECK-LABEL: define float @fold_phi_fadd( 353*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 354*8674a023SChia; CHECK-NEXT: entry: 355*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 356*8674a023SChia; CHECK: then: 357*8674a023SChia; CHECK-NEXT: call void @dummy() 358*8674a023SChia; CHECK-NEXT: br label [[END]] 359*8674a023SChia; CHECK: end: 360*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = fadd float [[A]], [[B]] 361*8674a023SChia; CHECK-NEXT: ret float [[RET]] 362*8674a023SChia; 363*8674a023SChiaentry: 364*8674a023SChia br i1 %c, label %then, label %end 365*8674a023SChiathen: 366*8674a023SChia call void @dummy() 367*8674a023SChia br label %end 368*8674a023SChiaend: 369*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 370*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 371*8674a023SChia %ret = fadd float %phi1, %phi2 372*8674a023SChia ret float %ret 373*8674a023SChia} 374*8674a023SChia 375*8674a023SChiadefine float @fold_phi_fadd_nnan(i1 %c, float %a, float %b) { 376*8674a023SChia; CHECK-LABEL: define float @fold_phi_fadd_nnan( 377*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 378*8674a023SChia; CHECK-NEXT: entry: 379*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 380*8674a023SChia; CHECK: then: 381*8674a023SChia; CHECK-NEXT: call void @dummy() 382*8674a023SChia; CHECK-NEXT: br label [[END]] 383*8674a023SChia; CHECK: end: 384*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = fadd nnan float [[A]], [[B]] 385*8674a023SChia; CHECK-NEXT: ret float [[RET]] 386*8674a023SChia; 387*8674a023SChiaentry: 388*8674a023SChia br i1 %c, label %then, label %end 389*8674a023SChiathen: 390*8674a023SChia call void @dummy() 391*8674a023SChia br label %end 392*8674a023SChiaend: 393*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 394*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 395*8674a023SChia %ret = fadd nnan float %phi1, %phi2 396*8674a023SChia ret float %ret 397*8674a023SChia} 398*8674a023SChia 399*8674a023SChia 400*8674a023SChiadefine float @fold_phi_fmul(i1 %c, float %a, float %b) { 401*8674a023SChia; CHECK-LABEL: define float @fold_phi_fmul( 402*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 403*8674a023SChia; CHECK-NEXT: entry: 404*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 405*8674a023SChia; CHECK: then: 406*8674a023SChia; CHECK-NEXT: call void @dummy() 407*8674a023SChia; CHECK-NEXT: br label [[END]] 408*8674a023SChia; CHECK: end: 409*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = fmul float [[A]], [[B]] 410*8674a023SChia; CHECK-NEXT: ret float [[RET]] 411*8674a023SChia; 412*8674a023SChiaentry: 413*8674a023SChia br i1 %c, label %then, label %end 414*8674a023SChiathen: 415*8674a023SChia call void @dummy() 416*8674a023SChia br label %end 417*8674a023SChiaend: 418*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 419*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 420*8674a023SChia %ret = fmul float %phi1, %phi2 421*8674a023SChia ret float %ret 422*8674a023SChia} 423*8674a023SChia 424*8674a023SChia 425*8674a023SChiadefine i32 @fold_phi_smax(i1 %c, i32 %a, i32 %b) { 426*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_smax( 427*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 428*8674a023SChia; CHECK-NEXT: entry: 429*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 430*8674a023SChia; CHECK: then: 431*8674a023SChia; CHECK-NEXT: call void @dummy() 432*8674a023SChia; CHECK-NEXT: br label [[END]] 433*8674a023SChia; CHECK: end: 434*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.smax.i32(i32 [[A]], i32 [[B]]) 435*8674a023SChia; CHECK-NEXT: ret i32 [[RET]] 436*8674a023SChia; 437*8674a023SChiaentry: 438*8674a023SChia br i1 %c, label %then, label %end 439*8674a023SChiathen: 440*8674a023SChia call void @dummy() 441*8674a023SChia br label %end 442*8674a023SChiaend: 443*8674a023SChia %phi1 = phi i32 [%a, %entry], [%b, %then] 444*8674a023SChia %phi2 = phi i32 [%b, %entry], [%a, %then] 445*8674a023SChia %ret = call i32 @llvm.smax.i32(i32 %phi1, i32 %phi2) 446*8674a023SChia ret i32 %ret 447*8674a023SChia} 448*8674a023SChia 449*8674a023SChia 450*8674a023SChiadefine i32 @fold_phi_smin(i1 %c, i32 %a, i32 %b) { 451*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_smin( 452*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 453*8674a023SChia; CHECK-NEXT: entry: 454*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 455*8674a023SChia; CHECK: then: 456*8674a023SChia; CHECK-NEXT: call void @dummy() 457*8674a023SChia; CHECK-NEXT: br label [[END]] 458*8674a023SChia; CHECK: end: 459*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.smin.i32(i32 [[A]], i32 [[B]]) 460*8674a023SChia; CHECK-NEXT: ret i32 [[RET]] 461*8674a023SChia; 462*8674a023SChiaentry: 463*8674a023SChia br i1 %c, label %then, label %end 464*8674a023SChiathen: 465*8674a023SChia call void @dummy() 466*8674a023SChia br label %end 467*8674a023SChiaend: 468*8674a023SChia %phi1 = phi i32 [%a, %entry], [%b, %then] 469*8674a023SChia %phi2 = phi i32 [%b, %entry], [%a, %then] 470*8674a023SChia %ret = call i32 @llvm.smin.i32(i32 %phi1, i32 %phi2) 471*8674a023SChia ret i32 %ret 472*8674a023SChia} 473*8674a023SChia 474*8674a023SChia 475*8674a023SChiadefine i32 @fold_phi_umax(i1 %c, i32 %a, i32 %b) { 476*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_umax( 477*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 478*8674a023SChia; CHECK-NEXT: entry: 479*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 480*8674a023SChia; CHECK: then: 481*8674a023SChia; CHECK-NEXT: call void @dummy() 482*8674a023SChia; CHECK-NEXT: br label [[END]] 483*8674a023SChia; CHECK: end: 484*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.umax.i32(i32 [[A]], i32 [[B]]) 485*8674a023SChia; CHECK-NEXT: ret i32 [[RET]] 486*8674a023SChia; 487*8674a023SChiaentry: 488*8674a023SChia br i1 %c, label %then, label %end 489*8674a023SChiathen: 490*8674a023SChia call void @dummy() 491*8674a023SChia br label %end 492*8674a023SChiaend: 493*8674a023SChia %phi1 = phi i32 [%a, %entry], [%b, %then] 494*8674a023SChia %phi2 = phi i32 [%b, %entry], [%a, %then] 495*8674a023SChia %ret = call i32 @llvm.umax.i32(i32 %phi1, i32 %phi2) 496*8674a023SChia ret i32 %ret 497*8674a023SChia} 498*8674a023SChia 499*8674a023SChiadefine i32 @fold_phi_umin(i1 %c, i32 %a, i32 %b) { 500*8674a023SChia; CHECK-LABEL: define i32 @fold_phi_umin( 501*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 502*8674a023SChia; CHECK-NEXT: entry: 503*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 504*8674a023SChia; CHECK: then: 505*8674a023SChia; CHECK-NEXT: call void @dummy() 506*8674a023SChia; CHECK-NEXT: br label [[END]] 507*8674a023SChia; CHECK: end: 508*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.umin.i32(i32 [[A]], i32 [[B]]) 509*8674a023SChia; CHECK-NEXT: ret i32 [[RET]] 510*8674a023SChia; 511*8674a023SChiaentry: 512*8674a023SChia br i1 %c, label %then, label %end 513*8674a023SChiathen: 514*8674a023SChia call void @dummy() 515*8674a023SChia br label %end 516*8674a023SChiaend: 517*8674a023SChia %phi1 = phi i32 [%a, %entry], [%b, %then] 518*8674a023SChia %phi2 = phi i32 [%b, %entry], [%a, %then] 519*8674a023SChia %ret = call i32 @llvm.umin.i32(i32 %phi1, i32 %phi2) 520*8674a023SChia ret i32 %ret 521*8674a023SChia} 522*8674a023SChia 523*8674a023SChia 524*8674a023SChiadefine float @fold_phi_maxnum(i1 %c, float %a, float %b) { 525*8674a023SChia; CHECK-LABEL: define float @fold_phi_maxnum( 526*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 527*8674a023SChia; CHECK-NEXT: entry: 528*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 529*8674a023SChia; CHECK: then: 530*8674a023SChia; CHECK-NEXT: call void @dummy() 531*8674a023SChia; CHECK-NEXT: br label [[END]] 532*8674a023SChia; CHECK: end: 533*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call float @llvm.maxnum.f32(float [[A]], float [[B]]) 534*8674a023SChia; CHECK-NEXT: ret float [[RET]] 535*8674a023SChia; 536*8674a023SChiaentry: 537*8674a023SChia br i1 %c, label %then, label %end 538*8674a023SChiathen: 539*8674a023SChia call void @dummy() 540*8674a023SChia br label %end 541*8674a023SChiaend: 542*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 543*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 544*8674a023SChia %ret = call float @llvm.maxnum.f32(float %phi1, float %phi2) 545*8674a023SChia ret float %ret 546*8674a023SChia} 547*8674a023SChia 548*8674a023SChiadefine float @fold_phi_pow(i1 %c, float %a, float %b) { 549*8674a023SChia; CHECK-LABEL: define float @fold_phi_pow( 550*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 551*8674a023SChia; CHECK-NEXT: entry: 552*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 553*8674a023SChia; CHECK: then: 554*8674a023SChia; CHECK-NEXT: call void @dummy() 555*8674a023SChia; CHECK-NEXT: br label [[END]] 556*8674a023SChia; CHECK: end: 557*8674a023SChia; CHECK-NEXT: [[PHI1:%.*]] = phi float [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ] 558*8674a023SChia; CHECK-NEXT: [[PHI2:%.*]] = phi float [ [[B]], [[ENTRY]] ], [ [[A]], [[THEN]] ] 559*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call float @llvm.pow.f32(float [[PHI1]], float [[PHI2]]) 560*8674a023SChia; CHECK-NEXT: ret float [[RET]] 561*8674a023SChia; 562*8674a023SChiaentry: 563*8674a023SChia br i1 %c, label %then, label %end 564*8674a023SChiathen: 565*8674a023SChia call void @dummy() 566*8674a023SChia br label %end 567*8674a023SChiaend: 568*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 569*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 570*8674a023SChia %ret = call float @llvm.pow.f32(float %phi1, float %phi2) 571*8674a023SChia ret float %ret 572*8674a023SChia} 573*8674a023SChia 574*8674a023SChiadefine float @fold_phi_minnum(i1 %c, float %a, float %b) { 575*8674a023SChia; CHECK-LABEL: define float @fold_phi_minnum( 576*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 577*8674a023SChia; CHECK-NEXT: entry: 578*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 579*8674a023SChia; CHECK: then: 580*8674a023SChia; CHECK-NEXT: call void @dummy() 581*8674a023SChia; CHECK-NEXT: br label [[END]] 582*8674a023SChia; CHECK: end: 583*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call float @llvm.minnum.f32(float [[A]], float [[B]]) 584*8674a023SChia; CHECK-NEXT: ret float [[RET]] 585*8674a023SChia; 586*8674a023SChiaentry: 587*8674a023SChia br i1 %c, label %then, label %end 588*8674a023SChiathen: 589*8674a023SChia call void @dummy() 590*8674a023SChia br label %end 591*8674a023SChiaend: 592*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 593*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 594*8674a023SChia %ret = call float @llvm.minnum.f32(float %phi1, float %phi2) 595*8674a023SChia ret float %ret 596*8674a023SChia} 597*8674a023SChia 598*8674a023SChiadefine float @fold_phi_maximum(i1 %c, float %a, float %b) { 599*8674a023SChia; CHECK-LABEL: define float @fold_phi_maximum( 600*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 601*8674a023SChia; CHECK-NEXT: entry: 602*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 603*8674a023SChia; CHECK: then: 604*8674a023SChia; CHECK-NEXT: call void @dummy() 605*8674a023SChia; CHECK-NEXT: br label [[END]] 606*8674a023SChia; CHECK: end: 607*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call float @llvm.maximum.f32(float [[A]], float [[B]]) 608*8674a023SChia; CHECK-NEXT: ret float [[RET]] 609*8674a023SChia; 610*8674a023SChiaentry: 611*8674a023SChia br i1 %c, label %then, label %end 612*8674a023SChiathen: 613*8674a023SChia call void @dummy() 614*8674a023SChia br label %end 615*8674a023SChiaend: 616*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 617*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 618*8674a023SChia %ret = call float @llvm.maximum.f32(float %phi1, float %phi2) 619*8674a023SChia ret float %ret 620*8674a023SChia} 621*8674a023SChia 622*8674a023SChiadefine float @fold_phi_minimum(i1 %c, float %a, float %b) { 623*8674a023SChia; CHECK-LABEL: define float @fold_phi_minimum( 624*8674a023SChia; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 625*8674a023SChia; CHECK-NEXT: entry: 626*8674a023SChia; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[END:%.*]] 627*8674a023SChia; CHECK: then: 628*8674a023SChia; CHECK-NEXT: call void @dummy() 629*8674a023SChia; CHECK-NEXT: br label [[END]] 630*8674a023SChia; CHECK: end: 631*8674a023SChia; CHECK-NEXT: [[RET:%.*]] = call float @llvm.minimum.f32(float [[A]], float [[B]]) 632*8674a023SChia; CHECK-NEXT: ret float [[RET]] 633*8674a023SChia; 634*8674a023SChiaentry: 635*8674a023SChia br i1 %c, label %then, label %end 636*8674a023SChiathen: 637*8674a023SChia call void @dummy() 638*8674a023SChia br label %end 639*8674a023SChiaend: 640*8674a023SChia %phi1 = phi float [%a, %entry], [%b, %then] 641*8674a023SChia %phi2 = phi float [%b, %entry], [%a, %then] 642*8674a023SChia %ret = call float @llvm.minimum.f32(float %phi1, float %phi2) 643*8674a023SChia ret float %ret 644*8674a023SChia} 645*8674a023SChia 646