531 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @add_and_sgt(i8 %x) {5; CHECK-LABEL: define i8 @add_and_sgt(6; CHECK-SAME: i8 [[X:%.*]]) {7; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)8; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 169; CHECK-NEXT: ret i8 [[S]]10;11 %add = add nsw i8 %x, 1612 %cmp = icmp sgt i8 %x, 813 %s = select i1 %cmp, i8 %add, i8 2414 ret i8 %s15}16 17define i8 @add_sgt_nuw(i8 %x) {18; CHECK-LABEL: define i8 @add_sgt_nuw(19; CHECK-SAME: i8 [[X:%.*]]) {20; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)21; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 1622; CHECK-NEXT: ret i8 [[S]]23;24 %add = add nuw i8 %x, 1625 %cmp = icmp sgt i8 %x, 826 %s = select i1 %cmp, i8 %add, i8 2427 ret i8 %s28}29 30define i8 @sub_and_ugt(i8 %x) {31; CHECK-LABEL: define i8 @sub_and_ugt(32; CHECK-SAME: i8 [[X:%.*]]) {33; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)34; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -5035; CHECK-NEXT: ret i8 [[S]]36;37 %sub = sub nsw i8 %x, 5038 %cmp = icmp ugt i8 %x, 10039 %s = select i1 %cmp, i8 50, i8 %sub40 ret i8 %s41}42 43define i8 @sub_ugt_nuw_nsw(i8 %x) {44; CHECK-LABEL: define i8 @sub_ugt_nuw_nsw(45; CHECK-SAME: i8 [[X:%.*]]) {46; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)47; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -5048; CHECK-NEXT: ret i8 [[S]]49;50 %sub = sub nuw nsw i8 %x, 5051 %cmp = icmp ugt i8 %x, 10052 %s = select i1 %cmp, i8 50, i8 %sub53 ret i8 %s54}55 56define i8 @mul_and_ult(i8 %x) {57; CHECK-LABEL: define i8 @mul_and_ult(58; CHECK-SAME: i8 [[X:%.*]]) {59; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)60; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 1061; CHECK-NEXT: ret i8 [[S]]62;63 %add = mul nsw i8 %x, 1064 %cmp = icmp ult i8 10, %x65 %s = select i1 %cmp, i8 100, i8 %add66 ret i8 %s67}68 69define i8 @mul_and_non_strict_predicate(i8 %x) {70; CHECK-LABEL: define i8 @mul_and_non_strict_predicate(71; CHECK-SAME: i8 [[X:%.*]]) {72; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 10)73; CHECK-NEXT: [[S:%.*]] = mul i8 [[TMP1]], 1074; CHECK-NEXT: ret i8 [[S]]75;76 %add = mul nsw i8 %x, 1077 %cmp = icmp sle i8 10, %x78 %s = select i1 %cmp, i8 100, i8 %add79 ret i8 %s80}81 82define i8 @mul_ult_noflags(i8 %x) {83; CHECK-LABEL: define i8 @mul_ult_noflags(84; CHECK-SAME: i8 [[X:%.*]]) {85; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 10)86; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 1087; CHECK-NEXT: ret i8 [[S]]88;89 %add = mul i8 %x, 1090 %cmp = icmp ult i8 10, %x91 %s = select i1 %cmp, i8 100, i8 %add92 ret i8 %s93}94 95define i8 @udiv_and_slt(i8 %x) {96; CHECK-LABEL: define i8 @udiv_and_slt(97; CHECK-SAME: i8 [[X:%.*]]) {98; CHECK-NEXT: [[SUB:%.*]] = udiv i8 [[X]], 1099; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100100; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]101; CHECK-NEXT: ret i8 [[S]]102;103 %sub = udiv i8 %x, 10104 %cmp = icmp slt i8 %x, 100105 %s = select i1 %cmp, i8 10, i8 %sub106 ret i8 %s107}108 109define i8 @udiv_slt_exact(i8 %x) {110; CHECK-LABEL: define i8 @udiv_slt_exact(111; CHECK-SAME: i8 [[X:%.*]]) {112; CHECK-NEXT: [[SUB:%.*]] = udiv exact i8 [[X]], 10113; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X]], 100114; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 10, i8 [[SUB]]115; CHECK-NEXT: ret i8 [[S]]116;117 %sub = udiv exact i8 %x, 10118 %cmp = icmp slt i8 %x, 100119 %s = select i1 %cmp, i8 10, i8 %sub120 ret i8 %s121}122 123define i8 @canonicalize_icmp_operands(i8 %x) {124; CHECK-LABEL: define i8 @canonicalize_icmp_operands(125; CHECK-SAME: i8 [[X:%.*]]) {126; CHECK-NEXT: [[S:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[X]], i8 8)127; CHECK-NEXT: ret i8 [[S]]128;129 %add = add nsw i8 %x, 8130 %cmp = icmp sle i8 120, %x131 %s = select i1 %cmp, i8 127, i8 %add132 ret i8 %s133}134 135define i8 @flipped_strictness_predicate_and_constant(i8 %x, i8 %y) {136; CHECK-LABEL: define i8 @flipped_strictness_predicate_and_constant(137; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {138; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 1)139; CHECK-NEXT: [[R:%.*]] = add i8 [[TMP1]], -2140; CHECK-NEXT: ret i8 [[R]]141;142 %a = add i8 %x, -2143 %c = icmp ult i8 %x, 2144 %r = select i1 %c, i8 -1, i8 %a145 ret i8 %r146}147 148declare void @use(i1)149declare void @use_byte(i8)150 151define i8 @multi_use_cond_and_sel(i8 %x) {152; CHECK-LABEL: define i8 @multi_use_cond_and_sel(153; CHECK-SAME: i8 [[X:%.*]]) {154; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8155; CHECK-NEXT: call void @use(i1 [[CMP]])156; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)157; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 16158; CHECK-NEXT: call void @use_byte(i8 [[S]])159; CHECK-NEXT: ret i8 [[S]]160;161 %add = add nsw i8 %x, 16162 %cmp = icmp sgt i8 %x, 8163 call void @use(i1 %cmp)164 %s = select i1 %cmp, i8 %add, i8 24165 call void @use_byte(i8 %s)166 ret i8 %s167}168 169define void @rust_noop_loop() {170; CHECK-LABEL: define void @rust_noop_loop() {171; CHECK-NEXT: [[START:.*]]:172; CHECK-NEXT: br label %[[BB2_I:.*]]173; CHECK: [[BB2_I]]:174; CHECK-NEXT: [[ITER_SROA_0_07:%.*]] = phi i32 [ 0, %[[START]] ], [ [[SPEC_SELECT5:%.*]], %[[BB2_I]] ]175; CHECK-NEXT: [[_0_I3_I:%.*]] = icmp sgt i32 [[ITER_SROA_0_07]], 99176; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.smin.i32(i32 [[ITER_SROA_0_07]], i32 99)177; CHECK-NEXT: [[SPEC_SELECT5]] = add nsw i32 [[TMP0]], 1178; CHECK-NEXT: br i1 [[_0_I3_I]], label %[[BASICBLOCK4:.*]], label %[[BB2_I]]179; CHECK: [[BASICBLOCK4]]:180; CHECK-NEXT: ret void181;182start:183 br label %bb2.i184 185bb2.i:186 %iter.sroa.0.07 = phi i32 [ 0, %start ], [ %spec.select5, %bb2.i ]187 %_0.i3.i = icmp sgt i32 %iter.sroa.0.07, 99188 %0 = add nsw i32 %iter.sroa.0.07, 1189 %spec.select5 = select i1 %_0.i3.i, i32 100, i32 %0190 %_0.i.not.i = icmp sgt i32 %spec.select5, 100191 %or.cond = select i1 %_0.i3.i, i1 true, i1 %_0.i.not.i192 br i1 %or.cond, label %basicblock4, label %bb2.i193 194basicblock4:195 ret void196}197 198define <2 x i8> @add_non_splat_vector(<2 x i8> %x) {199; CHECK-LABEL: define <2 x i8> @add_non_splat_vector(200; CHECK-SAME: <2 x i8> [[X:%.*]]) {201; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> <i8 0, i8 1>)202; CHECK-NEXT: [[S:%.*]] = add nuw <2 x i8> [[TMP1]], <i8 1, i8 0>203; CHECK-NEXT: ret <2 x i8> [[S]]204;205 %add = add <2 x i8> %x, <i8 1, i8 0>206 %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 1>207 %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>208 ret <2 x i8> %s209}210 211define <2 x i8> @or_splat_vector(<2 x i8> %x) {212; CHECK-LABEL: define <2 x i8> @or_splat_vector(213; CHECK-SAME: <2 x i8> [[X:%.*]]) {214; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X]], <2 x i8> splat (i8 1))215; CHECK-NEXT: [[S:%.*]] = or <2 x i8> [[TMP1]], splat (i8 1)216; CHECK-NEXT: ret <2 x i8> [[S]]217;218 %add = or <2 x i8> %x, <i8 1, i8 1>219 %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0>220 %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>221 ret <2 x i8> %s222}223 224define i8 @const_operands_dont_fold_negative(i8 %x) {225; CHECK-LABEL: define i8 @const_operands_dont_fold_negative(226; CHECK-SAME: i8 [[X:%.*]]) {227; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16228; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 18229; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 25230; CHECK-NEXT: ret i8 [[S]]231;232 %add = add nsw i8 %x, 16233 %cmp = icmp sgt i8 %x, 18234 %s = select i1 %cmp, i8 %add, i8 25235 ret i8 %s236}237 238define i8 @add_with_poison_negative(i8 %x) {239; CHECK-LABEL: define i8 @add_with_poison_negative(240; CHECK-SAME: i8 [[X:%.*]]) {241; CHECK-NEXT: ret i8 25242;243 %add = add nsw i8 %x, poison244 %cmp = icmp sgt i8 %x, 8245 %s = select i1 %cmp, i8 %add, i8 25246 ret i8 %s247}248 249define i8 @add_with_overflow_negative(i8 %x) {250; CHECK-LABEL: define i8 @add_with_overflow_negative(251; CHECK-SAME: i8 [[X:%.*]]) {252; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X]], 100253; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 119254; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 -127, i8 [[ADD]]255; CHECK-NEXT: ret i8 [[S]]256;257 %add = add i8 %x, 100258 %cmp = icmp sle i8 120, %x259 %s = select i1 %cmp, i8 -127, i8 %add260 ret i8 %s261}262 263define <2 x i8> @vector_with_poison_negative(<2 x i8> %x) {264; CHECK-LABEL: define <2 x i8> @vector_with_poison_negative(265; CHECK-SAME: <2 x i8> [[X:%.*]]) {266; CHECK-NEXT: [[ADD:%.*]] = xor <2 x i8> [[X]], <i8 1, i8 poison>267; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt <2 x i8> [[X]], splat (i8 1)268; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[CMP_INV]], <2 x i8> splat (i8 1), <2 x i8> [[ADD]]269; CHECK-NEXT: ret <2 x i8> [[S]]270;271 %add = xor <2 x i8> %x, <i8 1, i8 poison>272 %cmp = icmp sgt <2 x i8> %x, <i8 0, i8 0>273 %s = select <2 x i1> %cmp, <2 x i8> %add, <2 x i8> <i8 1, i8 1>274 ret <2 x i8> %s275}276 277define i8 @multi_use_bop_negative(i8 %x) {278; CHECK-LABEL: define i8 @multi_use_bop_negative(279; CHECK-SAME: i8 [[X:%.*]]) {280; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16281; CHECK-NEXT: call void @use_byte(i8 [[ADD]])282; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 7283; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 24, i8 [[ADD]]284; CHECK-NEXT: ret i8 [[S]]285;286 %add = add nsw i8 %x, 16287 call void @use_byte(i8 %add)288 %cmp = icmp sle i8 8, %x289 %s = select i1 %cmp, i8 24, i8 %add290 ret i8 %s291}292 293define half @float_negative(half %x) {294; CHECK-LABEL: define half @float_negative(295; CHECK-SAME: half [[X:%.*]]) {296; CHECK-NEXT: [[ADD:%.*]] = fmul fast half [[X]], 0xH2E66297; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt half [[X]], 0xH5640298; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], half 0xH4900, half [[ADD]]299; CHECK-NEXT: ret half [[S]]300;301 %add = fdiv fast half %x, 10.0302 %cmp = fcmp ult half 100.0, %x303 %s = select i1 %cmp, half 10.0, half %add304 ret half %s305}306 307define i8 @poison_false_val_negative(i8 %x) {308; CHECK-LABEL: define i8 @poison_false_val_negative(309; CHECK-SAME: i8 [[X:%.*]]) {310; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16311; CHECK-NEXT: ret i8 [[ADD]]312;313 %add = add nsw i8 %x, 16314 %cmp = icmp sgt i8 %x, 8315 %s = select i1 %cmp, i8 %add, i8 poison316 ret i8 %s317}318 319define i8 @eq_negative(i8 %x) {320; CHECK-LABEL: define i8 @eq_negative(321; CHECK-SAME: i8 [[X:%.*]]) {322; CHECK-NEXT: ret i8 24323;324 %add = add nsw i8 %x, 16325 %cmp = icmp eq i8 %x, 8326 %s = select i1 %cmp, i8 %add, i8 24327 ret i8 %s328}329 330define i8 @different_operands_negative(i8 %x, i8 %y) {331; CHECK-LABEL: define i8 @different_operands_negative(332; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {333; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16334; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y]], 8335; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24336; CHECK-NEXT: ret i8 [[S]]337;338 %add = add nsw i8 %x, 16339 %cmp = icmp sgt i8 %y, 8340 %s = select i1 %cmp, i8 %add, i8 24341 ret i8 %s342}343 344define i8 @non_const_bop_operand_negative(i8 %x, i8 %y) {345; CHECK-LABEL: define i8 @non_const_bop_operand_negative(346; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {347; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], [[Y]]348; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y]], 8349; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24350; CHECK-NEXT: ret i8 [[S]]351;352 %add = add nsw i8 %x, %y353 %cmp = icmp sgt i8 %y, 8354 %s = select i1 %cmp, i8 %add, i8 24355 ret i8 %s356}357 358define i8 @non_const_cmp_operand_negative(i8 %x, i8 %y) {359; CHECK-LABEL: define i8 @non_const_cmp_operand_negative(360; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {361; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X]], 16362; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], [[Y]]363; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 24364; CHECK-NEXT: ret i8 [[S]]365;366 %add = add nsw i8 %x, 16367 %cmp = icmp sgt i8 %x, %y368 %s = select i1 %cmp, i8 %add, i8 24369 ret i8 %s370}371 372declare i8 @result()373 374define i8 @non_binop_negative(i8 %x) {375; CHECK-LABEL: define i8 @non_binop_negative(376; CHECK-SAME: i8 [[X:%.*]]) {377; CHECK-NEXT: [[RESULT:%.*]] = call i8 @result()378; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 16379; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[RESULT]], i8 24380; CHECK-NEXT: ret i8 [[S]]381;382 %result = call i8 @result()383 %cmp = icmp sgt i8 %x, 16384 %s = select i1 %cmp, i8 %result, i8 24385 ret i8 %s386}387 388define i8 @sub_const_on_lhs_negative(i8 %x) {389; CHECK-LABEL: define i8 @sub_const_on_lhs_negative(390; CHECK-SAME: i8 [[X:%.*]]) {391; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 50, [[X]]392; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X]], 100393; CHECK-NEXT: [[S:%.*]] = select i1 [[CMP]], i8 [[SUB]], i8 50394; CHECK-NEXT: ret i8 [[S]]395;396 %sub = sub nsw i8 50, %x397 %cmp = icmp ugt i8 %x, 100398 %s = select i1 %cmp, i8 %sub, i8 50399 ret i8 %s400}401 402define i8 @smin_ugt(i8 %x) {403; CHECK-LABEL: define i8 @smin_ugt(404; CHECK-SAME: i8 [[X:%.*]]) {405; CHECK-NEXT: [[S:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 50)406; CHECK-NEXT: ret i8 [[S]]407;408 %smin = call i8 @llvm.smin.i8(i8 %x, i8 50)409 %cmp = icmp ugt i8 %x, 100410 %s = select i1 %cmp, i8 50, i8 %smin411 ret i8 %s412}413 414define i8 @smax_ugt(i8 %x) {415; CHECK-LABEL: define i8 @smax_ugt(416; CHECK-SAME: i8 [[X:%.*]]) {417; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 100)418; CHECK-NEXT: [[S:%.*]] = call i8 @llvm.smax.i8(i8 [[TMP1]], i8 50)419; CHECK-NEXT: ret i8 [[S]]420;421 %smax = call i8 @llvm.smax.i8(i8 %x, i8 50)422 %cmp = icmp ugt i8 %x, 100423 %s = select i1 %cmp, i8 100, i8 %smax424 ret i8 %s425}426 427define i8 @umin_slt(i8 %x) {428; CHECK-LABEL: define i8 @umin_slt(429; CHECK-SAME: i8 [[X:%.*]]) {430; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 0)431; CHECK-NEXT: [[S:%.*]] = call i8 @llvm.umin.i8(i8 [[TMP1]], i8 100)432; CHECK-NEXT: ret i8 [[S]]433;434 %cmp = icmp slt i8 %x, 0435 %umin = tail call i8 @llvm.umin.i8(i8 %x, i8 100)436 %s = select i1 %cmp, i8 0, i8 %umin437 ret i8 %s438}439 440define i8 @umax_sgt(i8 %x) {441; CHECK-LABEL: define i8 @umax_sgt(442; CHECK-SAME: i8 [[X:%.*]]) {443; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)444; CHECK-NEXT: [[S:%.*]] = call i8 @llvm.umax.i8(i8 [[TMP1]], i8 50)445; CHECK-NEXT: ret i8 [[S]]446;447 %cmp = icmp sgt i8 %x, 100448 %umax = tail call i8 @llvm.umax.i8(i8 %x, i8 50)449 %s = select i1 %cmp, i8 100, i8 %umax450 ret i8 %s451}452 453define i8 @add_sgt_nuw_nsw_safe(i8 %x) {454; CHECK-LABEL: define i8 @add_sgt_nuw_nsw_safe(455; CHECK-SAME: i8 [[X:%.*]]) {456; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)457; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 1458; CHECK-NEXT: ret i8 [[S]]459;460 %add = add nuw nsw i8 %x, 1461 %cmp = icmp sgt i8 %x, 100462 %s = select i1 %cmp, i8 101, i8 %add463 ret i8 %s464}465 466define i8 @add_sgt_nuw_only(i8 %x) {467; CHECK-LABEL: define i8 @add_sgt_nuw_only(468; CHECK-SAME: i8 [[X:%.*]]) {469; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)470; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 50471; CHECK-NEXT: ret i8 [[S]]472;473 %add = add nuw nsw i8 %x, 50474 %cmp = icmp sgt i8 %x, 100475 %s = select i1 %cmp, i8 150, i8 %add476 ret i8 %s477}478 479define i8 @add_sgt_nsw_only(i8 %x) {480; CHECK-LABEL: define i8 @add_sgt_nsw_only(481; CHECK-SAME: i8 [[X:%.*]]) {482; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)483; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -99484; CHECK-NEXT: ret i8 [[S]]485;486 %add = add nuw nsw i8 %x, -99487 %cmp = icmp sgt i8 %x, 100488 %s = select i1 %cmp, i8 1, i8 %add489 ret i8 %s490}491 492 493define i8 @mul_ult_nuw_nsw_safe(i8 %x) {494; CHECK-LABEL: define i8 @mul_ult_nuw_nsw_safe(495; CHECK-SAME: i8 [[X:%.*]]) {496; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 10)497; CHECK-NEXT: [[S:%.*]] = mul nuw nsw i8 [[TMP1]], 3498; CHECK-NEXT: ret i8 [[S]]499;500 %mul = mul nuw nsw i8 %x, 3501 %cmp = icmp ult i8 %x, 10502 %s = select i1 %cmp, i8 30, i8 %mul503 ret i8 %s504}505 506define i8 @mul_ult_nuw_only(i8 %x) {507; CHECK-LABEL: define i8 @mul_ult_nuw_only(508; CHECK-SAME: i8 [[X:%.*]]) {509; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 10)510; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 25511; CHECK-NEXT: ret i8 [[S]]512;513 %mul = mul nuw nsw i8 %x, 25514 %cmp = icmp ult i8 %x, 10515 %s = select i1 %cmp, i8 250, i8 %mul516 ret i8 %s517}518 519define i8 @mul_ult_nsw_only(i8 %x) {520; CHECK-LABEL: define i8 @mul_ult_nsw_only(521; CHECK-SAME: i8 [[X:%.*]]) {522; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 40)523; CHECK-NEXT: [[S:%.*]] = mul nsw i8 [[TMP1]], -2524; CHECK-NEXT: ret i8 [[S]]525;526 %mul = mul nuw nsw i8 %x, -2527 %cmp = icmp ult i8 %x, 40528 %s = select i1 %cmp, i8 -80, i8 %mul529 ret i8 %s530}531