1*88cc35b2SSizov Nikita; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*88cc35b2SSizov Nikita; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3*88cc35b2SSizov Nikita 4*88cc35b2SSizov Nikitadeclare float @llvm.maxnum.f32(float %a, float %b) 5*88cc35b2SSizov Nikitadeclare float @llvm.minnum.f32(float %a, float %b) 6*88cc35b2SSizov Nikitadeclare float @llvm.maximum.f32(float %a, float %b) 7*88cc35b2SSizov Nikitadeclare float @llvm.minimum.f32(float %a, float %b) 8*88cc35b2SSizov Nikitadeclare i32 @llvm.smax.i32(i32 %a, i32 %b) 9*88cc35b2SSizov Nikitadeclare i32 @llvm.smin.i32(i32 %a, i32 %b) 10*88cc35b2SSizov Nikitadeclare i32 @llvm.umax.i32(i32 %a, i32 %b) 11*88cc35b2SSizov Nikitadeclare i32 @llvm.umin.i32(i32 %a, i32 %b) 12*88cc35b2SSizov Nikitadeclare i16 @llvm.sadd.sat.i16(i16 %a, i16 %b) 13*88cc35b2SSizov Nikitadeclare i16 @llvm.uadd.sat.i16(i16 %a, i16 %b) 14*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.sadd.with.overflow.i16(i16 %a, i16 %b) 15*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.uadd.with.overflow.i16(i16 %a, i16 %b) 16*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b) 17*88cc35b2SSizov Nikitadeclare {i16, i1} @llvm.umul.with.overflow.i16(i16 %a, i16 %b) 18*88cc35b2SSizov Nikitadeclare i16 @llvm.smul.fix.i16(i16 %a, i16 %b, i32 %scale) 19*88cc35b2SSizov Nikitadeclare i16 @llvm.umul.fix.i16(i16 %a, i16 %b, i32 %scale) 20*88cc35b2SSizov Nikitadeclare i16 @llvm.smul.fix.sat.i16(i16 %a, i16 %b, i32 %scale) 21*88cc35b2SSizov Nikitadeclare i16 @llvm.umul.fix.sat.i16(i16 %a, i16 %b, i32 %scale) 22*88cc35b2SSizov Nikitadeclare float @llvm.fma.f32(float %a, float %b, float %c) 23*88cc35b2SSizov Nikitadeclare float @llvm.fmuladd.f32(float %a, float %b, float %c) 24*88cc35b2SSizov Nikita 25*88cc35b2SSizov Nikitadefine i8 @fold_select_mul(i1 %c, i8 %a, i8 %b) { 26*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_mul( 27*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 28*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = mul i8 [[B]], [[A]] 29*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 30*88cc35b2SSizov Nikita; 31*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 32*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 33*88cc35b2SSizov Nikita %ret = mul i8 %s1, %s0 34*88cc35b2SSizov Nikita ret i8 %ret 35*88cc35b2SSizov Nikita} 36*88cc35b2SSizov Nikita 37*88cc35b2SSizov Nikitadefine i8 @fold_select_mul_nsw_nuw_preserve(i1 %c, i8 %a, i8 %b) { 38*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_mul_nsw_nuw_preserve( 39*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 40*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = mul nuw nsw i8 [[B]], [[A]] 41*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 42*88cc35b2SSizov Nikita; 43*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 44*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 45*88cc35b2SSizov Nikita %ret = mul nsw nuw i8 %s1, %s0 46*88cc35b2SSizov Nikita ret i8 %ret 47*88cc35b2SSizov Nikita} 48*88cc35b2SSizov Nikita 49*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_mul_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) { 50*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_mul_vec2( 51*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) { 52*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = mul <2 x i4> [[B]], [[A]] 53*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x i4> [[RET]] 54*88cc35b2SSizov Nikita; 55*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b 56*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a 57*88cc35b2SSizov Nikita %ret = mul <2 x i4> %s1, %s0 58*88cc35b2SSizov Nikita ret <2 x i4> %ret 59*88cc35b2SSizov Nikita} 60*88cc35b2SSizov Nikita 61*88cc35b2SSizov Nikitadefine i8 @fold_select_add(i1 %c, i8 %a, i8 %b) { 62*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_add( 63*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 64*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = add i8 [[B]], [[A]] 65*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 66*88cc35b2SSizov Nikita; 67*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 68*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 69*88cc35b2SSizov Nikita %ret = add i8 %s1, %s0 70*88cc35b2SSizov Nikita ret i8 %ret 71*88cc35b2SSizov Nikita} 72*88cc35b2SSizov Nikita 73*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_add_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) { 74*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_add_vec2( 75*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) { 76*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = add <2 x i4> [[B]], [[A]] 77*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x i4> [[RET]] 78*88cc35b2SSizov Nikita; 79*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b 80*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a 81*88cc35b2SSizov Nikita %ret = add <2 x i4> %s1, %s0 82*88cc35b2SSizov Nikita ret <2 x i4> %ret 83*88cc35b2SSizov Nikita} 84*88cc35b2SSizov Nikita 85*88cc35b2SSizov Nikitadefine i8 @fold_select_and(i1 %c, i8 %a, i8 %b) { 86*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_and( 87*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 88*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = and i8 [[B]], [[A]] 89*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 90*88cc35b2SSizov Nikita; 91*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 92*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 93*88cc35b2SSizov Nikita %ret = and i8 %s1, %s0 94*88cc35b2SSizov Nikita ret i8 %ret 95*88cc35b2SSizov Nikita} 96*88cc35b2SSizov Nikita 97*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_and_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) { 98*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_and_vec2( 99*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) { 100*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = and <2 x i4> [[B]], [[A]] 101*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x i4> [[RET]] 102*88cc35b2SSizov Nikita; 103*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b 104*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a 105*88cc35b2SSizov Nikita %ret = and <2 x i4> %s1, %s0 106*88cc35b2SSizov Nikita ret <2 x i4> %ret 107*88cc35b2SSizov Nikita} 108*88cc35b2SSizov Nikita 109*88cc35b2SSizov Nikitadefine i8 @fold_select_or(i1 %c, i8 %a, i8 %b) { 110*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_or( 111*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 112*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = or i8 [[B]], [[A]] 113*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 114*88cc35b2SSizov Nikita; 115*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 116*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 117*88cc35b2SSizov Nikita %ret = or i8 %s1, %s0 118*88cc35b2SSizov Nikita ret i8 %ret 119*88cc35b2SSizov Nikita} 120*88cc35b2SSizov Nikita 121*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_or_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) { 122*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_or_vec2( 123*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) { 124*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = or <2 x i4> [[B]], [[A]] 125*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x i4> [[RET]] 126*88cc35b2SSizov Nikita; 127*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b 128*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a 129*88cc35b2SSizov Nikita %ret = or <2 x i4> %s1, %s0 130*88cc35b2SSizov Nikita ret <2 x i4> %ret 131*88cc35b2SSizov Nikita} 132*88cc35b2SSizov Nikita 133*88cc35b2SSizov Nikitadefine i8 @fold_select_xor(i1 %c, i8 %a, i8 %b) { 134*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_xor( 135*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 136*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = xor i8 [[B]], [[A]] 137*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 138*88cc35b2SSizov Nikita; 139*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 140*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 141*88cc35b2SSizov Nikita %ret = xor i8 %s1, %s0 142*88cc35b2SSizov Nikita ret i8 %ret 143*88cc35b2SSizov Nikita} 144*88cc35b2SSizov Nikita 145*88cc35b2SSizov Nikitadefine <2 x i4> @fold_select_xor_vec2(i1 %c, <2 x i4> %a, <2 x i4> %b) { 146*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x i4> @fold_select_xor_vec2( 147*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x i4> [[A:%.*]], <2 x i4> [[B:%.*]]) { 148*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = xor <2 x i4> [[B]], [[A]] 149*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x i4> [[RET]] 150*88cc35b2SSizov Nikita; 151*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x i4> %a, <2 x i4> %b 152*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x i4> %b, <2 x i4> %a 153*88cc35b2SSizov Nikita %ret = xor <2 x i4> %s1, %s0 154*88cc35b2SSizov Nikita ret <2 x i4> %ret 155*88cc35b2SSizov Nikita} 156*88cc35b2SSizov Nikita 157*88cc35b2SSizov Nikitadefine float @fold_select_fadd(i1 %c, float %a, float %b) { 158*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fadd( 159*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 160*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = fadd float [[B]], [[A]] 161*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 162*88cc35b2SSizov Nikita; 163*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 164*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 165*88cc35b2SSizov Nikita %ret = fadd float %s1, %s0 166*88cc35b2SSizov Nikita ret float %ret 167*88cc35b2SSizov Nikita} 168*88cc35b2SSizov Nikita 169*88cc35b2SSizov Nikitadefine float @fold_select_fadd_nnan(i1 %c, float %a, float %b) { 170*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fadd_nnan( 171*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 172*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = fadd nnan float [[B]], [[A]] 173*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 174*88cc35b2SSizov Nikita; 175*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 176*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 177*88cc35b2SSizov Nikita %ret = fadd nnan float %s1, %s0 178*88cc35b2SSizov Nikita ret float %ret 179*88cc35b2SSizov Nikita} 180*88cc35b2SSizov Nikita 181*88cc35b2SSizov Nikitadefine <2 x float> @fold_select_fadd_vec2(i1 %c, <2 x float> %a, <2 x float> %b) { 182*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x float> @fold_select_fadd_vec2( 183*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x float> [[A:%.*]], <2 x float> [[B:%.*]]) { 184*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = fadd <2 x float> [[B]], [[A]] 185*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x float> [[RET]] 186*88cc35b2SSizov Nikita; 187*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x float> %a, <2 x float> %b 188*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x float> %b, <2 x float> %a 189*88cc35b2SSizov Nikita %ret = fadd <2 x float> %s1, %s0 190*88cc35b2SSizov Nikita ret <2 x float> %ret 191*88cc35b2SSizov Nikita} 192*88cc35b2SSizov Nikita 193*88cc35b2SSizov Nikitadefine float @fold_select_fmul(i1 %c, float %a, float %b) { 194*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fmul( 195*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 196*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = fmul float [[B]], [[A]] 197*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 198*88cc35b2SSizov Nikita; 199*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 200*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 201*88cc35b2SSizov Nikita %ret = fmul float %s1, %s0 202*88cc35b2SSizov Nikita ret float %ret 203*88cc35b2SSizov Nikita} 204*88cc35b2SSizov Nikita 205*88cc35b2SSizov Nikitadefine <2 x float> @fold_select_fmul_vec2(i1 %c, <2 x float> %a, <2 x float> %b) { 206*88cc35b2SSizov Nikita; CHECK-LABEL: define <2 x float> @fold_select_fmul_vec2( 207*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], <2 x float> [[A:%.*]], <2 x float> [[B:%.*]]) { 208*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = fmul <2 x float> [[B]], [[A]] 209*88cc35b2SSizov Nikita; CHECK-NEXT: ret <2 x float> [[RET]] 210*88cc35b2SSizov Nikita; 211*88cc35b2SSizov Nikita %s0 = select i1 %c, <2 x float> %a, <2 x float> %b 212*88cc35b2SSizov Nikita %s1 = select i1 %c, <2 x float> %b, <2 x float> %a 213*88cc35b2SSizov Nikita %ret = fmul <2 x float> %s1, %s0 214*88cc35b2SSizov Nikita ret <2 x float> %ret 215*88cc35b2SSizov Nikita} 216*88cc35b2SSizov Nikita 217*88cc35b2SSizov Nikita; 218*88cc35b2SSizov Nikita 219*88cc35b2SSizov Nikitadefine float @fold_select_maxnum(i1 %c, float %a, float %b) { 220*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_maxnum( 221*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 222*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.maxnum.f32(float [[B]], float [[A]]) 223*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 224*88cc35b2SSizov Nikita; 225*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 226*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 227*88cc35b2SSizov Nikita %ret = call float @llvm.maxnum.f32(float %s1, float %s0) 228*88cc35b2SSizov Nikita ret float %ret 229*88cc35b2SSizov Nikita} 230*88cc35b2SSizov Nikita 231*88cc35b2SSizov Nikitadefine float @fold_select_minnum(i1 %c, float %a, float %b) { 232*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_minnum( 233*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 234*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.minnum.f32(float [[B]], float [[A]]) 235*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 236*88cc35b2SSizov Nikita; 237*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 238*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 239*88cc35b2SSizov Nikita %ret = call float @llvm.minnum.f32(float %s1, float %s0) 240*88cc35b2SSizov Nikita ret float %ret 241*88cc35b2SSizov Nikita} 242*88cc35b2SSizov Nikita 243*88cc35b2SSizov Nikitadefine float @fold_select_maximum(i1 %c, float %a, float %b) { 244*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_maximum( 245*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 246*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.maximum.f32(float [[B]], float [[A]]) 247*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 248*88cc35b2SSizov Nikita; 249*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 250*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 251*88cc35b2SSizov Nikita %ret = call float @llvm.maximum.f32(float %s1, float %s0) 252*88cc35b2SSizov Nikita ret float %ret 253*88cc35b2SSizov Nikita} 254*88cc35b2SSizov Nikita 255*88cc35b2SSizov Nikitadefine float @fold_select_minimum(i1 %c, float %a, float %b) { 256*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_minimum( 257*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]]) { 258*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.minimum.f32(float [[B]], float [[A]]) 259*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 260*88cc35b2SSizov Nikita; 261*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 262*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 263*88cc35b2SSizov Nikita %ret = call float @llvm.minimum.f32(float %s1, float %s0) 264*88cc35b2SSizov Nikita ret float %ret 265*88cc35b2SSizov Nikita} 266*88cc35b2SSizov Nikita 267*88cc35b2SSizov Nikitadefine i32 @fold_select_smax(i1 %c, i32 %a, i32 %b) { 268*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_smax( 269*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 270*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[A]]) 271*88cc35b2SSizov Nikita; CHECK-NEXT: ret i32 [[RET]] 272*88cc35b2SSizov Nikita; 273*88cc35b2SSizov Nikita %s0 = select i1 %c, i32 %a, i32 %b 274*88cc35b2SSizov Nikita %s1 = select i1 %c, i32 %b, i32 %a 275*88cc35b2SSizov Nikita %ret = call i32 @llvm.smax.i32(i32 %s1, i32 %s0) 276*88cc35b2SSizov Nikita ret i32 %ret 277*88cc35b2SSizov Nikita} 278*88cc35b2SSizov Nikita 279*88cc35b2SSizov Nikitadefine i32 @fold_select_smin(i1 %c, i32 %a, i32 %b) { 280*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_smin( 281*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 282*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[A]]) 283*88cc35b2SSizov Nikita; CHECK-NEXT: ret i32 [[RET]] 284*88cc35b2SSizov Nikita; 285*88cc35b2SSizov Nikita %s0 = select i1 %c, i32 %a, i32 %b 286*88cc35b2SSizov Nikita %s1 = select i1 %c, i32 %b, i32 %a 287*88cc35b2SSizov Nikita %ret = call i32 @llvm.smin.i32(i32 %s1, i32 %s0) 288*88cc35b2SSizov Nikita ret i32 %ret 289*88cc35b2SSizov Nikita} 290*88cc35b2SSizov Nikita 291*88cc35b2SSizov Nikitadefine i32 @fold_select_umax(i1 %c, i32 %a, i32 %b) { 292*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_umax( 293*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 294*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[A]]) 295*88cc35b2SSizov Nikita; CHECK-NEXT: ret i32 [[RET]] 296*88cc35b2SSizov Nikita; 297*88cc35b2SSizov Nikita %s0 = select i1 %c, i32 %a, i32 %b 298*88cc35b2SSizov Nikita %s1 = select i1 %c, i32 %b, i32 %a 299*88cc35b2SSizov Nikita %ret = call i32 @llvm.umax.i32(i32 %s1, i32 %s0) 300*88cc35b2SSizov Nikita ret i32 %ret 301*88cc35b2SSizov Nikita} 302*88cc35b2SSizov Nikita 303*88cc35b2SSizov Nikitadefine i32 @fold_select_umin(i1 %c, i32 %a, i32 %b) { 304*88cc35b2SSizov Nikita; CHECK-LABEL: define i32 @fold_select_umin( 305*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 306*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[A]]) 307*88cc35b2SSizov Nikita; CHECK-NEXT: ret i32 [[RET]] 308*88cc35b2SSizov Nikita; 309*88cc35b2SSizov Nikita %s0 = select i1 %c, i32 %a, i32 %b 310*88cc35b2SSizov Nikita %s1 = select i1 %c, i32 %b, i32 %a 311*88cc35b2SSizov Nikita %ret = call i32 @llvm.umin.i32(i32 %s1, i32 %s0) 312*88cc35b2SSizov Nikita ret i32 %ret 313*88cc35b2SSizov Nikita} 314*88cc35b2SSizov Nikita 315*88cc35b2SSizov Nikitadefine i16 @fold_select_sadd_sat(i1 %c, i16 %a, i16 %b) { 316*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_sadd_sat( 317*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 318*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[B]], i16 [[A]]) 319*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 320*88cc35b2SSizov Nikita; 321*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 322*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 323*88cc35b2SSizov Nikita %ret = call i16 @llvm.sadd.sat.i16(i16 %s1, i16 %s0) 324*88cc35b2SSizov Nikita ret i16 %ret 325*88cc35b2SSizov Nikita} 326*88cc35b2SSizov Nikita 327*88cc35b2SSizov Nikitadefine i16 @fold_select_uadd_sat(i1 %c, i16 %a, i16 %b) { 328*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_uadd_sat( 329*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 330*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[B]], i16 [[A]]) 331*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 332*88cc35b2SSizov Nikita; 333*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 334*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 335*88cc35b2SSizov Nikita %ret = call i16 @llvm.uadd.sat.i16(i16 %s1, i16 %s0) 336*88cc35b2SSizov Nikita ret i16 %ret 337*88cc35b2SSizov Nikita} 338*88cc35b2SSizov Nikita 339*88cc35b2SSizov Nikitadefine i16 @fold_select_sadd_with_overflow(i1 %c, i16 %a, i16 %b) { 340*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_sadd_with_overflow( 341*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 342*88cc35b2SSizov Nikita; CHECK-NEXT: [[RES:%.*]] = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 [[B]], i16 [[A]]) 343*88cc35b2SSizov Nikita; CHECK-NEXT: [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1 344*88cc35b2SSizov Nikita; CHECK-NEXT: br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]] 345*88cc35b2SSizov Nikita; CHECK: overflow: 346*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 0 347*88cc35b2SSizov Nikita; CHECK: normal: 348*88cc35b2SSizov Nikita; CHECK-NEXT: [[SUM:%.*]] = extractvalue { i16, i1 } [[RES]], 0 349*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[SUM]] 350*88cc35b2SSizov Nikita; 351*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 352*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 353*88cc35b2SSizov Nikita %res = call {i16, i1} @llvm.sadd.with.overflow.i16(i16 %s1, i16 %s0) 354*88cc35b2SSizov Nikita %obit = extractvalue {i16, i1} %res, 1 355*88cc35b2SSizov Nikita br i1 %obit, label %overflow, label %normal 356*88cc35b2SSizov Nikitaoverflow: 357*88cc35b2SSizov Nikita ret i16 0 358*88cc35b2SSizov Nikitanormal: 359*88cc35b2SSizov Nikita %sum = extractvalue {i16, i1} %res, 0 360*88cc35b2SSizov Nikita ret i16 %sum 361*88cc35b2SSizov Nikita} 362*88cc35b2SSizov Nikita 363*88cc35b2SSizov Nikitadefine i16 @fold_select_uadd_with_overflow(i1 %c, i16 %a, i16 %b) { 364*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_uadd_with_overflow( 365*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 366*88cc35b2SSizov Nikita; CHECK-NEXT: [[RES:%.*]] = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 [[B]], i16 [[A]]) 367*88cc35b2SSizov Nikita; CHECK-NEXT: [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1 368*88cc35b2SSizov Nikita; CHECK-NEXT: br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]] 369*88cc35b2SSizov Nikita; CHECK: overflow: 370*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 0 371*88cc35b2SSizov Nikita; CHECK: normal: 372*88cc35b2SSizov Nikita; CHECK-NEXT: [[SUM:%.*]] = extractvalue { i16, i1 } [[RES]], 0 373*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[SUM]] 374*88cc35b2SSizov Nikita; 375*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 376*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 377*88cc35b2SSizov Nikita %res = call {i16, i1} @llvm.uadd.with.overflow.i16(i16 %s1, i16 %s0) 378*88cc35b2SSizov Nikita %obit = extractvalue {i16, i1} %res, 1 379*88cc35b2SSizov Nikita br i1 %obit, label %overflow, label %normal 380*88cc35b2SSizov Nikitaoverflow: 381*88cc35b2SSizov Nikita ret i16 0 382*88cc35b2SSizov Nikitanormal: 383*88cc35b2SSizov Nikita %sum = extractvalue {i16, i1} %res, 0 384*88cc35b2SSizov Nikita ret i16 %sum 385*88cc35b2SSizov Nikita} 386*88cc35b2SSizov Nikita 387*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_with_overflow(i1 %c, i16 %a, i16 %b) { 388*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_with_overflow( 389*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 390*88cc35b2SSizov Nikita; CHECK-NEXT: [[RES:%.*]] = call { i16, i1 } @llvm.smul.with.overflow.i16(i16 [[B]], i16 [[A]]) 391*88cc35b2SSizov Nikita; CHECK-NEXT: [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1 392*88cc35b2SSizov Nikita; CHECK-NEXT: br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]] 393*88cc35b2SSizov Nikita; CHECK: overflow: 394*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 0 395*88cc35b2SSizov Nikita; CHECK: normal: 396*88cc35b2SSizov Nikita; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i16, i1 } [[RES]], 0 397*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[MUL]] 398*88cc35b2SSizov Nikita; 399*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 400*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 401*88cc35b2SSizov Nikita %res = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %s1, i16 %s0) 402*88cc35b2SSizov Nikita %obit = extractvalue {i16, i1} %res, 1 403*88cc35b2SSizov Nikita br i1 %obit, label %overflow, label %normal 404*88cc35b2SSizov Nikitaoverflow: 405*88cc35b2SSizov Nikita ret i16 0 406*88cc35b2SSizov Nikitanormal: 407*88cc35b2SSizov Nikita %mul = extractvalue {i16, i1} %res, 0 408*88cc35b2SSizov Nikita ret i16 %mul 409*88cc35b2SSizov Nikita} 410*88cc35b2SSizov Nikita 411*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_with_overflow(i1 %c, i16 %a, i16 %b) { 412*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_with_overflow( 413*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]) { 414*88cc35b2SSizov Nikita; CHECK-NEXT: [[RES:%.*]] = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 [[B]], i16 [[A]]) 415*88cc35b2SSizov Nikita; CHECK-NEXT: [[OBIT:%.*]] = extractvalue { i16, i1 } [[RES]], 1 416*88cc35b2SSizov Nikita; CHECK-NEXT: br i1 [[OBIT]], label [[OVERFLOW:%.*]], label [[NORMAL:%.*]] 417*88cc35b2SSizov Nikita; CHECK: overflow: 418*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 0 419*88cc35b2SSizov Nikita; CHECK: normal: 420*88cc35b2SSizov Nikita; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i16, i1 } [[RES]], 0 421*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[MUL]] 422*88cc35b2SSizov Nikita; 423*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 424*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 425*88cc35b2SSizov Nikita %res = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %s1, i16 %s0) 426*88cc35b2SSizov Nikita %obit = extractvalue {i16, i1} %res, 1 427*88cc35b2SSizov Nikita br i1 %obit, label %overflow, label %normal 428*88cc35b2SSizov Nikitaoverflow: 429*88cc35b2SSizov Nikita ret i16 0 430*88cc35b2SSizov Nikitanormal: 431*88cc35b2SSizov Nikita %mul = extractvalue {i16, i1} %res, 0 432*88cc35b2SSizov Nikita ret i16 %mul 433*88cc35b2SSizov Nikita} 434*88cc35b2SSizov Nikita 435*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_fix(i1 %c, i16 %a, i16 %b, i32 %y) { 436*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_fix( 437*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) { 438*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.smul.fix.i16(i16 [[B]], i16 [[A]], i32 1) 439*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 440*88cc35b2SSizov Nikita; 441*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 442*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 443*88cc35b2SSizov Nikita %ret = call i16 @llvm.smul.fix.i16(i16 %s1, i16 %s0, i32 1) 444*88cc35b2SSizov Nikita ret i16 %ret 445*88cc35b2SSizov Nikita} 446*88cc35b2SSizov Nikita 447*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_fix(i1 %c, i16 %a, i16 %b, i32 %y) { 448*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_fix( 449*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) { 450*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.umul.fix.i16(i16 [[B]], i16 [[A]], i32 1) 451*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 452*88cc35b2SSizov Nikita; 453*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 454*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 455*88cc35b2SSizov Nikita %ret = call i16 @llvm.umul.fix.i16(i16 %s1, i16 %s0, i32 1) 456*88cc35b2SSizov Nikita ret i16 %ret 457*88cc35b2SSizov Nikita} 458*88cc35b2SSizov Nikita 459*88cc35b2SSizov Nikitadefine i16 @fold_select_smul_fix_sat(i1 %c, i16 %a, i16 %b, i32 %y) { 460*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_smul_fix_sat( 461*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) { 462*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.smul.fix.sat.i16(i16 [[B]], i16 [[A]], i32 1) 463*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 464*88cc35b2SSizov Nikita; 465*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 466*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 467*88cc35b2SSizov Nikita %ret = call i16 @llvm.smul.fix.sat.i16(i16 %s1, i16 %s0, i32 1) 468*88cc35b2SSizov Nikita ret i16 %ret 469*88cc35b2SSizov Nikita} 470*88cc35b2SSizov Nikita 471*88cc35b2SSizov Nikitadefine i16 @fold_select_umul_fix_sat(i1 %c, i16 %a, i16 %b, i32 %y) { 472*88cc35b2SSizov Nikita; CHECK-LABEL: define i16 @fold_select_umul_fix_sat( 473*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i16 [[A:%.*]], i16 [[B:%.*]], i32 [[Y:%.*]]) { 474*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call i16 @llvm.umul.fix.sat.i16(i16 [[B]], i16 [[A]], i32 1) 475*88cc35b2SSizov Nikita; CHECK-NEXT: ret i16 [[RET]] 476*88cc35b2SSizov Nikita; 477*88cc35b2SSizov Nikita %s0 = select i1 %c, i16 %a, i16 %b 478*88cc35b2SSizov Nikita %s1 = select i1 %c, i16 %b, i16 %a 479*88cc35b2SSizov Nikita %ret = call i16 @llvm.umul.fix.sat.i16(i16 %s1, i16 %s0, i32 1) 480*88cc35b2SSizov Nikita ret i16 %ret 481*88cc35b2SSizov Nikita} 482*88cc35b2SSizov Nikita 483*88cc35b2SSizov Nikitadefine float @fold_select_fma(i1 %c, float %a, float %b, float %y) { 484*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma( 485*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) { 486*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fma.f32(float [[B]], float [[A]], float [[Y]]) 487*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 488*88cc35b2SSizov Nikita; 489*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 490*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 491*88cc35b2SSizov Nikita %ret = call float @llvm.fma.f32(float %s1, float %s0, float %y) 492*88cc35b2SSizov Nikita ret float %ret 493*88cc35b2SSizov Nikita} 494*88cc35b2SSizov Nikita 495*88cc35b2SSizov Nikitadefine float @fold_select_fmuladd(i1 %c, float %a, float %b, float %y) { 496*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fmuladd( 497*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) { 498*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fmuladd.f32(float [[B]], float [[A]], float [[Y]]) 499*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 500*88cc35b2SSizov Nikita; 501*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 502*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 503*88cc35b2SSizov Nikita %ret = call float @llvm.fmuladd.f32(float %s1, float %s0, float %y) 504*88cc35b2SSizov Nikita ret float %ret 505*88cc35b2SSizov Nikita} 506*88cc35b2SSizov Nikita 507*88cc35b2SSizov Nikita;negative tests: 508*88cc35b2SSizov Nikita 509*88cc35b2SSizov Nikitadefine i8 @fold_select_unmatch_mul_neg(i1 %c, i1 %c1, i8 %a, i8 %b) { 510*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_unmatch_mul_neg( 511*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i1 [[C1:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 512*88cc35b2SSizov Nikita; CHECK-NEXT: [[S0:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]] 513*88cc35b2SSizov Nikita; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], i8 [[B]], i8 [[A]] 514*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = mul i8 [[S1]], [[S0]] 515*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 516*88cc35b2SSizov Nikita; 517*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 518*88cc35b2SSizov Nikita %s1 = select i1 %c1, i8 %b, i8 %a 519*88cc35b2SSizov Nikita %ret = mul i8 %s1, %s0 520*88cc35b2SSizov Nikita ret i8 %ret 521*88cc35b2SSizov Nikita} 522*88cc35b2SSizov Nikita 523*88cc35b2SSizov Nikitadefine i8 @fold_select_sub_neg(i1 %c, i8 %a, i8 %b) { 524*88cc35b2SSizov Nikita; CHECK-LABEL: define i8 @fold_select_sub_neg( 525*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]) { 526*88cc35b2SSizov Nikita; CHECK-NEXT: [[S0:%.*]] = select i1 [[C]], i8 [[A]], i8 [[B]] 527*88cc35b2SSizov Nikita; CHECK-NEXT: [[S1:%.*]] = select i1 [[C]], i8 [[B]], i8 [[A]] 528*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = sub i8 [[S1]], [[S0]] 529*88cc35b2SSizov Nikita; CHECK-NEXT: ret i8 [[RET]] 530*88cc35b2SSizov Nikita; 531*88cc35b2SSizov Nikita %s0 = select i1 %c, i8 %a, i8 %b 532*88cc35b2SSizov Nikita %s1 = select i1 %c, i8 %b, i8 %a 533*88cc35b2SSizov Nikita %ret = sub i8 %s1, %s0 534*88cc35b2SSizov Nikita ret i8 %ret 535*88cc35b2SSizov Nikita} 536*88cc35b2SSizov Nikita 537*88cc35b2SSizov Nikitadefine float @fold_select_fma_neg(i1 %c, i1 %c1, float %a, float %b, float %y) { 538*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma_neg( 539*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], i1 [[C1:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) { 540*88cc35b2SSizov Nikita; CHECK-NEXT: [[S0:%.*]] = select i1 [[C]], float [[A]], float [[B]] 541*88cc35b2SSizov Nikita; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1]], float [[B]], float [[A]] 542*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fma.f32(float [[S1]], float [[S0]], float [[Y]]) 543*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 544*88cc35b2SSizov Nikita; 545*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 546*88cc35b2SSizov Nikita %s1 = select i1 %c1, float %b, float %a 547*88cc35b2SSizov Nikita %ret = call float @llvm.fma.f32(float %s1, float %s0, float %y) 548*88cc35b2SSizov Nikita ret float %ret 549*88cc35b2SSizov Nikita} 550*88cc35b2SSizov Nikita 551*88cc35b2SSizov Nikitadefine float @fold_select_fma_match_neg(i1 %c, float %a, float %b, float %y) { 552*88cc35b2SSizov Nikita; CHECK-LABEL: define float @fold_select_fma_match_neg( 553*88cc35b2SSizov Nikita; CHECK-SAME: i1 [[C:%.*]], float [[A:%.*]], float [[B:%.*]], float [[Y:%.*]]) { 554*88cc35b2SSizov Nikita; CHECK-NEXT: [[S0:%.*]] = select i1 [[C]], float [[A]], float [[B]] 555*88cc35b2SSizov Nikita; CHECK-NEXT: [[S1:%.*]] = select i1 [[C]], float [[B]], float [[A]] 556*88cc35b2SSizov Nikita; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fma.f32(float [[Y]], float [[S0]], float [[S1]]) 557*88cc35b2SSizov Nikita; CHECK-NEXT: ret float [[RET]] 558*88cc35b2SSizov Nikita; 559*88cc35b2SSizov Nikita %s0 = select i1 %c, float %a, float %b 560*88cc35b2SSizov Nikita %s1 = select i1 %c, float %b, float %a 561*88cc35b2SSizov Nikita %ret = call float @llvm.fma.f32(float %y, float %s0, float %s1) 562*88cc35b2SSizov Nikita ret float %ret 563*88cc35b2SSizov Nikita} 564