1*979a0356SVeera; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*979a0356SVeera; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3*979a0356SVeera 4*979a0356SVeeradefine i8 @add_and_sgt(i8 %x) { 5*979a0356SVeera; CHECK-LABEL: define i8 @add_and_sgt( 6*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 7*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8) 8*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16 9*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 10*979a0356SVeera; 11*979a0356SVeera %add = add nsw i8 %x, 16 12*979a0356SVeera %cmp = icmp sgt i8 %x, 8 13*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 14*979a0356SVeera ret i8 %s 15*979a0356SVeera} 16*979a0356SVeera 17*979a0356SVeeradefine i8 @add_sgt_nuw(i8 %x) { 18*979a0356SVeera; CHECK-LABEL: define i8 @add_sgt_nuw( 19*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 20*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8) 21*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16 22*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 23*979a0356SVeera; 24*979a0356SVeera %add = add nuw i8 %x, 16 25*979a0356SVeera %cmp = icmp sgt i8 %x, 8 26*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 27*979a0356SVeera ret i8 %s 28*979a0356SVeera} 29*979a0356SVeera 30*979a0356SVeeradefine i8 @sub_and_ugt(i8 %x) { 31*979a0356SVeera; CHECK-LABEL: define i8 @sub_and_ugt( 32*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 33*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100) 34*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -50 35*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 36*979a0356SVeera; 37*979a0356SVeera %sub = sub nsw i8 %x, 50 38*979a0356SVeera %cmp = icmp ugt i8 %x, 100 39*979a0356SVeera %s = select i1 %cmp, i8 50, i8 %sub 40*979a0356SVeera ret i8 %s 41*979a0356SVeera} 42*979a0356SVeera 43*979a0356SVeeradefine i8 @sub_ugt_nuw_nsw(i8 %x) { 44*979a0356SVeera; CHECK-LABEL: define i8 @sub_ugt_nuw_nsw( 45*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 46*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100) 47*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -50 48*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 49*979a0356SVeera; 50*979a0356SVeera %sub = sub nuw nsw i8 %x, 50 51*979a0356SVeera %cmp = icmp ugt i8 %x, 100 52*979a0356SVeera %s = select i1 %cmp, i8 50, i8 %sub 53*979a0356SVeera ret i8 %s 54*979a0356SVeera} 55*979a0356SVeera 56*979a0356SVeeradefine i8 @mul_and_ult(i8 %x) { 57*979a0356SVeera; CHECK-LABEL: define i8 @mul_and_ult( 58*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 59*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10) 60*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 10 61*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 62*979a0356SVeera; 63*979a0356SVeera %add = mul nsw i8 %x, 10 64*979a0356SVeera %cmp = icmp ult i8 10, %x 65*979a0356SVeera %s = select i1 %cmp, i8 100, i8 %add 66*979a0356SVeera ret i8 %s 67*979a0356SVeera} 68*979a0356SVeera 69*979a0356SVeeradefine i8 @mul_and_non_strict_predicate(i8 %x) { 70*979a0356SVeera; CHECK-LABEL: define i8 @mul_and_non_strict_predicate( 71*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 72*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 10) 73*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = mul i8 [[TMP1]], 10 74*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 75*979a0356SVeera; 76*979a0356SVeera %add = mul nsw i8 %x, 10 77*979a0356SVeera %cmp = icmp sle i8 10, %x 78*979a0356SVeera %s = select i1 %cmp, i8 100, i8 %add 79*979a0356SVeera ret i8 %s 80*979a0356SVeera} 81*979a0356SVeera 82*979a0356SVeeradefine i8 @mul_ult_noflags(i8 %x) { 83*979a0356SVeera; CHECK-LABEL: define i8 @mul_ult_noflags( 84*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 85*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10) 86*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 10 87*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 88*979a0356SVeera; 89*979a0356SVeera %add = mul i8 %x, 10 90*979a0356SVeera %cmp = icmp ult i8 10, %x 91*979a0356SVeera %s = select i1 %cmp, i8 100, i8 %add 92*979a0356SVeera ret i8 %s 93*979a0356SVeera} 94*979a0356SVeera 95*979a0356SVeeradefine i8 @udiv_and_slt(i8 %x) { 96*979a0356SVeera; CHECK-LABEL: define i8 @udiv_and_slt( 97*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 98*979a0356SVeera; CHECK-NEXT: [[SUB:%.*]] = udiv i8 [[X]], 10 99*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100 100*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]] 101*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 102*979a0356SVeera; 103*979a0356SVeera %sub = udiv i8 %x, 10 104*979a0356SVeera %cmp = icmp slt i8 %x, 100 105*979a0356SVeera %s = select i1 %cmp, i8 10, i8 %sub 106*979a0356SVeera ret i8 %s 107*979a0356SVeera} 108*979a0356SVeera 109*979a0356SVeeradefine i8 @udiv_slt_exact(i8 %x) { 110*979a0356SVeera; CHECK-LABEL: define i8 @udiv_slt_exact( 111*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 112*979a0356SVeera; CHECK-NEXT: [[SUB:%.*]] = udiv exact i8 [[X]], 10 113*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100 114*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]] 115*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 116*979a0356SVeera; 117*979a0356SVeera %sub = udiv exact i8 %x, 10 118*979a0356SVeera %cmp = icmp slt i8 %x, 100 119*979a0356SVeera %s = select i1 %cmp, i8 10, i8 %sub 120*979a0356SVeera ret i8 %s 121*979a0356SVeera} 122*979a0356SVeera 123*979a0356SVeeradefine i8 @canonicalize_icmp_operands(i8 %x) { 124*979a0356SVeera; CHECK-LABEL: define i8 @canonicalize_icmp_operands( 125*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 126*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 119) 127*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], 8 128*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 129*979a0356SVeera; 130*979a0356SVeera %add = add nsw i8 %x, 8 131*979a0356SVeera %cmp = icmp sle i8 120, %x 132*979a0356SVeera %s = select i1 %cmp, i8 127, i8 %add 133*979a0356SVeera ret i8 %s 134*979a0356SVeera} 135*979a0356SVeera 136*979a0356SVeeradefine i8 @flipped_strictness_predicate_and_constant(i8 %x, i8 %y) { 137*979a0356SVeera; CHECK-LABEL: define i8 @flipped_strictness_predicate_and_constant( 138*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 139*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 1) 140*979a0356SVeera; CHECK-NEXT: [[R:%.*]] = add i8 [[TMP1]], -2 141*979a0356SVeera; CHECK-NEXT: ret i8 [[R]] 142*979a0356SVeera; 143*979a0356SVeera %a = add i8 %x, -2 144*979a0356SVeera %c = icmp ult i8 %x, 2 145*979a0356SVeera %r = select i1 %c, i8 -1, i8 %a 146*979a0356SVeera ret i8 %r 147*979a0356SVeera} 148*979a0356SVeera 149*979a0356SVeeradeclare void @use(i1) 150*979a0356SVeeradeclare void @use_byte(i8) 151*979a0356SVeera 152*979a0356SVeeradefine i8 @multi_use_cond_and_sel(i8 %x) { 153*979a0356SVeera; CHECK-LABEL: define i8 @multi_use_cond_and_sel( 154*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 155*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8 156*979a0356SVeera; CHECK-NEXT: call void @use(i1 [[CMP]]) 157*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8) 158*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16 159*979a0356SVeera; CHECK-NEXT: call void @use_byte(i8 [[S]]) 160*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 161*979a0356SVeera; 162*979a0356SVeera %add = add nsw i8 %x, 16 163*979a0356SVeera %cmp = icmp sgt i8 %x, 8 164*979a0356SVeera call void @use(i1 %cmp) 165*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 166*979a0356SVeera call void @use_byte(i8 %s) 167*979a0356SVeera ret i8 %s 168*979a0356SVeera} 169*979a0356SVeera 170*979a0356SVeeradefine void @rust_noop_loop() { 171*979a0356SVeera; CHECK-LABEL: define void @rust_noop_loop() { 172*979a0356SVeera; CHECK-NEXT: [[START:.*]]: 173*979a0356SVeera; CHECK-NEXT: br label %[[BB2_I:.*]] 174*979a0356SVeera; CHECK: [[BB2_I]]: 175*979a0356SVeera; CHECK-NEXT: [[ITER_SROA_0_07:%.*]] = phi i32 [ 0, %[[START]] ], [ [[SPEC_SELECT5:%.*]], %[[BB2_I]] ] 176*979a0356SVeera; CHECK-NEXT: [[_0_I3_I:%.*]] = icmp sgt i32 [[ITER_SROA_0_07]], 99 177*979a0356SVeera; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.smin.i32(i32 [[ITER_SROA_0_07]], i32 99) 178*979a0356SVeera; CHECK-NEXT: [[SPEC_SELECT5]] = add nsw i32 [[TMP0]], 1 179*979a0356SVeera; CHECK-NEXT: br i1 [[_0_I3_I]], label %[[BASICBLOCK4:.*]], label %[[BB2_I]] 180*979a0356SVeera; CHECK: [[BASICBLOCK4]]: 181*979a0356SVeera; CHECK-NEXT: ret void 182*979a0356SVeera; 183*979a0356SVeerastart: 184*979a0356SVeera br label %bb2.i 185*979a0356SVeera 186*979a0356SVeerabb2.i: 187*979a0356SVeera %iter.sroa.0.07 = phi i32 [ 0, %start ], [ %spec.select5, %bb2.i ] 188*979a0356SVeera %_0.i3.i = icmp sgt i32 %iter.sroa.0.07, 99 189*979a0356SVeera %0 = add nsw i32 %iter.sroa.0.07, 1 190*979a0356SVeera %spec.select5 = select i1 %_0.i3.i, i32 100, i32 %0 191*979a0356SVeera %_0.i.not.i = icmp sgt i32 %spec.select5, 100 192*979a0356SVeera %or.cond = select i1 %_0.i3.i, i1 true, i1 %_0.i.not.i 193*979a0356SVeera br i1 %or.cond, label %basicblock4, label %bb2.i 194*979a0356SVeera 195*979a0356SVeerabasicblock4: 196*979a0356SVeera ret void 197*979a0356SVeera} 198*979a0356SVeera 199*979a0356SVeeradefine <2 x i8> @add_non_splat_vector(<2 x i8> %x) { 200*979a0356SVeera; CHECK-LABEL: define <2 x i8> @add_non_splat_vector( 201*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) { 202*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> <i8 0, i8 1>) 203*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = add nuw <2 x i8> [[TMP1]], <i8 1, i8 0> 204*979a0356SVeera; CHECK-NEXT: ret <2 x i8> [[S]] 205*979a0356SVeera; 206*979a0356SVeera %add = add <2 x i8> %x, <i8 1, i8 0> 207*979a0356SVeera %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 1> 208*979a0356SVeera %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1> 209*979a0356SVeera ret <2 x i8> %s 210*979a0356SVeera} 211*979a0356SVeera 212*979a0356SVeeradefine <2 x i8> @or_splat_vector(<2 x i8> %x) { 213*979a0356SVeera; CHECK-LABEL: define <2 x i8> @or_splat_vector( 214*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) { 215*979a0356SVeera; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 1)) 216*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = or <2 x i8> [[TMP1]], splat (i8 1) 217*979a0356SVeera; CHECK-NEXT: ret <2 x i8> [[S]] 218*979a0356SVeera; 219*979a0356SVeera %add = or <2 x i8> %x, <i8 1, i8 1> 220*979a0356SVeera %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0> 221*979a0356SVeera %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1> 222*979a0356SVeera ret <2 x i8> %s 223*979a0356SVeera} 224*979a0356SVeera 225*979a0356SVeeradefine i8 @const_operands_dont_fold_negative(i8 %x) { 226*979a0356SVeera; CHECK-LABEL: define i8 @const_operands_dont_fold_negative( 227*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 228*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16 229*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 18 230*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 25 231*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 232*979a0356SVeera; 233*979a0356SVeera %add = add nsw i8 %x, 16 234*979a0356SVeera %cmp = icmp sgt i8 %x, 18 235*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 25 236*979a0356SVeera ret i8 %s 237*979a0356SVeera} 238*979a0356SVeera 239*979a0356SVeeradefine i8 @add_with_poison_negative(i8 %x) { 240*979a0356SVeera; CHECK-LABEL: define i8 @add_with_poison_negative( 241*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 242*979a0356SVeera; CHECK-NEXT: ret i8 25 243*979a0356SVeera; 244*979a0356SVeera %add = add nsw i8 %x, poison 245*979a0356SVeera %cmp = icmp sgt i8 %x, 8 246*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 25 247*979a0356SVeera ret i8 %s 248*979a0356SVeera} 249*979a0356SVeera 250*979a0356SVeeradefine i8 @add_with_overflow_negative(i8 %x) { 251*979a0356SVeera; CHECK-LABEL: define i8 @add_with_overflow_negative( 252*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 253*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 100 254*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 119 255*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 -127, i8 [[ADD]] 256*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 257*979a0356SVeera; 258*979a0356SVeera %add = add i8 %x, 100 259*979a0356SVeera %cmp = icmp sle i8 120, %x 260*979a0356SVeera %s = select i1 %cmp, i8 -127, i8 %add 261*979a0356SVeera ret i8 %s 262*979a0356SVeera} 263*979a0356SVeera 264*979a0356SVeeradefine <2 x i8> @vector_with_poison_negative(<2 x i8> %x) { 265*979a0356SVeera; CHECK-LABEL: define <2 x i8> @vector_with_poison_negative( 266*979a0356SVeera; CHECK-SAME: <2 x i8> [[X:%.*]]) { 267*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = xor <2 x i8> [[X]], <i8 1, i8 poison> 268*979a0356SVeera; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt <2 x i8> [[X]], splat (i8 1) 269*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[CMP_INV]], <2 x i8> splat (i8 1), <2 x i8> [[ADD]] 270*979a0356SVeera; CHECK-NEXT: ret <2 x i8> [[S]] 271*979a0356SVeera; 272*979a0356SVeera %add = xor <2 x i8> %x, <i8 1, i8 poison> 273*979a0356SVeera %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0> 274*979a0356SVeera %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1> 275*979a0356SVeera ret <2 x i8> %s 276*979a0356SVeera} 277*979a0356SVeera 278*979a0356SVeeradefine i8 @multi_use_bop_negative(i8 %x) { 279*979a0356SVeera; CHECK-LABEL: define i8 @multi_use_bop_negative( 280*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 281*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16 282*979a0356SVeera; CHECK-NEXT: call void @use_byte(i8 [[ADD]]) 283*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 7 284*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 24, i8 [[ADD]] 285*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 286*979a0356SVeera; 287*979a0356SVeera %add = add nsw i8 %x, 16 288*979a0356SVeera call void @use_byte(i8 %add) 289*979a0356SVeera %cmp = icmp sle i8 8, %x 290*979a0356SVeera %s = select i1 %cmp, i8 24, i8 %add 291*979a0356SVeera ret i8 %s 292*979a0356SVeera} 293*979a0356SVeera 294*979a0356SVeeradefine half @float_negative(half %x) { 295*979a0356SVeera; CHECK-LABEL: define half @float_negative( 296*979a0356SVeera; CHECK-SAME: half [[X:%.*]]) { 297*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = fmul fast half [[X]], 0xH2E66 298*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt half [[X]], 0xH5640 299*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], half 0xH4900, half [[ADD]] 300*979a0356SVeera; CHECK-NEXT: ret half [[S]] 301*979a0356SVeera; 302*979a0356SVeera %add = fdiv fast half %x, 10.0 303*979a0356SVeera %cmp = fcmp ult half 100.0, %x 304*979a0356SVeera %s = select i1 %cmp, half 10.0, half %add 305*979a0356SVeera ret half %s 306*979a0356SVeera} 307*979a0356SVeera 308*979a0356SVeeradefine i8 @poison_false_val_negative(i8 %x) { 309*979a0356SVeera; CHECK-LABEL: define i8 @poison_false_val_negative( 310*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 311*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16 312*979a0356SVeera; CHECK-NEXT: ret i8 [[ADD]] 313*979a0356SVeera; 314*979a0356SVeera %add = add nsw i8 %x, 16 315*979a0356SVeera %cmp = icmp sgt i8 %x, 8 316*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 poison 317*979a0356SVeera ret i8 %s 318*979a0356SVeera} 319*979a0356SVeera 320*979a0356SVeeradefine i8 @eq_negative(i8 %x) { 321*979a0356SVeera; CHECK-LABEL: define i8 @eq_negative( 322*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 323*979a0356SVeera; CHECK-NEXT: ret i8 24 324*979a0356SVeera; 325*979a0356SVeera %add = add nsw i8 %x, 16 326*979a0356SVeera %cmp = icmp eq i8 %x, 8 327*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 328*979a0356SVeera ret i8 %s 329*979a0356SVeera} 330*979a0356SVeera 331*979a0356SVeeradefine i8 @different_operands_negative(i8 %x, i8 %y) { 332*979a0356SVeera; CHECK-LABEL: define i8 @different_operands_negative( 333*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 334*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16 335*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y]], 8 336*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24 337*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 338*979a0356SVeera; 339*979a0356SVeera %add = add nsw i8 %x, 16 340*979a0356SVeera %cmp = icmp sgt i8 %y, 8 341*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 342*979a0356SVeera ret i8 %s 343*979a0356SVeera} 344*979a0356SVeera 345*979a0356SVeeradefine i8 @non_const_bop_operand_negative(i8 %x, i8 %y) { 346*979a0356SVeera; CHECK-LABEL: define i8 @non_const_bop_operand_negative( 347*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 348*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], [[Y]] 349*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y]], 8 350*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24 351*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 352*979a0356SVeera; 353*979a0356SVeera %add = add nsw i8 %x, %y 354*979a0356SVeera %cmp = icmp sgt i8 %y, 8 355*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 356*979a0356SVeera ret i8 %s 357*979a0356SVeera} 358*979a0356SVeera 359*979a0356SVeeradefine i8 @non_const_cmp_operand_negative(i8 %x, i8 %y) { 360*979a0356SVeera; CHECK-LABEL: define i8 @non_const_cmp_operand_negative( 361*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 362*979a0356SVeera; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16 363*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], [[Y]] 364*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24 365*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 366*979a0356SVeera; 367*979a0356SVeera %add = add nsw i8 %x, 16 368*979a0356SVeera %cmp = icmp sgt i8 %x, %y 369*979a0356SVeera %s = select i1 %cmp, i8 %add, i8 24 370*979a0356SVeera ret i8 %s 371*979a0356SVeera} 372*979a0356SVeera 373*979a0356SVeeradeclare i8 @result() 374*979a0356SVeera 375*979a0356SVeeradefine i8 @non_binop_negative(i8 %x) { 376*979a0356SVeera; CHECK-LABEL: define i8 @non_binop_negative( 377*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 378*979a0356SVeera; CHECK-NEXT: [[RESULT:%.*]] = call i8 @result() 379*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 16 380*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[RESULT]], i8 24 381*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 382*979a0356SVeera; 383*979a0356SVeera %result = call i8 @result() 384*979a0356SVeera %cmp = icmp sgt i8 %x, 16 385*979a0356SVeera %s = select i1 %cmp, i8 %result, i8 24 386*979a0356SVeera ret i8 %s 387*979a0356SVeera} 388*979a0356SVeera 389*979a0356SVeeradefine i8 @sub_const_on_lhs_negative(i8 %x) { 390*979a0356SVeera; CHECK-LABEL: define i8 @sub_const_on_lhs_negative( 391*979a0356SVeera; CHECK-SAME: i8 [[X:%.*]]) { 392*979a0356SVeera; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 50, [[X]] 393*979a0356SVeera; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 100 394*979a0356SVeera; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[SUB]], i8 50 395*979a0356SVeera; CHECK-NEXT: ret i8 [[S]] 396*979a0356SVeera; 397*979a0356SVeera %sub = sub nsw i8 50, %x 398*979a0356SVeera %cmp = icmp ugt i8 %x, 100 399*979a0356SVeera %s = select i1 %cmp, i8 %sub, i8 50 400*979a0356SVeera ret i8 %s 401*979a0356SVeera} 402