brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.5 KiB · d8be878 Raw
468 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=loop-unroll -S %s | FileCheck %s3 4declare void @foo()5 6define void @peel_unreachable_exit_and_latch_exit(ptr %ptr, i32 %N, i32 %x) {7; CHECK-LABEL: @peel_unreachable_exit_and_latch_exit(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_BEGIN:%.*]]10; CHECK:       loop.header.peel.begin:11; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL:%.*]]12; CHECK:       loop.header.peel:13; CHECK-NEXT:    [[C_PEEL:%.*]] = icmp ult i32 1, 214; CHECK-NEXT:    br i1 [[C_PEEL]], label [[THEN_PEEL:%.*]], label [[ELSE_PEEL:%.*]]15; CHECK:       else.peel:16; CHECK-NEXT:    [[C_2_PEEL:%.*]] = icmp eq i32 1, [[X:%.*]]17; CHECK-NEXT:    br i1 [[C_2_PEEL]], label [[UNREACHABLE_EXIT:%.*]], label [[LOOP_LATCH_PEEL:%.*]]18; CHECK:       then.peel:19; CHECK-NEXT:    br label [[LOOP_LATCH_PEEL]]20; CHECK:       loop.latch.peel:21; CHECK-NEXT:    [[M_PEEL:%.*]] = phi i32 [ 0, [[THEN_PEEL]] ], [ [[X]], [[ELSE_PEEL]] ]22; CHECK-NEXT:    [[GEP_PEEL:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 123; CHECK-NEXT:    store i32 [[M_PEEL]], ptr [[GEP_PEEL]], align 424; CHECK-NEXT:    [[IV_NEXT_PEEL:%.*]] = add nuw nsw i32 1, 125; CHECK-NEXT:    [[C_3_PEEL:%.*]] = icmp ult i32 1, 100026; CHECK-NEXT:    br i1 [[C_3_PEEL]], label [[LOOP_HEADER_PEEL_NEXT:%.*]], label [[EXIT:%.*]]27; CHECK:       loop.header.peel.next:28; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_NEXT1:%.*]]29; CHECK:       loop.header.peel.next1:30; CHECK-NEXT:    br label [[ENTRY_PEEL_NEWPH:%.*]]31; CHECK:       entry.peel.newph:32; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]33; CHECK:       loop.header:34; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]35; CHECK-NEXT:    br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]36; CHECK:       then:37; CHECK-NEXT:    br label [[LOOP_LATCH]]38; CHECK:       else:39; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[IV]], [[X]]40; CHECK-NEXT:    br i1 [[C_2]], label [[UNREACHABLE_EXIT_LOOPEXIT:%.*]], label [[LOOP_LATCH]]41; CHECK:       loop.latch:42; CHECK-NEXT:    [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]43; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i32 [[IV]]44; CHECK-NEXT:    store i32 [[M]], ptr [[GEP]], align 445; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 146; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i32 [[IV]], 100047; CHECK-NEXT:    br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP0:![0-9]+]]48; CHECK:       exit.loopexit:49; CHECK-NEXT:    br label [[EXIT]]50; CHECK:       exit:51; CHECK-NEXT:    ret void52; CHECK:       unreachable.exit.loopexit:53; CHECK-NEXT:    br label [[UNREACHABLE_EXIT]]54; CHECK:       unreachable.exit:55; CHECK-NEXT:    call void @foo()56; CHECK-NEXT:    unreachable57;58entry:59  br label %loop.header60 61loop.header:62  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]63  %c = icmp ult i32 %iv, 264  br i1 %c, label %then, label %else65 66then:67  br label %loop.latch68 69else:70  %c.2 = icmp eq i32 %iv, %x71  br i1 %c.2, label %unreachable.exit, label %loop.latch72 73loop.latch:74  %m = phi i32 [ 0, %then ], [ %x, %else ]75  %gep = getelementptr i32, ptr %ptr, i32 %iv76  store i32 %m, ptr %gep77  %iv.next = add nuw nsw i32  %iv, 178  %c.3 = icmp ult i32 %iv, 100079  br i1 %c.3, label %loop.header, label %exit80 81exit:82  ret void83 84unreachable.exit:85  call void @foo()86  unreachable87}88 89define void @peel_unreachable_exit_and_header_exit(ptr %ptr, i32 %N, i32 %x) {90; CHECK-LABEL: @peel_unreachable_exit_and_header_exit(91; CHECK-NEXT:  entry:92; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]93; CHECK:       loop.header:94; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[ELSE:%.*]]95; CHECK:       else:96; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 1, [[X:%.*]]97; CHECK-NEXT:    br i1 [[C_2]], label [[UNREACHABLE_EXIT:%.*]], label [[LOOP_LATCH:%.*]]98; CHECK:       loop.latch:99; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 1100; CHECK-NEXT:    store i32 [[X]], ptr [[GEP]], align 4101; CHECK-NEXT:    unreachable102; CHECK:       exit:103; CHECK-NEXT:    ret void104; CHECK:       unreachable.exit:105; CHECK-NEXT:    call void @foo()106; CHECK-NEXT:    unreachable107;108entry:109  br label %loop.header110 111loop.header:112  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]113  %c = icmp ult i32 %iv, 1000114  br i1 %c, label %exit, label %else115 116else:117  %c.2 = icmp eq i32 %iv, %x118  br i1 %c.2, label %unreachable.exit, label %loop.latch119 120loop.latch:121  %gep = getelementptr i32, ptr %ptr, i32 %iv122  store i32 %x, ptr %gep123  %iv.next = add nuw nsw i32  %iv, 1124  br label %loop.header125 126exit:127  ret void128 129unreachable.exit:130  call void @foo()131  unreachable132}133 134define void @peel_unreachable_and_multiple_reachable_exits(ptr %ptr, i32 %N, i32 %x) {135; CHECK-LABEL: @peel_unreachable_and_multiple_reachable_exits(136; CHECK-NEXT:  entry:137; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_BEGIN:%.*]]138; CHECK:       loop.header.peel.begin:139; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL:%.*]]140; CHECK:       loop.header.peel:141; CHECK-NEXT:    [[C_PEEL:%.*]] = icmp ult i32 1, 2142; CHECK-NEXT:    br i1 [[C_PEEL]], label [[THEN_PEEL:%.*]], label [[ELSE_PEEL:%.*]]143; CHECK:       else.peel:144; CHECK-NEXT:    [[C_3_PEEL:%.*]] = icmp eq i32 1, [[X:%.*]]145; CHECK-NEXT:    br i1 [[C_3_PEEL]], label [[UNREACHABLE_EXIT:%.*]], label [[LOOP_LATCH_PEEL:%.*]]146; CHECK:       then.peel:147; CHECK-NEXT:    [[C_2_PEEL:%.*]] = icmp sgt i32 1, [[X]]148; CHECK-NEXT:    br i1 [[C_2_PEEL]], label [[EXIT:%.*]], label [[LOOP_LATCH_PEEL]]149; CHECK:       loop.latch.peel:150; CHECK-NEXT:    [[M_PEEL:%.*]] = phi i32 [ 0, [[THEN_PEEL]] ], [ [[X]], [[ELSE_PEEL]] ]151; CHECK-NEXT:    [[GEP_PEEL:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 1152; CHECK-NEXT:    store i32 [[M_PEEL]], ptr [[GEP_PEEL]], align 4153; CHECK-NEXT:    [[IV_NEXT_PEEL:%.*]] = add nuw nsw i32 1, 1154; CHECK-NEXT:    [[C_4_PEEL:%.*]] = icmp ult i32 1, 1000155; CHECK-NEXT:    br i1 [[C_4_PEEL]], label [[LOOP_HEADER_PEEL_NEXT:%.*]], label [[EXIT]]156; CHECK:       loop.header.peel.next:157; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_NEXT1:%.*]]158; CHECK:       loop.header.peel.next1:159; CHECK-NEXT:    br label [[ENTRY_PEEL_NEWPH:%.*]]160; CHECK:       entry.peel.newph:161; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]162; CHECK:       loop.header:163; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]164; CHECK-NEXT:    br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]165; CHECK:       then:166; CHECK-NEXT:    br i1 true, label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_LATCH]]167; CHECK:       else:168; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[IV]], [[X]]169; CHECK-NEXT:    br i1 [[C_3]], label [[UNREACHABLE_EXIT_LOOPEXIT:%.*]], label [[LOOP_LATCH]]170; CHECK:       loop.latch:171; CHECK-NEXT:    [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]172; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i32 [[IV]]173; CHECK-NEXT:    store i32 [[M]], ptr [[GEP]], align 4174; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1175; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i32 [[IV]], 1000176; CHECK-NEXT:    br i1 [[C_4]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT]], !llvm.loop [[LOOP2:![0-9]+]]177; CHECK:       exit.loopexit:178; CHECK-NEXT:    br label [[EXIT]]179; CHECK:       exit:180; CHECK-NEXT:    ret void181; CHECK:       unreachable.exit.loopexit:182; CHECK-NEXT:    br label [[UNREACHABLE_EXIT]]183; CHECK:       unreachable.exit:184; CHECK-NEXT:    call void @foo()185; CHECK-NEXT:    unreachable186;187entry:188  br label %loop.header189 190loop.header:191  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]192  %c = icmp ult i32 %iv, 2193  br i1 %c, label %then, label %else194 195then:196  %c.2 = icmp sgt i32 %iv, %x197  br i1 %c.2, label %exit, label %loop.latch198 199else:200  %c.3 = icmp eq i32 %iv, %x201  br i1 %c.3, label %unreachable.exit, label %loop.latch202 203loop.latch:204  %m = phi i32 [ 0, %then ], [ %x, %else ]205  %gep = getelementptr i32, ptr %ptr, i32 %iv206  store i32 %m, ptr %gep207  %iv.next = add nuw nsw i32  %iv, 1208  %c.4 = icmp ult i32 %iv, 1000209  br i1 %c.4, label %loop.header, label %exit210 211exit:212  ret void213 214unreachable.exit:215  call void @foo()216  unreachable217}218 219define void @peel_exits_to_blocks_branch_to_unreachable_block(ptr %ptr, i32 %N, i32 %x, i1 %c.1) {220; CHECK-LABEL: @peel_exits_to_blocks_branch_to_unreachable_block(221; CHECK-NEXT:  entry:222; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_BEGIN:%.*]]223; CHECK:       loop.header.peel.begin:224; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL:%.*]]225; CHECK:       loop.header.peel:226; CHECK-NEXT:    [[C_PEEL:%.*]] = icmp ult i32 1, 2227; CHECK-NEXT:    br i1 [[C_PEEL]], label [[THEN_PEEL:%.*]], label [[ELSE_PEEL:%.*]]228; CHECK:       else.peel:229; CHECK-NEXT:    [[C_2_PEEL:%.*]] = icmp eq i32 1, [[X:%.*]]230; CHECK-NEXT:    br i1 [[C_2_PEEL]], label [[EXIT_2:%.*]], label [[LOOP_LATCH_PEEL:%.*]]231; CHECK:       then.peel:232; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[EXIT_1:%.*]], label [[LOOP_LATCH_PEEL]]233; CHECK:       loop.latch.peel:234; CHECK-NEXT:    [[M_PEEL:%.*]] = phi i32 [ 0, [[THEN_PEEL]] ], [ [[X]], [[ELSE_PEEL]] ]235; CHECK-NEXT:    [[GEP_PEEL:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 1236; CHECK-NEXT:    store i32 [[M_PEEL]], ptr [[GEP_PEEL]], align 4237; CHECK-NEXT:    [[IV_NEXT_PEEL:%.*]] = add nuw nsw i32 1, 1238; CHECK-NEXT:    [[C_3_PEEL:%.*]] = icmp ult i32 1, 1000239; CHECK-NEXT:    br i1 [[C_3_PEEL]], label [[LOOP_HEADER_PEEL_NEXT:%.*]], label [[EXIT:%.*]]240; CHECK:       loop.header.peel.next:241; CHECK-NEXT:    br label [[LOOP_HEADER_PEEL_NEXT1:%.*]]242; CHECK:       loop.header.peel.next1:243; CHECK-NEXT:    br label [[ENTRY_PEEL_NEWPH:%.*]]244; CHECK:       entry.peel.newph:245; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]246; CHECK:       loop.header:247; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]248; CHECK-NEXT:    br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]249; CHECK:       then:250; CHECK-NEXT:    br i1 [[C_1]], label [[EXIT_1_LOOPEXIT:%.*]], label [[LOOP_LATCH]]251; CHECK:       else:252; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[IV]], [[X]]253; CHECK-NEXT:    br i1 [[C_2]], label [[EXIT_2_LOOPEXIT:%.*]], label [[LOOP_LATCH]]254; CHECK:       loop.latch:255; CHECK-NEXT:    [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]256; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR]], i32 [[IV]]257; CHECK-NEXT:    store i32 [[M]], ptr [[GEP]], align 4258; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1259; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i32 [[IV]], 1000260; CHECK-NEXT:    br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP3:![0-9]+]]261; CHECK:       exit.loopexit:262; CHECK-NEXT:    br label [[EXIT]]263; CHECK:       exit:264; CHECK-NEXT:    ret void265; CHECK:       exit.1.loopexit:266; CHECK-NEXT:    br label [[EXIT_1]]267; CHECK:       exit.1:268; CHECK-NEXT:    call void @foo()269; CHECK-NEXT:    br label [[UNREACHABLE_TERM:%.*]]270; CHECK:       exit.2.loopexit:271; CHECK-NEXT:    br label [[EXIT_2]]272; CHECK:       exit.2:273; CHECK-NEXT:    call void @bar()274; CHECK-NEXT:    br label [[UNREACHABLE_TERM]]275; CHECK:       unreachable.term:276; CHECK-NEXT:    call void @baz()277; CHECK-NEXT:    unreachable278;279entry:280  br label %loop.header281 282loop.header:283  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]284  %c = icmp ult i32 %iv, 2285  br i1 %c, label %then, label %else286 287then:288  br i1 %c.1, label %exit.1, label %loop.latch289 290else:291  %c.2 = icmp eq i32 %iv, %x292  br i1 %c.2, label %exit.2, label %loop.latch293 294loop.latch:295  %m = phi i32 [ 0, %then ], [ %x, %else ]296  %gep = getelementptr i32, ptr %ptr, i32 %iv297  store i32 %m, ptr %gep298  %iv.next = add nuw nsw i32  %iv, 1299  %c.3 = icmp ult i32 %iv, 1000300  br i1 %c.3, label %loop.header, label %exit301 302exit:303  ret void304 305exit.1:306  call void @foo()307  br label %unreachable.term308 309exit.2:310  call void @bar()311  br label %unreachable.term312 313unreachable.term:314  call void @baz()315  unreachable316}317 318define void @peel_exits_to_blocks_branch_to_unreachable_block_with_invariant_load(ptr %ptr, i32 %N, i32 %x, i1 %c.1, i32 %y, ptr %size_ptr) {319; CHECK-LABEL: @peel_exits_to_blocks_branch_to_unreachable_block_with_invariant_load(320; CHECK-NEXT:  entry:321; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]322; CHECK:       loop.header:323; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]324; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[IV]], [[Y:%.*]]325; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]326; CHECK:       then:327; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[EXIT_1:%.*]], label [[LOOP_LATCH]]328; CHECK:       else:329; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[IV]], [[X:%.*]]330; CHECK-NEXT:    br i1 [[C_2]], label [[EXIT_2:%.*]], label [[LOOP_LATCH]]331; CHECK:       loop.latch:332; CHECK-NEXT:    [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]333; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 [[IV]]334; CHECK-NEXT:    store i32 [[M]], ptr [[GEP]], align 4335; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1336; CHECK-NEXT:    [[SIZE:%.*]] = load i32, ptr [[SIZE_PTR:%.*]], align 4337; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i32 [[IV_NEXT]], [[SIZE]]338; CHECK-NEXT:    br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT:%.*]]339; CHECK:       exit:340; CHECK-NEXT:    ret void341; CHECK:       exit.1:342; CHECK-NEXT:    call void @foo()343; CHECK-NEXT:    br label [[UNREACHABLE_TERM:%.*]]344; CHECK:       exit.2:345; CHECK-NEXT:    call void @bar()346; CHECK-NEXT:    br label [[UNREACHABLE_TERM]]347; CHECK:       unreachable.term:348; CHECK-NEXT:    call void @baz()349; CHECK-NEXT:    unreachable350;351entry:352  br label %loop.header353 354loop.header:355  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]356  %c = icmp ult i32 %iv, %y357  br i1 %c, label %then, label %else358 359then:360  br i1 %c.1, label %exit.1, label %loop.latch361 362else:363  %c.2 = icmp eq i32 %iv, %x364  br i1 %c.2, label %exit.2, label %loop.latch365 366loop.latch:367  %m = phi i32 [ 0, %then ], [ %x, %else ]368  %gep = getelementptr i32, ptr %ptr, i32 %iv369  store i32 %m, ptr %gep370  %iv.next = add nuw nsw i32 %iv, 1371  %size = load i32, ptr %size_ptr, align 4372  %c.3 = icmp ult i32 %iv.next, %size373  br i1 %c.3, label %loop.header, label %exit374 375exit:376  ret void377 378exit.1:379  call void @foo()380  br label %unreachable.term381 382exit.2:383  call void @bar()384  br label %unreachable.term385 386unreachable.term:387  call void @baz()388  unreachable389}390 391define void @peel_exits_to_blocks_branch_to_unreachable_block_with_profile(ptr %ptr, i32 %N, i32 %x, i1 %c.1) !prof !0 {392; CHECK-LABEL: @peel_exits_to_blocks_branch_to_unreachable_block_with_profile(393; CHECK-NEXT:  entry:394; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]395; CHECK:       loop.header:396; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]397; CHECK-NEXT:    [[C:%.*]] = icmp ult i32 [[IV]], [[N:%.*]]398; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]], !prof [[PROF5:![0-9]+]]399; CHECK:       then:400; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[EXIT_1:%.*]], label [[LOOP_LATCH]]401; CHECK:       else:402; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[IV]], [[X:%.*]]403; CHECK-NEXT:    br i1 [[C_2]], label [[EXIT_2:%.*]], label [[LOOP_LATCH]]404; CHECK:       loop.latch:405; CHECK-NEXT:    [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]406; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[PTR:%.*]], i32 [[IV]]407; CHECK-NEXT:    store i32 [[M]], ptr [[GEP]], align 4408; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1409; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i32 [[IV_NEXT]], [[N]]410; CHECK-NEXT:    br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT:%.*]], !prof [[PROF5]]411; CHECK:       exit:412; CHECK-NEXT:    ret void413; CHECK:       exit.1:414; CHECK-NEXT:    call void @foo()415; CHECK-NEXT:    br label [[UNREACHABLE_TERM:%.*]]416; CHECK:       exit.2:417; CHECK-NEXT:    call void @bar()418; CHECK-NEXT:    br label [[UNREACHABLE_TERM]]419; CHECK:       unreachable.term:420; CHECK-NEXT:    call void @baz()421; CHECK-NEXT:    unreachable422;423entry:424  br label %loop.header425 426loop.header:427  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]428  %c = icmp ult i32 %iv, %N429  br i1 %c, label %then, label %else, !prof !1430 431then:432  br i1 %c.1, label %exit.1, label %loop.latch433 434else:435  %c.2 = icmp eq i32 %iv, %x436  br i1 %c.2, label %exit.2, label %loop.latch437 438loop.latch:439  %m = phi i32 [ 0, %then ], [ %x, %else ]440  %gep = getelementptr i32, ptr %ptr, i32 %iv441  store i32 %m, ptr %gep442  %iv.next = add nuw nsw i32  %iv, 1443  %c.3 = icmp ult i32 %iv.next, %N444  br i1 %c.3, label %loop.header, label %exit, !prof !2445 446exit:447  ret void448 449exit.1:450  call void @foo()451  br label %unreachable.term452 453exit.2:454  call void @bar()455  br label %unreachable.term456 457unreachable.term:458  call void @baz()459  unreachable460}461 462declare void @bar()463declare void @baz()464 465!0 = !{!"function_entry_count", i64 32768}466!1 = !{!"branch_weights", i32 0, i32 1}467!2 = !{!"branch_weights", i32 0, i32 1}468