brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.2 KiB · f0e40f4 Raw
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