649 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4; Test cases where both the true and false successors reach the same block,5; dominated by one of them.6 7declare void @use(i1)8 9define i1 @test1(i8 %x) {10; CHECK-LABEL: @test1(11; CHECK-NEXT: entry:12; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 1013; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]14; CHECK: bb1:15; CHECK-NEXT: call void @use(i1 true)16; CHECK-NEXT: br label [[BB2]]17; CHECK: bb2:18; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 1019; CHECK-NEXT: ret i1 [[C_3]]20;21entry:22 %c.1 = icmp ule i8 %x, 1023 br i1 %c.1, label %bb1, label %bb224 25bb1:26 %c.2 = icmp ule i8 %x, 1027 call void @use(i1 %c.2)28 br label %bb229 30bb2:31 %c.3 = icmp ugt i8 %x, 1032 ret i1 %c.333}34 35define i1 @test_chain_1(i8 %x) {36; CHECK-LABEL: @test_chain_1(37; CHECK-NEXT: entry:38; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 1039; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]40; CHECK: then:41; CHECK-NEXT: call void @use(i1 true)42; CHECK-NEXT: br label [[EXIT:%.*]]43; CHECK: else:44; CHECK-NEXT: br label [[EXIT]]45; CHECK: exit:46; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 1047; CHECK-NEXT: ret i1 [[C_3]]48;49entry:50 %c.1 = icmp ule i8 %x, 1051 br i1 %c.1, label %then, label %else52 53then:54 %c.2 = icmp ule i8 %x, 1055 call void @use(i1 %c.2)56 br label %exit57 58else:59 br label %exit60 61exit:62 %c.3 = icmp ugt i8 %x, 1063 ret i1 %c.364}65 66define i1 @test_chain_2(i8 %x) {67; CHECK-LABEL: @test_chain_2(68; CHECK-NEXT: entry:69; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 1070; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]71; CHECK: then:72; CHECK-NEXT: br label [[EXIT:%.*]]73; CHECK: else:74; CHECK-NEXT: call void @use(i1 false)75; CHECK-NEXT: br label [[EXIT]]76; CHECK: exit:77; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 1078; CHECK-NEXT: ret i1 [[C_3]]79;80entry:81 %c.1 = icmp ule i8 %x, 1082 br i1 %c.1, label %then, label %else83 84then:85 br label %exit86 87else:88 %c.2 = icmp ule i8 %x, 1089 call void @use(i1 %c.2)90 br label %exit91 92exit:93 %c.3 = icmp ugt i8 %x, 1094 ret i1 %c.395}96 97define i1 @test2(i8 %x) {98; CHECK-LABEL: @test2(99; CHECK-NEXT: entry:100; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10101; CHECK-NEXT: br i1 [[C_1]], label [[BB2:%.*]], label [[BB1:%.*]]102; CHECK: bb1:103; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10104; CHECK-NEXT: ret i1 [[C_2]]105; CHECK: bb2:106; CHECK-NEXT: call void @use(i1 true)107; CHECK-NEXT: br label [[BB1]]108;109entry:110 %c.1 = icmp ule i8 %x, 10111 br i1 %c.1, label %bb2, label %bb1112 113bb1:114 %c.2 = icmp ugt i8 %x, 10115 ret i1 %c.2116 117bb2:118 %c.3 = icmp ule i8 %x, 10119 call void @use(i1 %c.3)120 br label %bb1121}122 123; Test cases where the true/false successors are not domianted by the conditional branching block.124define i1 @test3(i8 %x, i1 %c) {125; CHECK-LABEL: @test3(126; CHECK-NEXT: entry:127; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB1:%.*]]128; CHECK: bb.cond:129; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10130; CHECK-NEXT: br i1 [[C_1]], label [[BB1]], label [[BB2:%.*]]131; CHECK: bb1:132; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10133; CHECK-NEXT: ret i1 [[C_2]]134; CHECK: bb2:135; CHECK-NEXT: ret i1 true136;137entry:138 br i1 %c, label %bb.cond, label %bb1139 140bb.cond:141 %c.1 = icmp ule i8 %x, 10142 br i1 %c.1, label %bb1, label %bb2143 144bb1:145 %c.2 = icmp ule i8 %x, 10146 ret i1 %c.2147 148bb2:149 %c.3 = icmp ugt i8 %x, 10150 ret i1 %c.3151}152 153define i1 @test4(i8 %x, i1 %c) {154; CHECK-LABEL: @test4(155; CHECK-NEXT: entry:156; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB2:%.*]]157; CHECK: bb.cond:158; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10159; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2]]160; CHECK: bb1:161; CHECK-NEXT: ret i1 true162; CHECK: bb2:163; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10164; CHECK-NEXT: ret i1 [[C_3]]165;166entry:167 br i1 %c, label %bb.cond, label %bb2168 169bb.cond:170 %c.1 = icmp ule i8 %x, 10171 br i1 %c.1, label %bb1, label %bb2172 173bb1:174 %c.2 = icmp ule i8 %x, 10175 ret i1 %c.2176 177bb2:178 %c.3 = icmp ugt i8 %x, 10179 ret i1 %c.3180}181 182 183define i1 @test_cond_from_preheader(i8 %x, i1 %c) {184; CHECK-LABEL: @test_cond_from_preheader(185; CHECK-NEXT: entry:186; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]187; CHECK: pre:188; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10189; CHECK-NEXT: br i1 [[C_1]], label [[LOOP:%.*]], label [[BB2]]190; CHECK: loop:191; CHECK-NEXT: call void @use(i1 true)192; CHECK-NEXT: call void @use(i1 false)193; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 9194; CHECK-NEXT: call void @use(i1 [[C_2]])195; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 9196; CHECK-NEXT: call void @use(i1 [[C_3]])197; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]198; CHECK: exit:199; CHECK-NEXT: ret i1 true200; CHECK: bb2:201; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[X]], 10202; CHECK-NEXT: ret i1 [[C_5]]203;204entry:205 br i1 %c, label %pre, label %bb2206 207pre:208 %c.1 = icmp ule i8 %x, 10209 br i1 %c.1, label %loop, label %bb2210 211loop:212 %t.1 = icmp ule i8 %x, 10213 call void @use(i1 %t.1)214 %f.1 = icmp ugt i8 %x, 10215 call void @use(i1 %f.1)216 217 %c.2 = icmp ule i8 %x, 9218 call void @use(i1 %c.2)219 %c.3 = icmp ugt i8 %x, 9220 call void @use(i1 %c.3)221 222 br i1 true, label %exit, label %loop223 224exit:225 %c.4 = icmp ule i8 %x, 10226 ret i1 %c.4227 228bb2:229 %c.5 = icmp ugt i8 %x, 10230 ret i1 %c.5231}232 233define i1 @test_cond_from_preheader_successors_flipped(i8 %x, i1 %c) {234; CHECK-LABEL: @test_cond_from_preheader_successors_flipped(235; CHECK-NEXT: entry:236; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]237; CHECK: pre:238; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10239; CHECK-NEXT: br i1 [[C_1]], label [[BB2]], label [[LOOP:%.*]]240; CHECK: loop:241; CHECK-NEXT: call void @use(i1 false)242; CHECK-NEXT: call void @use(i1 true)243; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 11244; CHECK-NEXT: call void @use(i1 [[C_2]])245; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 11246; CHECK-NEXT: call void @use(i1 [[C_3]])247; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]248; CHECK: exit:249; CHECK-NEXT: ret i1 false250; CHECK: bb2:251; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[X]], 10252; CHECK-NEXT: ret i1 [[C_5]]253;254entry:255 br i1 %c, label %pre, label %bb2256 257pre:258 %c.1 = icmp ule i8 %x, 10259 br i1 %c.1, label %bb2, label %loop260 261loop:262 %f.1 = icmp ule i8 %x, 10263 call void @use(i1 %f.1)264 %t.1 = icmp ugt i8 %x, 10265 call void @use(i1 %t.1)266 267 %c.2 = icmp ule i8 %x, 11268 call void @use(i1 %c.2)269 %c.3 = icmp ugt i8 %x, 11270 call void @use(i1 %c.3)271 272 br i1 true, label %exit, label %loop273 274exit:275 %f.2 = icmp ule i8 %x, 10276 ret i1 %f.2277 278bb2:279 %c.5 = icmp ugt i8 %x, 10280 ret i1 %c.5281}282 283define i1 @test_cond_from_preheader_and(i8 %x, i8 %y, i1 %c) {284; CHECK-LABEL: @test_cond_from_preheader_and(285; CHECK-NEXT: entry:286; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]287; CHECK: exit:288; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10289; CHECK-NEXT: ret i1 [[C_5]]290; CHECK: pre:291; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10292; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99293; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]294; CHECK-NEXT: br i1 [[AND]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]295; CHECK: loop:296; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, false297; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 9298; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]299; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 9300; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]301; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], true302; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], false303; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[Y]], 100304; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]305; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[Y]], 100306; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]307; CHECK-NEXT: call void @use(i1 [[R_7]])308; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]309; CHECK: exit.1:310; CHECK-NEXT: [[C_6:%.*]] = icmp ugt i8 [[Y]], 10311; CHECK-NEXT: ret i1 [[C_6]]312;313entry:314 br i1 %c, label %pre, label %exit315 316exit:317 %c.5 = icmp ugt i8 %y, 10318 ret i1 %c.5319 320pre:321 %x.1 = icmp ule i8 %x, 10322 %y.1 = icmp ugt i8 %y, 99323 %and = and i1 %x.1, %y.1324 br i1 %and, label %loop, label %exit.1325 326loop:327 %t.1 = icmp ule i8 %x, 10328 %f.1 = icmp ugt i8 %x, 10329 %r.1 = xor i1 %t.1, %f.1330 331 %c.1 = icmp ule i8 %x, 9332 %r.2 = xor i1 %r.1, %c.1333 334 %c.2 = icmp ugt i8 %x, 9335 %r.3 = xor i1 %r.2, %c.2336 337 %t.2 = icmp ugt i8 %y, 99338 %r.4 = xor i1 %r.3, %t.2339 340 %f.2 = icmp ule i8 %y, 99341 %r.5 = xor i1 %r.4, %f.2342 343 %c.3 = icmp ugt i8 %y, 100344 %r.6 = xor i1 %r.5, %c.3345 346 %c.4 = icmp ugt i8 %y, 100347 %r.7 = xor i1 %r.6, %c.4348 call void @use(i1 %r.7)349 350 br i1 true, label %exit, label %loop351 352exit.1:353 %c.6 = icmp ugt i8 %y, 10354 ret i1 %c.6355}356 357 358define i1 @test_cond_from_preheader_and_successors_flipped(i8 %x, i8 %y, i1 %c) {359; CHECK-LABEL: @test_cond_from_preheader_and_successors_flipped(360; CHECK-NEXT: entry:361; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]362; CHECK: exit:363; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10364; CHECK-NEXT: ret i1 [[C_9]]365; CHECK: pre:366; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10367; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99368; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]369; CHECK-NEXT: br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]370; CHECK: loop:371; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 10372; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10373; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]374; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], 9375; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]376; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[X]], 9377; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]378; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y]], 99379; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]380; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 99381; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]382; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[Y]], 100383; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]384; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i8 [[Y]], 100385; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]386; CHECK-NEXT: call void @use(i1 [[R_7]])387; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]388; CHECK: exit.1:389; CHECK-NEXT: ret i1 true390;391entry:392 br i1 %c, label %pre, label %exit393 394exit:395 %c.9 = icmp ugt i8 %y, 10396 ret i1 %c.9397 398pre:399 %x.1 = icmp ule i8 %x, 10400 %y.1 = icmp ugt i8 %y, 99401 %and = and i1 %x.1, %y.1402 br i1 %and, label %exit.1, label %loop403 404loop:405 %c.1 = icmp ule i8 %x, 10406 %c.2 = icmp ugt i8 %x, 10407 %r.1 = xor i1 %c.1, %c.2408 %c.3 = icmp ule i8 %x, 9409 %r.2 = xor i1 %r.1, %c.3410 %c.4 = icmp ugt i8 %x, 9411 %r.3 = xor i1 %r.2, %c.4412 413 %c.5 = icmp ugt i8 %y, 99414 %r.4 = xor i1 %r.3, %c.5415 %c.6 = icmp ule i8 %y, 99416 %r.5 = xor i1 %r.4, %c.6417 418 %c.7 = icmp ugt i8 %y, 100419 %r.6 = xor i1 %r.5, %c.7420 %c.8 = icmp ugt i8 %y, 100421 %r.7 = xor i1 %r.6, %c.8422 call void @use(i1 %r.7)423 424 br i1 true, label %exit, label %loop425 426exit.1:427 %t.1 = icmp ugt i8 %y, 10428 ret i1 %t.1429}430 431define i1 @test_cond_from_preheader_or(i8 %x, i8 %y, i1 %c) {432; CHECK-LABEL: @test_cond_from_preheader_or(433; CHECK-NEXT: entry:434; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]435; CHECK: exit:436; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10437; CHECK-NEXT: ret i1 [[C_5]]438; CHECK: pre:439; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10440; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99441; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]442; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]443; CHECK: loop:444; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, false445; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], 11446; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]447; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 11448; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]449; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], true450; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], false451; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[Y]], 98452; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]453; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 [[Y]], 98454; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]455; CHECK-NEXT: call void @use(i1 [[R_7]])456; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]457; CHECK: exit.1:458; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 100459; CHECK-NEXT: ret i1 [[C_6]]460;461entry:462 br i1 %c, label %pre, label %exit463 464exit:465 %c.5 = icmp ugt i8 %y, 10466 ret i1 %c.5467 468pre:469 %x.1 = icmp ule i8 %x, 10470 %y.1 = icmp ugt i8 %y, 99471 %or = or i1 %x.1, %y.1472 br i1 %or, label %exit.1, label %loop473 474loop:475 %t.1 = icmp ugt i8 %x, 10476 %f.1 = icmp ule i8 %x, 10477 %r.1 = xor i1 %t.1, %f.1478 %c.1 = icmp ugt i8 %x, 11479 %r.2 = xor i1 %r.1, %c.1480 %c.2 = icmp ule i8 %x, 11481 %r.3 = xor i1 %r.2, %c.2482 483 %t.2 = icmp ule i8 %y, 99484 %r.4 = xor i1 %r.3, %t.2485 %f.2 = icmp ugt i8 %y, 99486 %r.5 = xor i1 %r.4, %f.2487 488 %c.3 = icmp ule i8 %y, 98489 %r.6 = xor i1 %r.5, %c.3490 %c.4 = icmp ule i8 %y, 98491 %r.7 = xor i1 %r.6, %c.4492 call void @use(i1 %r.7)493 494 br i1 true, label %exit, label %loop495 496exit.1:497 %c.6 = icmp ule i8 %y, 100498 ret i1 %c.6499}500 501define i1 @test_cond_from_preheader_or_successor_flipped(i8 %x, i8 %y, i1 %c) {502; CHECK-LABEL: @test_cond_from_preheader_or_successor_flipped(503; CHECK-NEXT: entry:504; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]505; CHECK: exit:506; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10507; CHECK-NEXT: ret i1 [[C_9]]508; CHECK: pre:509; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10510; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99511; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]512; CHECK-NEXT: br i1 [[OR]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]513; CHECK: loop:514; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 10515; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10516; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]517; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], 9518; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]519; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[X]], 9520; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]521; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y]], 99522; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]523; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 99524; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]525; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[Y]], 100526; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]527; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i8 [[Y]], 100528; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]529; CHECK-NEXT: call void @use(i1 [[R_7]])530; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]531; CHECK: exit.1:532; CHECK-NEXT: ret i1 true533;534entry:535 br i1 %c, label %pre, label %exit536 537exit:538 %c.9 = icmp ugt i8 %y, 10539 ret i1 %c.9540 541pre:542 %x.1 = icmp ule i8 %x, 10543 %y.1 = icmp ugt i8 %y, 99544 %or = or i1 %x.1, %y.1545 br i1 %or, label %loop, label %exit.1546 547loop:548 %c.1 = icmp ule i8 %x, 10549 %c.2 = icmp ugt i8 %x, 10550 %r.1 = xor i1 %c.1, %c.2551 %c.3 = icmp ule i8 %x, 9552 %r.2 = xor i1 %r.1, %c.3553 %c.4 = icmp ugt i8 %x, 9554 %r.3 = xor i1 %r.2, %c.4555 556 %c.5 = icmp ugt i8 %y, 99557 %r.4 = xor i1 %r.3, %c.5558 %c.6 = icmp ule i8 %y, 99559 %r.5 = xor i1 %r.4, %c.6560 561 %c.7 = icmp ugt i8 %y, 100562 %r.6 = xor i1 %r.5, %c.7563 %c.8 = icmp ugt i8 %y, 100564 %r.7 = xor i1 %r.6, %c.8565 call void @use(i1 %r.7)566 567 br i1 true, label %exit, label %loop568 569exit.1:570 %t.1 = icmp ule i8 %y, 100571 ret i1 %t.1572}573 574; Test case from PR49819.575define i1 @both_branch_to_same_block(i4 %x) {576; CHECK-LABEL: @both_branch_to_same_block(577; CHECK-NEXT: entry:578; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0579; CHECK-NEXT: br i1 [[C_1]], label [[EXIT:%.*]], label [[EXIT]]580; CHECK: exit:581; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[X]], 0582; CHECK-NEXT: [[C_3:%.*]] = icmp eq i4 [[X]], 0583; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_2]], [[C_3]]584; CHECK-NEXT: ret i1 [[RES]]585;586entry:587 %c.1 = icmp ne i4 %x, 0588 br i1 %c.1, label %exit, label %exit589 590exit:591 %c.2 = icmp ne i4 %x, 0592 %c.3 = icmp eq i4 %x, 0593 %res = xor i1 %c.2, %c.3594 ret i1 %res595}596 597define i1 @both_branch_to_same_block_and(i4 %x, i4 %y) {598; CHECK-LABEL: @both_branch_to_same_block_and(599; CHECK-NEXT: entry:600; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0601; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[Y:%.*]], -6602; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]603; CHECK-NEXT: br i1 [[AND]], label [[EXIT:%.*]], label [[EXIT]]604; CHECK: exit:605; CHECK-NEXT: [[C_3:%.*]] = icmp ne i4 [[X]], 0606; CHECK-NEXT: [[C_4:%.*]] = icmp eq i4 [[X]], 0607; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_3]], [[C_4]]608; CHECK-NEXT: ret i1 [[RES]]609;610entry:611 %c.1 = icmp ne i4 %x, 0612 %c.2 = icmp ne i4 %y, 10613 %and = and i1 %c.1, %c.2614 br i1 %and, label %exit, label %exit615 616exit:617 %c.3 = icmp ne i4 %x, 0618 %c.4 = icmp eq i4 %x, 0619 %res = xor i1 %c.3, %c.4620 ret i1 %res621}622 623 624define i1 @both_branch_to_same_block_or(i4 %x, i4 %y) {625; CHECK-LABEL: @both_branch_to_same_block_or(626; CHECK-NEXT: entry:627; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0628; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[Y:%.*]], -6629; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_1]], [[C_2]]630; CHECK-NEXT: br i1 [[OR]], label [[EXIT:%.*]], label [[EXIT]]631; CHECK: exit:632; CHECK-NEXT: [[C_3:%.*]] = icmp ne i4 [[X]], 0633; CHECK-NEXT: [[C_4:%.*]] = icmp eq i4 [[X]], 0634; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_3]], [[C_4]]635; CHECK-NEXT: ret i1 [[RES]]636;637entry:638 %c.1 = icmp ne i4 %x, 0639 %c.2 = icmp ne i4 %y, 10640 %or = or i1 %c.1, %c.2641 br i1 %or, label %exit, label %exit642 643exit:644 %c.3 = icmp ne i4 %x, 0645 %c.4 = icmp eq i4 %x, 0646 %res = xor i1 %c.3, %c.4647 ret i1 %res648}649