brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.4 KiB · fa9323d Raw
749 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=correlated-propagation < %s | FileCheck %s3 4declare void @use.i16(i16)5declare i16 @llvm.usub.sat.i16(i16, i16)6declare i16 @llvm.uadd.sat.i16(i16, i16)7declare i16 @llvm.umin.i16(i16, i16)8declare i16 @llvm.abs.i16(i16, i1)9 10define i16 @sel_true_cond(i16 noundef %x) {11; CHECK-LABEL: @sel_true_cond(12; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[X:%.*]], 1013; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 1014; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SUB1]], i16 4215; CHECK-NEXT:    ret i16 [[SEL]]16;17  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)18  %cmp = icmp uge i16 %x, 1019  %sel = select i1 %cmp, i16 %sub, i16 4220  ret i16 %sel21}22 23define i16 @sel_true_cond_insufficient(i16 %x) {24; CHECK-LABEL: @sel_true_cond_insufficient(25; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)26; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 927; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SUB]], i16 4228; CHECK-NEXT:    ret i16 [[SEL]]29;30  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)31  %cmp = icmp uge i16 %x, 932  %sel = select i1 %cmp, i16 %sub, i16 4233  ret i16 %sel34}35 36define i16 @sel_true_cond_wrong_swap(i16 %x) {37; CHECK-LABEL: @sel_true_cond_wrong_swap(38; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)39; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 1040; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 42, i16 [[SUB]]41; CHECK-NEXT:    ret i16 [[SEL]]42;43  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)44  %cmp = icmp uge i16 %x, 1045  %sel = select i1 %cmp, i16 42, i16 %sub46  ret i16 %sel47}48 49define i16 @sel_true_cond_wrong_op(i16 %x, i16 %y) {50; CHECK-LABEL: @sel_true_cond_wrong_op(51; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)52; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[Y:%.*]], 1053; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SUB]], i16 4254; CHECK-NEXT:    ret i16 [[SEL]]55;56  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)57  %cmp = icmp uge i16 %y, 1058  %sel = select i1 %cmp, i16 %sub, i16 4259  ret i16 %sel60}61 62define i16 @sel_true_cond_extra_use(i16 %x) {63; CHECK-LABEL: @sel_true_cond_extra_use(64; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)65; CHECK-NEXT:    call void @use.i16(i16 [[SUB]])66; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 1067; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SUB]], i16 4268; CHECK-NEXT:    ret i16 [[SEL]]69;70  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)71  call void @use.i16(i16 %sub)72  %cmp = icmp uge i16 %x, 1073  %sel = select i1 %cmp, i16 %sub, i16 4274  ret i16 %sel75}76 77define i16 @sel_true_cond_chain_speculatable(i16 noundef %x) {78; CHECK-LABEL: @sel_true_cond_chain_speculatable(79; CHECK-NEXT:    [[SUB1:%.*]] = add nuw i16 [[X:%.*]], 180; CHECK-NEXT:    [[EXTRA:%.*]] = mul i16 [[SUB1]], 381; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i16 [[X]], -182; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[EXTRA]], i16 4283; CHECK-NEXT:    ret i16 [[SEL]]84;85  %sub = call i16 @llvm.uadd.sat.i16(i16 %x, i16 1)86  %extra = mul i16 %sub, 387  %cmp = icmp ne i16 %x, -188  %sel = select i1 %cmp, i16 %extra, i16 4289  ret i16 %sel90}91 92define i16 @sel_true_cond_chain_non_speculatable(i16 %x) {93; CHECK-LABEL: @sel_true_cond_chain_non_speculatable(94; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[X:%.*]], i16 1)95; CHECK-NEXT:    [[EXTRA:%.*]] = udiv i16 3, [[SUB]]96; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i16 [[X]], -197; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[EXTRA]], i16 4298; CHECK-NEXT:    ret i16 [[SEL]]99;100  %sub = call i16 @llvm.uadd.sat.i16(i16 %x, i16 1)101  %extra = udiv i16 3, %sub102  %cmp = icmp ne i16 %x, -1103  %sel = select i1 %cmp, i16 %extra, i16 42104  ret i16 %sel105}106 107; TODO: We could handle this case by raising the limit on the number of108; instructions we look through.109define i16 @sel_true_cond_longer_chain(i16 %x) {110; CHECK-LABEL: @sel_true_cond_longer_chain(111; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[X:%.*]], i16 1)112; CHECK-NEXT:    [[EXTRA:%.*]] = mul i16 [[SUB]], 3113; CHECK-NEXT:    [[EXTRA2:%.*]] = xor i16 [[SUB]], 7114; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i16 [[X]], -1115; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[EXTRA2]], i16 42116; CHECK-NEXT:    ret i16 [[SEL]]117;118  %sub = call i16 @llvm.uadd.sat.i16(i16 %x, i16 1)119  %extra = mul i16 %sub, 3120  %extra2 = xor i16 %sub, 7121  %cmp = icmp ne i16 %x, -1122  %sel = select i1 %cmp, i16 %extra2, i16 42123  ret i16 %sel124}125 126define i16 @sel_false_cond(i16 noundef %x) {127; CHECK-LABEL: @sel_false_cond(128; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[X:%.*]], 10129; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 10130; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 42, i16 [[SUB1]]131; CHECK-NEXT:    ret i16 [[SEL]]132;133  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)134  %cmp = icmp ult i16 %x, 10135  %sel = select i1 %cmp, i16 42, i16 %sub136  ret i16 %sel137}138 139define i16 @sel_false_cond_insufficient(i16 %x) {140; CHECK-LABEL: @sel_false_cond_insufficient(141; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)142; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 9143; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 42, i16 [[SUB]]144; CHECK-NEXT:    ret i16 [[SEL]]145;146  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)147  %cmp = icmp ult i16 %x, 9148  %sel = select i1 %cmp, i16 42, i16 %sub149  ret i16 %sel150}151 152define i16 @phi_true_cond(i16 %x) {153; CHECK-LABEL: @phi_true_cond(154; CHECK-NEXT:  entry:155; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[X:%.*]], 10156; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 10157; CHECK-NEXT:    br i1 [[CMP]], label [[JOIN:%.*]], label [[SPLIT:%.*]]158; CHECK:       split:159; CHECK-NEXT:    br label [[JOIN]]160; CHECK:       join:161; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB1]], [[ENTRY:%.*]] ], [ 42, [[SPLIT]] ]162; CHECK-NEXT:    ret i16 [[PHI]]163;164entry:165  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)166  %cmp = icmp uge i16 %x, 10167  br i1 %cmp, label %join, label %split168 169split:170  br label %join171 172join:173  %phi = phi i16 [ %sub, %entry ], [ 42, %split ]174  ret i16 %phi175}176 177define i16 @phi_true_cond_insufficient(i16 %x) {178; CHECK-LABEL: @phi_true_cond_insufficient(179; CHECK-NEXT:  entry:180; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)181; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 9182; CHECK-NEXT:    br i1 [[CMP]], label [[JOIN:%.*]], label [[SPLIT:%.*]]183; CHECK:       split:184; CHECK-NEXT:    br label [[JOIN]]185; CHECK:       join:186; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB]], [[ENTRY:%.*]] ], [ 42, [[SPLIT]] ]187; CHECK-NEXT:    ret i16 [[PHI]]188;189entry:190  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)191  %cmp = icmp uge i16 %x, 9192  br i1 %cmp, label %join, label %split193 194split:195  br label %join196 197join:198  %phi = phi i16 [ %sub, %entry ], [ 42, %split ]199  ret i16 %phi200}201 202; TODO: We could handle this by using conditions that are not directly on the203; phi edge.204define i16 @phi_true_cond_non_local(i16 %x) {205; CHECK-LABEL: @phi_true_cond_non_local(206; CHECK-NEXT:  entry:207; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)208; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i16 [[X]], 10209; CHECK-NEXT:    br i1 [[CMP]], label [[SPLIT:%.*]], label [[JOIN:%.*]]210; CHECK:       split:211; CHECK-NEXT:    br label [[JOIN]]212; CHECK:       join:213; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB]], [[SPLIT]] ], [ 42, [[ENTRY:%.*]] ]214; CHECK-NEXT:    ret i16 [[PHI]]215;216entry:217  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)218  %cmp = icmp uge i16 %x, 10219  br i1 %cmp, label %split, label %join220 221split:222  br label %join223 224join:225  %phi = phi i16 [ %sub, %split ], [ 42, %entry ]226  ret i16 %phi227}228 229define i16 @phi_false_cond(i16 %x) {230; CHECK-LABEL: @phi_false_cond(231; CHECK-NEXT:  entry:232; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i16 [[X:%.*]], 10233; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 10234; CHECK-NEXT:    br i1 [[CMP]], label [[SPLIT:%.*]], label [[JOIN:%.*]]235; CHECK:       split:236; CHECK-NEXT:    br label [[JOIN]]237; CHECK:       join:238; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB1]], [[ENTRY:%.*]] ], [ 42, [[SPLIT]] ]239; CHECK-NEXT:    ret i16 [[PHI]]240;241entry:242  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)243  %cmp = icmp ult i16 %x, 10244  br i1 %cmp, label %split, label %join245 246split:247  br label %join248 249join:250  %phi = phi i16 [ %sub, %entry ], [ 42, %split ]251  ret i16 %phi252}253 254define i16 @phi_false_cond_insufficient(i16 %x) {255; CHECK-LABEL: @phi_false_cond_insufficient(256; CHECK-NEXT:  entry:257; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)258; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 9259; CHECK-NEXT:    br i1 [[CMP]], label [[SPLIT:%.*]], label [[JOIN:%.*]]260; CHECK:       split:261; CHECK-NEXT:    br label [[JOIN]]262; CHECK:       join:263; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB]], [[ENTRY:%.*]] ], [ 42, [[SPLIT]] ]264; CHECK-NEXT:    ret i16 [[PHI]]265;266entry:267  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)268  %cmp = icmp ult i16 %x, 9269  br i1 %cmp, label %split, label %join270 271split:272  br label %join273 274join:275  %phi = phi i16 [ %sub, %entry ], [ 42, %split ]276  ret i16 %phi277}278 279; TODO: We could handle this by using conditions that are not directly on the280; phi edge.281define i16 @phi_false_cond_non_local(i16 %x) {282; CHECK-LABEL: @phi_false_cond_non_local(283; CHECK-NEXT:  entry:284; CHECK-NEXT:    [[SUB:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[X:%.*]], i16 10)285; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 10286; CHECK-NEXT:    br i1 [[CMP]], label [[JOIN:%.*]], label [[SPLIT:%.*]]287; CHECK:       split:288; CHECK-NEXT:    br label [[JOIN]]289; CHECK:       join:290; CHECK-NEXT:    [[PHI:%.*]] = phi i16 [ [[SUB]], [[SPLIT]] ], [ 42, [[ENTRY:%.*]] ]291; CHECK-NEXT:    ret i16 [[PHI]]292;293entry:294  %sub = call i16 @llvm.usub.sat.i16(i16 %x, i16 10)295  %cmp = icmp ult i16 %x, 10296  br i1 %cmp, label %join, label %split297 298split:299  br label %join300 301join:302  %phi = phi i16 [ %sub, %split ], [ 42, %entry ]303  ret i16 %phi304}305 306define i16 @loop_cond() {307; CHECK-LABEL: @loop_cond(308; CHECK-NEXT:  entry:309; CHECK-NEXT:    br label [[LOOP:%.*]]310; CHECK:       loop:311; CHECK-NEXT:    [[IV:%.*]] = phi i16 [ 1000, [[ENTRY:%.*]] ], [ [[IV_NEXT1:%.*]], [[LOOP]] ]312; CHECK-NEXT:    [[COUNT:%.*]] = phi i16 [ 0, [[ENTRY]] ], [ [[COUNT_NEXT:%.*]], [[LOOP]] ]313; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[IV]], 0314; CHECK-NEXT:    [[IV_NEXT1]] = sub nuw i16 [[IV]], 1315; CHECK-NEXT:    [[COUNT_NEXT]] = add i16 [[COUNT]], 1316; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]317; CHECK:       exit:318; CHECK-NEXT:    ret i16 [[COUNT]]319;320entry:321  br label %loop322 323loop:324  %iv = phi i16 [ 1000, %entry ], [ %iv.next, %loop ]325  %count = phi i16 [ 0, %entry ], [ %count.next, %loop ]326  %cmp = icmp eq i16 %iv, 0327  %iv.next = call i16 @llvm.usub.sat.i16(i16 %iv, i16 1)328  %count.next = add i16 %count, 1329  br i1 %cmp, label %exit, label %loop330 331exit:332  ret i16 %count333}334 335define i16 @urem_elide(i16 noundef %x) {336; CHECK-LABEL: @urem_elide(337; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 42338; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[X]], i16 24339; CHECK-NEXT:    ret i16 [[SEL]]340;341  %urem = urem i16 %x, 42342  %cmp = icmp ult i16 %x, 42343  %sel = select i1 %cmp, i16 %urem, i16 24344  ret i16 %sel345}346 347define i16 @urem_expand(i16 noundef %x) {348; CHECK-LABEL: @urem_expand(349; CHECK-NEXT:    [[UREM_UREM:%.*]] = sub nuw i16 [[X:%.*]], 42350; CHECK-NEXT:    [[UREM_CMP:%.*]] = icmp ult i16 [[X]], 42351; CHECK-NEXT:    [[UREM:%.*]] = select i1 [[UREM_CMP]], i16 [[X]], i16 [[UREM_UREM]]352; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 84353; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[UREM]], i16 24354; CHECK-NEXT:    ret i16 [[SEL]]355;356  %urem = urem i16 %x, 42357  %cmp = icmp ult i16 %x, 84358  %sel = select i1 %cmp, i16 %urem, i16 24359  ret i16 %sel360}361 362define i16 @urem_narrow(i16 noundef %x) {363; CHECK-LABEL: @urem_narrow(364; CHECK-NEXT:    [[UREM_LHS_TRUNC:%.*]] = trunc i16 [[X:%.*]] to i8365; CHECK-NEXT:    [[UREM1:%.*]] = urem i8 [[UREM_LHS_TRUNC]], 42366; CHECK-NEXT:    [[UREM_ZEXT:%.*]] = zext i8 [[UREM1]] to i16367; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 85368; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[UREM_ZEXT]], i16 24369; CHECK-NEXT:    ret i16 [[SEL]]370;371  %urem = urem i16 %x, 42372  %cmp = icmp ult i16 %x, 85373  %sel = select i1 %cmp, i16 %urem, i16 24374  ret i16 %sel375}376 377define i16 @urem_insufficient(i16 %x) {378; CHECK-LABEL: @urem_insufficient(379; CHECK-NEXT:    [[UREM:%.*]] = urem i16 [[X:%.*]], 42380; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 257381; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[UREM]], i16 24382; CHECK-NEXT:    ret i16 [[SEL]]383;384  %urem = urem i16 %x, 42385  %cmp = icmp ult i16 %x, 257386  %sel = select i1 %cmp, i16 %urem, i16 24387  ret i16 %sel388}389 390define i16 @srem_elide(i16 noundef %x) {391; CHECK-LABEL: @srem_elide(392; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i16 [[X:%.*]], 42393; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i16 [[X]], -42394; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]395; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[AND]], i16 [[X]], i16 24396; CHECK-NEXT:    ret i16 [[SEL]]397;398  %srem = srem i16 %x, 42399  %cmp1 = icmp slt i16 %x, 42400  %cmp2 = icmp sgt i16 %x, -42401  %and = and i1 %cmp1, %cmp2402  %sel = select i1 %and, i16 %srem, i16 24403  ret i16 %sel404}405 406define i16 @srem_narrow(i16 noundef %x) {407; CHECK-LABEL: @srem_narrow(408; CHECK-NEXT:    [[SREM_LHS_TRUNC:%.*]] = trunc i16 [[X:%.*]] to i8409; CHECK-NEXT:    [[SREM1:%.*]] = srem i8 [[SREM_LHS_TRUNC]], 42410; CHECK-NEXT:    [[SREM_SEXT:%.*]] = sext i8 [[SREM1]] to i16411; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i16 [[X]], 43412; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i16 [[X]], -43413; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]414; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[AND]], i16 [[SREM_SEXT]], i16 24415; CHECK-NEXT:    ret i16 [[SEL]]416;417  %srem = srem i16 %x, 42418  %cmp1 = icmp slt i16 %x, 43419  %cmp2 = icmp sgt i16 %x, -43420  %and = and i1 %cmp1, %cmp2421  %sel = select i1 %and, i16 %srem, i16 24422  ret i16 %sel423}424 425define i16 @srem_convert(i16 noundef %x) {426; CHECK-LABEL: @srem_convert(427; CHECK-NEXT:    [[X_NONNEG:%.*]] = sub i16 0, [[X:%.*]]428; CHECK-NEXT:    [[SREM1:%.*]] = urem i16 [[X_NONNEG]], 42429; CHECK-NEXT:    [[SREM1_NEG:%.*]] = sub i16 0, [[SREM1]]430; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[X]], 0431; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SREM1_NEG]], i16 24432; CHECK-NEXT:    ret i16 [[SEL]]433;434  %srem = srem i16 %x, 42435  %cmp = icmp slt i16 %x, 0436  %sel = select i1 %cmp, i16 %srem, i16 24437  ret i16 %sel438}439 440define i16 @sdiv_convert(i16 noundef %x) {441; CHECK-LABEL: @sdiv_convert(442; CHECK-NEXT:    [[X_NONNEG:%.*]] = sub i16 0, [[X:%.*]]443; CHECK-NEXT:    [[SREM1:%.*]] = udiv i16 [[X_NONNEG]], 42444; CHECK-NEXT:    [[SREM1_NEG:%.*]] = sub i16 0, [[SREM1]]445; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[X]], 0446; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[SREM1_NEG]], i16 24447; CHECK-NEXT:    ret i16 [[SEL]]448;449  %srem = sdiv i16 %x, 42450  %cmp = icmp slt i16 %x, 0451  %sel = select i1 %cmp, i16 %srem, i16 24452  ret i16 %sel453}454 455define i16 @abs_elide(i16 %x) {456; CHECK-LABEL: @abs_elide(457; CHECK-NEXT:    [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false)458; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i16 [[X]], -32768459; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[ABS]], i16 42460; CHECK-NEXT:    ret i16 [[SEL]]461;462  %abs = call i16 @llvm.abs.i16(i16 %x, i1 false)463  %cmp = icmp ule i16 %x, 32768464  %sel = select i1 %cmp, i16 %abs, i16 42465  ret i16 %sel466}467 468define i16 @abs_elide2(i16 %x) {469; CHECK-LABEL: @abs_elide2(470; CHECK-NEXT:    [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false)471; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i16 [[X]], 0472; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[ABS]], i16 42473; CHECK-NEXT:    ret i16 [[SEL]]474;475  %abs = call i16 @llvm.abs.i16(i16 %x, i1 false)476  %cmp = icmp sle i16 %x, 0477  %sel = select i1 %cmp, i16 %abs, i16 42478  ret i16 %sel479}480 481define i16 @abs_not_int_min(i16 %x) {482; CHECK-LABEL: @abs_not_int_min(483; CHECK-NEXT:    [[ABS:%.*]] = call i16 @llvm.abs.i16(i16 [[X:%.*]], i1 false)484; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i16 [[X]], -32768485; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[ABS]], i16 42486; CHECK-NEXT:    ret i16 [[SEL]]487;488  %abs = call i16 @llvm.abs.i16(i16 %x, i1 false)489  %cmp = icmp ne i16 %x, 32768490  %sel = select i1 %cmp, i16 %abs, i16 42491  ret i16 %sel492}493 494define i16 @umin_elide(i16 %x) {495; CHECK-LABEL: @umin_elide(496; CHECK-NEXT:    [[MIN:%.*]] = call i16 @llvm.umin.i16(i16 [[X:%.*]], i16 10)497; CHECK-NEXT:    [[CMP:%.*]] = icmp ule i16 [[X]], 10498; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[MIN]], i16 42499; CHECK-NEXT:    ret i16 [[SEL]]500;501  %min = call i16 @llvm.umin.i16(i16 %x, i16 10)502  %cmp = icmp ule i16 %x, 10503  %sel = select i1 %cmp, i16 %min, i16 42504  ret i16 %sel505}506 507define i16 @ashr_convert(i16 noundef %x, i16 %y) {508; CHECK-LABEL: @ashr_convert(509; CHECK-NEXT:    [[ASHR:%.*]] = lshr i16 [[X:%.*]], [[Y:%.*]]510; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i16 [[X]], 0511; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[ASHR]], i16 24512; CHECK-NEXT:    ret i16 [[SEL]]513;514  %ashr = ashr i16 %x, %y515  %cmp = icmp sge i16 %x, 0516  %sel = select i1 %cmp, i16 %ashr, i16 24517  ret i16 %sel518}519 520define i32 @sext_convert(i16 noundef %x) {521; CHECK-LABEL: @sext_convert(522; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i16 [[X:%.*]] to i32523; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i16 [[X]], 0524; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 [[EXT]], i32 24525; CHECK-NEXT:    ret i32 [[SEL]]526;527  %ext = sext i16 %x to i32528  %cmp = icmp sge i16 %x, 0529  %sel = select i1 %cmp, i32 %ext, i32 24530  ret i32 %sel531}532 533define i16 @infer_flags(i16 %x) {534; CHECK-LABEL: @infer_flags(535; CHECK-NEXT:    [[ADD:%.*]] = add i16 [[X:%.*]], 42536; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 100537; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[ADD]], i16 24538; CHECK-NEXT:    ret i16 [[SEL]]539;540  %add = add i16 %x, 42541  %cmp = icmp ult i16 %x, 100542  %sel = select i1 %cmp, i16 %add, i16 24543  ret i16 %sel544}545 546define i16 @and_elide(i16 noundef %x) {547; CHECK-LABEL: @and_elide(548; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 8549; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[X]], i16 24550; CHECK-NEXT:    ret i16 [[SEL]]551;552  %and = and i16 %x, 7553  %cmp = icmp ult i16 %x, 8554  %sel = select i1 %cmp, i16 %and, i16 24555  ret i16 %sel556}557 558define i16 @and_elide_trunc_cond(i16 noundef %x) {559; CHECK-LABEL: @and_elide_trunc_cond(560; CHECK-NEXT:    [[CMP:%.*]] = trunc nuw i16 [[X:%.*]] to i1561; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[X]], i16 24562; CHECK-NEXT:    ret i16 [[SEL]]563;564  %and = and i16 %x, 1565  %cmp = trunc nuw i16 %x to i1566  %sel = select i1 %cmp, i16 %and, i16 24567  ret i16 %sel568}569 570define <2 x i8> @and_elide_trunc_cond_vec(<2 x i8> noundef %x) {571; CHECK-LABEL: @and_elide_trunc_cond_vec(572; CHECK-NEXT:    [[CMP:%.*]] = trunc nuw <2 x i8> [[X:%.*]] to <2 x i1>573; CHECK-NEXT:    [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i8> [[X]], <2 x i8> splat (i8 24)574; CHECK-NEXT:    ret <2 x i8> [[SEL]]575;576  %and = and <2 x i8> %x, splat (i8 1)577  %cmp = trunc nuw <2 x i8> %x to <2 x i1>578  %sel = select <2 x i1> %cmp, <2 x i8> %and, <2 x i8> splat (i8 24)579  ret <2 x i8> %sel580}581 582define i16 @cond_value_may_not_well_defined(i16 %x) {583; CHECK-LABEL: @cond_value_may_not_well_defined(584; CHECK-NEXT:    [[AND:%.*]] = and i16 [[X:%.*]], 7585; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 8586; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[AND]], i16 24587; CHECK-NEXT:    ret i16 [[SEL]]588;589  %and = and i16 %x, 7590  %cmp = icmp ult i16 %x, 8591  %sel = select i1 %cmp, i16 %and, i16 24592  ret i16 %sel593}594 595define i16 @and_elide_poison_flags(i16 noundef %a) {596; CHECK-LABEL: @and_elide_poison_flags(597; CHECK-NEXT:    [[X:%.*]] = add nuw i16 [[A:%.*]], 1598; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 8599; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[X]], i16 24600; CHECK-NEXT:    ret i16 [[SEL]]601;602  %x = add nuw i16 %a, 1603  %and = and i16 %x, 7604  %cmp = icmp ult i16 %x, 8605  %sel = select i1 %cmp, i16 %and, i16 24606  ret i16 %sel607}608 609define i16 @and_elide_poison_flags_missing_noundef(i16 %a) {610; CHECK-LABEL: @and_elide_poison_flags_missing_noundef(611; CHECK-NEXT:    [[X:%.*]] = add nuw i16 [[A:%.*]], 1612; CHECK-NEXT:    [[AND:%.*]] = and i16 [[X]], 7613; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i16 [[X]], 8614; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i16 [[AND]], i16 24615; CHECK-NEXT:    ret i16 [[SEL]]616;617  %x = add nuw i16 %a, 1618  %and = and i16 %x, 7619  %cmp = icmp ult i16 %x, 8620  %sel = select i1 %cmp, i16 %and, i16 24621  ret i16 %sel622}623 624define i32 @pr87854(i32 noundef %x.1, i32 noundef %i) {625; CHECK-LABEL: @pr87854(626; CHECK-NEXT:    [[COND:%.*]] = icmp sgt i32 [[X_1:%.*]], -1627; CHECK-NEXT:    tail call void @llvm.assume(i1 [[COND]])628; CHECK-NEXT:    [[INBOUNDS:%.*]] = icmp ult i32 [[I:%.*]], [[X_1]]629; CHECK-NEXT:    [[NEXT:%.*]] = add nuw i32 [[I]], 1630; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[INBOUNDS]], i32 [[NEXT]], i32 -1631; CHECK-NEXT:    ret i32 [[SPEC_SELECT]]632;633  %cond = icmp sgt i32 %x.1, -1634  tail call void @llvm.assume(i1 %cond)635  %inbounds = icmp ult i32 %i, %x.1636  %next = add i32 %i, 1637  %spec.select = select i1 %inbounds, i32 %next, i32 -1638  ret i32 %spec.select639}640 641define i64 @test_shl_nsw_at_use(i64 noundef %x) {642; CHECK-LABEL: @test_shl_nsw_at_use(643; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[X:%.*]], 2147483648644; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[ADD]], 4294967296645; CHECK-NEXT:    [[SHL:%.*]] = shl nsw i64 [[X]], 32646; CHECK-NEXT:    [[SHR:%.*]] = ashr exact i64 [[SHL]], 32647; CHECK-NEXT:    [[RES:%.*]] = select i1 [[CMP]], i64 [[SHR]], i64 0648; CHECK-NEXT:    ret i64 [[RES]]649;650  %add = add i64 %x, 2147483648651  %cmp = icmp ult i64 %add, 4294967296652  %shl = shl i64 %x, 32653  %shr = ashr exact i64 %shl, 32654  %res = select i1 %cmp, i64 %shr, i64 0655  ret i64 %res656}657 658define i1 @test_icmp_mod(i64 noundef %x) {659; CHECK-LABEL: @test_icmp_mod(660; CHECK-NEXT:  entry:661; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[X:%.*]], 86400662; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[REM]], 0663; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0664; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]665; CHECK-NEXT:    ret i1 false666;667entry:668  %rem = srem i64 %x, 86400669  %cmp = icmp slt i64 %rem, 0670  %cond = select i1 %cmp, i64 86400, i64 0671  %add = add nsw i64 %cond, %rem672  %cmp1 = icmp ugt i64 %add, 86399673  ret i1 %cmp1674}675 676define i1 @test_icmp_mod_commuted1(i64 noundef %x) {677; CHECK-LABEL: @test_icmp_mod_commuted1(678; CHECK-NEXT:  entry:679; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[X:%.*]], 86400680; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[REM]], 0681; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0682; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[REM]], [[COND]]683; CHECK-NEXT:    ret i1 false684;685entry:686  %rem = srem i64 %x, 86400687  %cmp = icmp slt i64 %rem, 0688  %cond = select i1 %cmp, i64 86400, i64 0689  %add = add nsw i64 %rem, %cond690  %cmp1 = icmp ugt i64 %add, 86399691  ret i1 %cmp1692}693 694define i1 @test_icmp_mod_commuted2(i64 noundef %x) {695; CHECK-LABEL: @test_icmp_mod_commuted2(696; CHECK-NEXT:  entry:697; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[X:%.*]], 86400698; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[REM]], -1699; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i64 0, i64 86400700; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]701; CHECK-NEXT:    ret i1 false702;703entry:704  %rem = srem i64 %x, 86400705  %cmp = icmp sgt i64 %rem, -1706  %cond = select i1 %cmp, i64 0, i64 86400707  %add = add nsw i64 %cond, %rem708  %cmp1 = icmp ugt i64 %add, 86399709  ret i1 %cmp1710}711 712define i1 @test_icmp_mod_undef(i64 %x) {713; CHECK-LABEL: @test_icmp_mod_undef(714; CHECK-NEXT:  entry:715; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[X:%.*]], 86400716; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[REM]], 0717; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i64 86400, i64 0718; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]719; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i64 [[ADD]], 86399720; CHECK-NEXT:    ret i1 [[CMP1]]721;722entry:723  %rem = srem i64 %x, 86400724  %cmp = icmp slt i64 %rem, 0725  %cond = select i1 %cmp, i64 86400, i64 0726  %add = add nsw i64 %cond, %rem727  %cmp1 = icmp ugt i64 %add, 86399728  ret i1 %cmp1729}730 731define i1 @test_icmp_mod_wrong_range(i64 noundef %x) {732; CHECK-LABEL: @test_icmp_mod_wrong_range(733; CHECK-NEXT:  entry:734; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[X:%.*]], 86400735; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[REM]], 0736; CHECK-NEXT:    [[COND:%.*]] = select i1 [[CMP]], i64 86401, i64 0737; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[COND]], [[REM]]738; CHECK-NEXT:    [[CMP1:%.*]] = icmp samesign ugt i64 [[ADD]], 86399739; CHECK-NEXT:    ret i1 [[CMP1]]740;741entry:742  %rem = srem i64 %x, 86400743  %cmp = icmp slt i64 %rem, 0744  %cond = select i1 %cmp, i64 86401, i64 0745  %add = add nsw i64 %cond, %rem746  %cmp1 = icmp ugt i64 %add, 86399747  ret i1 %cmp1748}749