brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.9 KiB · a8a474e Raw
745 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) {5; CHECK-LABEL: @test.not.uge.ult(6; CHECK-NEXT:  entry:7; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 38; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]9; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]10; CHECK:       if.then:11; CHECK-NEXT:    ret void12; CHECK:       if.end:13; CHECK-NEXT:    call void @use(i1 true)14; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 115; CHECK-NEXT:    call void @use(i1 true)16; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 217; CHECK-NEXT:    call void @use(i1 true)18; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 319; CHECK-NEXT:    call void @use(i1 true)20; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 421; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]22; CHECK-NEXT:    call void @use(i1 [[C_4]])23; CHECK-NEXT:    ret void24;25entry:26  %add.ptr.i = add nuw i8 %start, 327  %c.1 = icmp uge i8 %add.ptr.i, %high28  br i1 %c.1, label %if.then, label %if.end29 30if.then:                                          ; preds = %entry31  ret void32 33if.end:                                           ; preds = %entry34  %t.0 = icmp ult i8 %start, %high35  call void @use(i1 %t.0)36  %start.1 = add nuw i8 %start, 137  %t.1 = icmp ult i8 %start.1, %high38  call void @use(i1 %t.1)39  %start.2 = add nuw i8 %start, 240  %t.2 = icmp ult i8 %start.2, %high41  call void @use(i1 %t.2)42  %start.3 = add nuw i8 %start, 343  %t.3 = icmp ult i8 %start.3, %high44  call void @use(i1 %t.3)45  %start.4 = add nuw i8 %start, 446  %c.4 = icmp ult i8 %start.4, %high47  call void @use(i1 %c.4)48  ret void49}50 51define void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) {52; CHECK-LABEL: @test.not.uge.ule(53; CHECK-NEXT:  entry:54; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 355; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]56; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]57; CHECK:       if.then:58; CHECK-NEXT:    ret void59; CHECK:       if.end:60; CHECK-NEXT:    call void @use(i1 true)61; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 162; CHECK-NEXT:    call void @use(i1 true)63; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 264; CHECK-NEXT:    call void @use(i1 true)65; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 366; CHECK-NEXT:    call void @use(i1 true)67; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 468; CHECK-NEXT:    call void @use(i1 true)69; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 570; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]]71; CHECK-NEXT:    call void @use(i1 [[C_5]])72; CHECK-NEXT:    ret void73;74entry:75  %add.ptr.i = add nuw i8 %start, 376  %c.1 = icmp uge i8 %add.ptr.i, %high77  br i1 %c.1, label %if.then, label %if.end78 79if.then:                                          ; preds = %entry80  ret void81 82if.end:                                           ; preds = %entry83  %t.0 = icmp ule i8 %start, %high84  call void @use(i1 %t.0)85  %start.1 = add nuw i8 %start, 186  %t.1 = icmp ule i8 %start.1, %high87  call void @use(i1 %t.1)88  %start.2 = add nuw i8 %start, 289  %t.2 = icmp ule i8 %start.2, %high90  call void @use(i1 %t.2)91  %start.3 = add nuw i8 %start, 392  %t.3 = icmp ule i8 %start.3, %high93  call void @use(i1 %t.3)94  %start.4 = add nuw i8 %start, 495  %t.4 = icmp ule i8 %start.4, %high96  call void @use(i1 %t.4)97 98  %start.5 = add nuw i8 %start, 599  %c.5 = icmp ule i8 %start.5, %high100  call void @use(i1 %c.5)101 102  ret void103}104 105define void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) {106; CHECK-LABEL: @test.not.uge.ugt(107; CHECK-NEXT:  entry:108; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3109; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]110; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]111; CHECK:       if.then:112; CHECK-NEXT:    ret void113; CHECK:       if.end:114; CHECK-NEXT:    call void @use(i1 false)115; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1116; CHECK-NEXT:    call void @use(i1 false)117; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2118; CHECK-NEXT:    call void @use(i1 false)119; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3120; CHECK-NEXT:    call void @use(i1 false)121; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4122; CHECK-NEXT:    call void @use(i1 false)123; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 5124; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]]125; CHECK-NEXT:    call void @use(i1 [[C_5]])126; CHECK-NEXT:    ret void127;128entry:129  %add.ptr.i = add nuw i8 %start, 3130  %c.1 = icmp uge i8 %add.ptr.i, %high131  br i1 %c.1, label %if.then, label %if.end132 133if.then:                                          ; preds = %entry134  ret void135 136if.end:                                           ; preds = %entry137  %f.0 = icmp ugt i8 %start, %high138  call void @use(i1 %f.0)139 140  %start.1 = add nuw i8 %start, 1141  %f.1 = icmp ugt i8 %start.1, %high142  call void @use(i1 %f.1)143 144  %start.2 = add nuw i8 %start, 2145  %f.2 = icmp ugt i8 %start.2, %high146  call void @use(i1 %f.2)147 148  %start.3 = add nuw i8 %start, 3149  %f.3 = icmp ugt i8 %start.3, %high150  call void @use(i1 %f.3)151 152  %start.4 = add nuw i8 %start, 4153  %f.4 = icmp ugt i8 %start.4, %high154  call void @use(i1 %f.4)155 156  %start.5 = add nuw i8 %start, 5157  %c.5 = icmp ugt i8 %start.5, %high158  call void @use(i1 %c.5)159 160  ret void161}162 163define void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) {164; CHECK-LABEL: @test.not.uge.uge(165; CHECK-NEXT:  entry:166; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add nuw i8 [[START:%.*]], 3167; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]168; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]169; CHECK:       if.then:170; CHECK-NEXT:    ret void171; CHECK:       if.end:172; CHECK-NEXT:    call void @use(i1 false)173; CHECK-NEXT:    [[START_1:%.*]] = add nuw i8 [[START]], 1174; CHECK-NEXT:    call void @use(i1 false)175; CHECK-NEXT:    [[START_2:%.*]] = add nuw i8 [[START]], 2176; CHECK-NEXT:    call void @use(i1 false)177; CHECK-NEXT:    [[START_3:%.*]] = add nuw i8 [[START]], 3178; CHECK-NEXT:    call void @use(i1 false)179; CHECK-NEXT:    [[START_4:%.*]] = add nuw i8 [[START]], 4180; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]181; CHECK-NEXT:    call void @use(i1 [[C_4]])182; CHECK-NEXT:    [[START_5:%.*]] = add nuw i8 [[START]], 5183; CHECK-NEXT:    [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]184; CHECK-NEXT:    call void @use(i1 [[C_5]])185; CHECK-NEXT:    ret void186;187entry:188  %add.ptr.i = add nuw i8 %start, 3189  %c.1 = icmp uge i8 %add.ptr.i, %high190  br i1 %c.1, label %if.then, label %if.end191 192if.then:                                          ; preds = %entry193  ret void194 195if.end:                                           ; preds = %entry196  %f.0 = icmp ugt i8 %start, %high197  call void @use(i1 %f.0)198 199  %start.1 = add nuw i8 %start, 1200  %f.1 = icmp uge i8 %start.1, %high201  call void @use(i1 %f.1)202 203  %start.2 = add nuw i8 %start, 2204  %f.2 = icmp uge i8 %start.2, %high205  call void @use(i1 %f.2)206 207  %start.3 = add nuw i8 %start, 3208  %f.3 = icmp uge i8 %start.3, %high209  call void @use(i1 %f.3)210 211  %start.4 = add nuw i8 %start, 4212  %c.4 = icmp uge i8 %start.4, %high213  call void @use(i1 %c.4)214 215  %start.5 = add nuw i8 %start, 5216  %c.5 = icmp uge i8 %start.5, %high217  call void @use(i1 %c.5)218 219  ret void220}221 222define void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) {223; CHECK-LABEL: @test.decompose.nonconst(224; CHECK-NEXT:  entry:225; CHECK-NEXT:    [[C_0:%.*]] = icmp uge i8 [[A:%.*]], [[C:%.*]]226; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[C]]227; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]228; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]229; CHECK:       if.then:230; CHECK-NEXT:    [[AND_1:%.*]] = and i1 true, true231; CHECK-NEXT:    br i1 [[AND_1]], label [[IF_THEN_2:%.*]], label [[IF_END]]232; CHECK:       if.then.2:233; CHECK-NEXT:    [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]]234; CHECK-NEXT:    call void @use(i1 true)235; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]236; CHECK-NEXT:    call void @use(i1 true)237; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]238; CHECK-NEXT:    call void @use(i1 true)239; CHECK-NEXT:    ret void240; CHECK:       if.end:241; CHECK-NEXT:    ret void242;243entry:244  %c.0 = icmp uge i8 %a, %c245  %c.1 = icmp uge i8 %b, %c246  %and.0 = and i1 %c.0, %c.1247  br i1 %and.0, label %if.then, label %if.end248 249if.then:                                          ; preds = %entry250  %c.2 = icmp uge i8 %a, 0251  %c.3 = icmp uge i8 %b, 0252  %and.1 = and i1 %c.2, %c.3253  br i1 %and.1, label %if.then.2, label %if.end254 255if.then.2:256  %add.0 = add nuw i8 %a, %b257  %t.0 = icmp uge i8 %add.0, %c258  call void @use(i1 %t.0)259  %add.1 = add nuw i8 %a, %a260  %t.1 = icmp uge i8 %add.0, %c261  call void @use(i1 %t.1)262  %add.2 = add nuw i8 %a, %d263  %c.4 = icmp uge i8 %add.2, %c264  call void @use(i1 %c.4)265  ret void266 267if.end:                                           ; preds = %entry268  ret void269}270 271define void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) {272; CHECK-LABEL: @test.decompose.nonconst.no.null.check(273; CHECK-NEXT:  entry:274; CHECK-NEXT:    [[C_0:%.*]] = icmp uge i8 [[A:%.*]], [[C:%.*]]275; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[C]]276; CHECK-NEXT:    [[AND_0:%.*]] = and i1 [[C_0]], [[C_1]]277; CHECK-NEXT:    br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]278; CHECK:       if.then:279; CHECK-NEXT:    [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]]280; CHECK-NEXT:    call void @use(i1 true)281; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]282; CHECK-NEXT:    call void @use(i1 true)283; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]284; CHECK-NEXT:    call void @use(i1 true)285; CHECK-NEXT:    ret void286; CHECK:       if.end:287; CHECK-NEXT:    ret void288;289entry:290  %c.0 = icmp uge i8 %a, %c291  %c.1 = icmp uge i8 %b, %c292  %and.0 = and i1 %c.0, %c.1293  br i1 %and.0, label %if.then, label %if.end294 295if.then:                                          ; preds = %entry296  %add.0 = add nuw i8 %a, %b297  %t.0 = icmp uge i8 %add.0, %c298  call void @use(i1 %t.0)299  %add.1 = add nuw i8 %a, %a300  %t.1 = icmp uge i8 %add.0, %c301  call void @use(i1 %t.1)302  %add.2 = add nuw i8 %a, %d303  %c.4 = icmp uge i8 %add.2, %c304  call void @use(i1 %c.4)305  ret void306 307if.end:                                           ; preds = %entry308  ret void309}310 311 312define i1 @test_n_must_ule_1_due_to_nuw(i8 %n, i8 %i) {313; CHECK-LABEL: @test_n_must_ule_1_due_to_nuw(314; CHECK-NEXT:  entry:315; CHECK-NEXT:    [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -1316; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]317; CHECK-NEXT:    br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]318; CHECK:       if.then:319; CHECK-NEXT:    ret i1 true320; CHECK:       if.end:321; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1322; CHECK-NEXT:    ret i1 [[F]]323;324entry:325  %sub.n.1 = add nuw i8 %n, -1326  %add = add nuw i8 %i, %sub.n.1327  %c.1 = icmp uge i8 %i, %add328  br i1 %c.1, label %if.then, label %if.end329 330if.then:                                          ; preds = %entry331  %t = icmp ule i8 %n, 1332  ret i1 %t333 334if.end:                                           ; preds = %entry335  %f = icmp ule i8 %n, 1336  ret i1 %f337}338 339 340define i1 @test_n_unknown_missing_nuw(i8 %n, i8 %i) {341; CHECK-LABEL: @test_n_unknown_missing_nuw(342; CHECK-NEXT:  entry:343; CHECK-NEXT:    [[SUB_N_1:%.*]] = add i8 [[N:%.*]], -1344; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[I:%.*]], [[SUB_N_1]]345; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]346; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]347; CHECK:       if.then:348; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[N]], 1349; CHECK-NEXT:    ret i1 [[T]]350; CHECK:       if.end:351; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1352; CHECK-NEXT:    ret i1 [[F]]353;354entry:355  %sub.n.1 = add i8 %n, -1356  %add = add i8 %i, %sub.n.1357  %c.1 = icmp uge i8 %i, %add358  br i1 %c.1, label %if.then, label %if.end359 360if.then:                                          ; preds = %entry361  %t = icmp ule i8 %n, 1362  ret i1 %t363 364if.end:                                           ; preds = %entry365  %f = icmp ule i8 %n, 1366  ret i1 %f367}368 369define i1 @test_n_must_ule_2_due_to_nuw(i8 %n, i8 %i) {370; CHECK-LABEL: @test_n_must_ule_2_due_to_nuw(371; CHECK-NEXT:  entry:372; CHECK-NEXT:    [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -2373; CHECK-NEXT:    [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]374; CHECK-NEXT:    br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]375; CHECK:       if.then:376; CHECK-NEXT:    ret i1 true377; CHECK:       if.end:378; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 2379; CHECK-NEXT:    ret i1 [[F]]380;381entry:382  %sub.n.1 = add nuw i8 %n, -2383  %add = add nuw i8 %i, %sub.n.1384  %c.1 = icmp uge i8 %i, %add385  br i1 %c.1, label %if.then, label %if.end386 387if.then:                                          ; preds = %entry388  %t = icmp ule i8 %n, 2389  ret i1 %t390 391if.end:                                           ; preds = %entry392  %f = icmp ule i8 %n, 2393  ret i1 %f394}395 396 397define i1 @test_n_unknown_missing_nuw2(i8 %n, i8 %i) {398; CHECK-LABEL: @test_n_unknown_missing_nuw2(399; CHECK-NEXT:  entry:400; CHECK-NEXT:    [[SUB_N_1:%.*]] = add i8 [[N:%.*]], -2401; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[I:%.*]], [[SUB_N_1]]402; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]403; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]404; CHECK:       if.then:405; CHECK-NEXT:    [[T:%.*]] = icmp ule i8 [[N]], 1406; CHECK-NEXT:    ret i1 [[T]]407; CHECK:       if.end:408; CHECK-NEXT:    [[F:%.*]] = icmp ule i8 [[N]], 1409; CHECK-NEXT:    ret i1 [[F]]410;411entry:412  %sub.n.1 = add i8 %n, -2413  %add = add i8 %i, %sub.n.1414  %c.1 = icmp uge i8 %i, %add415  br i1 %c.1, label %if.then, label %if.end416 417if.then:                                          ; preds = %entry418  %t = icmp ule i8 %n, 1419  ret i1 %t420 421if.end:                                           ; preds = %entry422  %f = icmp ule i8 %n, 1423  ret i1 %f424}425 426declare void @use(i1)427 428define i1 @add_nuw_neg_pr54224_i16(i16 %a) {429; CHECK-LABEL: @add_nuw_neg_pr54224_i16(430; CHECK-NEXT:  entry:431; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i16 [[A:%.*]], -305432; CHECK-NEXT:    br i1 false, label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]433; CHECK:       exit.1:434; CHECK-NEXT:    ret i1 true435; CHECK:       exit.2:436; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i16 [[A]], 0437; CHECK-NEXT:    ret i1 [[C_3]]438;439entry:440  %neg2 = add nuw i16 %a, -305441  %c.1 = icmp ugt i16 0, %neg2442  br i1 %c.1, label %exit.1, label %exit.2443 444exit.1:445  %c.2 = icmp ugt i16 %a, 0446  ret i1 %c.2447 448exit.2:449  %c.3 = icmp ugt i16 %a, 0450  ret i1 %c.3451}452 453define i1 @add_nuw_neg_pr54224_i64(i64 %a) {454; CHECK-LABEL: @add_nuw_neg_pr54224_i64(455; CHECK-NEXT:  entry:456; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -305457; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]458; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]459; CHECK:       exit.1:460; CHECK-NEXT:    ret i1 true461; CHECK:       exit.2:462; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i64 [[A]], 0463; CHECK-NEXT:    ret i1 [[C_3]]464;465entry:466  %neg2 = add nuw i64 %a, -305467  %c.1 = icmp ugt i64 0, %neg2468  br i1 %c.1, label %exit.1, label %exit.2469 470exit.1:471  %c.2 = icmp ugt i64 %a, 0472  ret i1 %c.2473 474exit.2:475  %c.3 = icmp ugt i64 %a, 0476  ret i1 %c.3477}478 479define i1 @add_nuw_neg2_i8(i8 %a) {480; CHECK-LABEL: @add_nuw_neg2_i8(481; CHECK-NEXT:  entry:482; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i8 [[A:%.*]], -4483; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[NEG2]], -2484; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]485; CHECK:       exit.1:486; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[A]], 1487; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_2]]488; CHECK-NEXT:    ret i1 [[RES_1]]489; CHECK:       exit.2:490; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[A]], 3491; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_3]], false492; CHECK-NEXT:    ret i1 [[RES_2]]493;494entry:495  %neg2 = add nuw i8 %a, -4496  %c.1 = icmp ult i8 %neg2, -2497  br i1 %c.1, label %exit.1, label %exit.2498 499exit.1:500  %t.1 = icmp ult i8 %a, 2501  %c.2 = icmp ult i8 %a, 1502  %res.1 = xor i1 %t.1, %c.2503  ret i1 %res.1504 505exit.2:506  %c.3 = icmp ult i8 %a, 3507  %f.1 = icmp ult i8 %a, 2508  %res.2 = xor i1 %c.3, %f.1509  ret i1 %res.2510}511 512define i1 @add_nuw_neg2_i64(i64 %a) {513; CHECK-LABEL: @add_nuw_neg2_i64(514; CHECK-NEXT:  entry:515; CHECK-NEXT:    [[NEG2:%.*]] = add nuw i64 [[A:%.*]], -4516; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i64 [[NEG2]], -2517; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]518; CHECK:       exit.1:519; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i64 [[A]], 2520; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i64 [[A]], 1521; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[C_2]]522; CHECK-NEXT:    ret i1 [[RES_1]]523; CHECK:       exit.2:524; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i64 [[A]], 3525; CHECK-NEXT:    [[F_1:%.*]] = icmp ult i64 [[A]], 2526; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_3]], [[F_1]]527; CHECK-NEXT:    ret i1 [[RES_2]]528;529entry:530  %neg2 = add nuw i64 %a, -4531  %c.1 = icmp ult i64 %neg2, -2532  br i1 %c.1, label %exit.1, label %exit.2533 534exit.1:535  %t.1 = icmp ult i64 %a, 2536  %c.2 = icmp ult i64 %a, 1537  %res.1 = xor i1 %t.1, %c.2538  ret i1 %res.1539 540exit.2:541  %c.3 = icmp ult i64 %a, 3542  %f.1 = icmp ult i64 %a, 2543  %res.2 = xor i1 %c.3, %f.1544  ret i1 %res.2545}546 547define i1 @test_chained_adds_nuw_1(i8 %a, i8 %b) {548; CHECK-LABEL: @test_chained_adds_nuw_1(549; CHECK-NEXT:  entry:550; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5551; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])552; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6553; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])554; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]555; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2556; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_2]], 14557; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]558; CHECK-NEXT:    ret i1 [[RES_1]]559;560entry:561  %c.a = icmp uge i8 %a, 5562  call void @llvm.assume(i1 %c.a)563  %c.b = icmp uge i8 %b, 6564  call void @llvm.assume(i1 %c.b)565  %add.1 = add nuw i8 %a, %b566  %add.2 = add nuw i8 %add.1, 2567  %t.1 = icmp uge i8 %add.2, 13568  %c.1 = icmp uge i8 %add.2, 14569  %res.1 = xor i1 %t.1, %c.1570  ret i1 %res.1571}572 573define i1 @test_chained_adds_nuw_2(i8 %a, i8 %b) {574; CHECK-LABEL: @test_chained_adds_nuw_2(575; CHECK-NEXT:  entry:576; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5577; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])578; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6579; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])580; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], [[B]]581; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2582; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]583; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19584; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]585; CHECK-NEXT:    ret i1 [[RES_1]]586;587entry:588  %c.a = icmp uge i8 %a, 5589  call void @llvm.assume(i1 %c.a)590  %c.b = icmp uge i8 %b, 6591  call void @llvm.assume(i1 %c.b)592  %add.1 = add nuw i8 %a, %b593  %add.2 = add nuw i8 %add.1, 2594  %add.3 = add nuw i8 %add.2, %a595  %t.1 = icmp uge i8 %add.3, 18596  %c.1 = icmp uge i8 %add.3, 19597  %res.1 = xor i1 %t.1, %c.1598  ret i1 %res.1599}600 601define i1 @test_chained_adds_nuw_3(i8 %a, i8 %b) {602; CHECK-LABEL: @test_chained_adds_nuw_3(603; CHECK-NEXT:  entry:604; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5605; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])606; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6607; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])608; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2609; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]610; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]611; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19612; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]613; CHECK-NEXT:    ret i1 [[RES_1]]614;615entry:616  %c.a = icmp uge i8 %a, 5617  call void @llvm.assume(i1 %c.a)618  %c.b = icmp uge i8 %b, 6619  call void @llvm.assume(i1 %c.b)620  %add.1 = add nuw i8 %a, 2621  %add.2 = add nuw i8 %add.1, %b622  %add.3 = add nuw i8 %add.2, %a623  %t.1 = icmp uge i8 %add.3, 18624  %c.1 = icmp uge i8 %add.3, 19625  %res.1 = xor i1 %t.1, %c.1626  ret i1 %res.1627}628 629define i1 @test_chained_adds_nuw_4(i8 %a, i8 %b) {630; CHECK-LABEL: @test_chained_adds_nuw_4(631; CHECK-NEXT:  entry:632; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5633; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])634; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6635; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])636; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2637; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]638; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], 10639; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 24640; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_1]]641; CHECK-NEXT:    ret i1 [[RES_1]]642;643entry:644  %c.a = icmp uge i8 %a, 5645  call void @llvm.assume(i1 %c.a)646  %c.b = icmp uge i8 %b, 6647  call void @llvm.assume(i1 %c.b)648  %add.1 = add nuw i8 %a, 2649  %add.2 = add nuw i8 %add.1, %b650  %add.3 = add nuw i8 %add.2, 10651  %t.1 = icmp uge i8 %add.3, 23652  %c.1 = icmp uge i8 %add.3, 24653  %res.1 = xor i1 %t.1, %c.1654  ret i1 %res.1655}656 657define i1 @test_chained_adds_missing_nuw_1(i8 %a, i8 %b) {658; CHECK-LABEL: @test_chained_adds_missing_nuw_1(659; CHECK-NEXT:  entry:660; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5661; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])662; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6663; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])664; CHECK-NEXT:    [[ADD_1:%.*]] = add i8 [[A]], 2665; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]666; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]667; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18668; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19669; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]670; CHECK-NEXT:    ret i1 [[RES_1]]671;672entry:673  %c.a = icmp uge i8 %a, 5674  call void @llvm.assume(i1 %c.a)675  %c.b = icmp uge i8 %b, 6676  call void @llvm.assume(i1 %c.b)677  %add.1 = add i8 %a, 2678  %add.2 = add nuw i8 %add.1, %b679  %add.3 = add nuw i8 %add.2, %a680  %c.1 = icmp uge i8 %add.3, 18681  %c.2 = icmp uge i8 %add.3, 19682  %res.1 = xor i1 %c.1, %c.2683  ret i1 %res.1684}685 686define i1 @test_chained_adds_missing_nuw_2(i8 %a, i8 %b) {687; CHECK-LABEL: @test_chained_adds_missing_nuw_2(688; CHECK-NEXT:  entry:689; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5690; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])691; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6692; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])693; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2694; CHECK-NEXT:    [[ADD_2:%.*]] = add i8 [[ADD_1]], [[B]]695; CHECK-NEXT:    [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]696; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18697; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19698; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]699; CHECK-NEXT:    ret i1 [[RES_1]]700;701entry:702  %c.a = icmp uge i8 %a, 5703  call void @llvm.assume(i1 %c.a)704  %c.b = icmp uge i8 %b, 6705  call void @llvm.assume(i1 %c.b)706  %add.1 = add nuw i8 %a, 2707  %add.2 = add i8 %add.1, %b708  %add.3 = add nuw i8 %add.2, %a709  %c.1 = icmp uge i8 %add.3, 18710  %c.2 = icmp uge i8 %add.3, 19711  %res.1 = xor i1 %c.1, %c.2712  ret i1 %res.1713}714 715define i1 @test_chained_adds_missing_nuw_3(i8 %a, i8 %b) {716; CHECK-LABEL: @test_chained_adds_missing_nuw_3(717; CHECK-NEXT:  entry:718; CHECK-NEXT:    [[C_A:%.*]] = icmp uge i8 [[A:%.*]], 5719; CHECK-NEXT:    call void @llvm.assume(i1 [[C_A]])720; CHECK-NEXT:    [[C_B:%.*]] = icmp uge i8 [[B:%.*]], 6721; CHECK-NEXT:    call void @llvm.assume(i1 [[C_B]])722; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw i8 [[A]], 2723; CHECK-NEXT:    [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], [[B]]724; CHECK-NEXT:    [[ADD_3:%.*]] = add i8 [[ADD_2]], [[A]]725; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 18726; CHECK-NEXT:    [[C_2:%.*]] = icmp uge i8 [[ADD_3]], 19727; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]728; CHECK-NEXT:    ret i1 [[RES_1]]729;730entry:731  %c.a = icmp uge i8 %a, 5732  call void @llvm.assume(i1 %c.a)733  %c.b = icmp uge i8 %b, 6734  call void @llvm.assume(i1 %c.b)735  %add.1 = add nuw i8 %a, 2736  %add.2 = add nuw i8 %add.1, %b737  %add.3 = add i8 %add.2, %a738  %c.1 = icmp uge i8 %add.3, 18739  %c.2 = icmp uge i8 %add.3, 19740  %res.1 = xor i1 %c.1, %c.2741  ret i1 %res.1742}743 744declare void @llvm.assume(i1)745