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