brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.8 KiB · 7397360 Raw
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