brintos

brintos / llvm-project-archived public Read only

0
0
Text · 358.8 KiB · 6835e9b Raw
6682 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p2; RUN: opt < %s -passes=loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG3; RUN: opt < %s -passes=loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG-BLOCK4; RUN: opt < %s -passes=loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG5; RUN: opt < %s -passes=loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG-BLOCK6 7; REQUIRES: asserts8 9; test with three exiting and three exit blocks.10; none of the exit blocks have successors11define void @test1(i64 %trip, i1 %cond) {12; EPILOG-LABEL: @test1(13; EPILOG-NEXT:  entry:14; EPILOG-NEXT:    %0 = freeze i64 %trip15; EPILOG-NEXT:    %1 = add i64 %0, -116; EPILOG-NEXT:    %xtraiter = and i64 %0, 717; EPILOG-NEXT:    %2 = icmp ult i64 %1, 718; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new19; EPILOG:       entry.new:20; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter21; EPILOG-NEXT:    br label %loop_header22; EPILOG:       loop_header:23; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]24; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]25; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb126; EPILOG:       loop_exiting_bb1:27; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit28; EPILOG:       loop_exiting_bb2:29; EPILOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit30; EPILOG:       exit3.loopexit:31; EPILOG-NEXT:    br label %exit332; EPILOG:       exit3.loopexit3:33; EPILOG-NEXT:    br label %exit334; EPILOG:       exit3:35; EPILOG-NEXT:    ret void36; EPILOG:       loop_latch:37; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.138; EPILOG:       loop_exiting_bb1.1:39; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit40; EPILOG:       loop_exiting_bb2.1:41; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit42; EPILOG:       loop_latch.1:43; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.244; EPILOG:       loop_exiting_bb1.2:45; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit46; EPILOG:       loop_exiting_bb2.2:47; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit48; EPILOG:       loop_latch.2:49; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.350; EPILOG:       loop_exiting_bb1.3:51; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit52; EPILOG:       loop_exiting_bb2.3:53; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit54; EPILOG:       loop_latch.3:55; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.456; EPILOG:       loop_exiting_bb1.4:57; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit58; EPILOG:       loop_exiting_bb2.4:59; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit60; EPILOG:       loop_latch.4:61; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.562; EPILOG:       loop_exiting_bb1.5:63; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit64; EPILOG:       loop_exiting_bb2.5:65; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit66; EPILOG:       loop_latch.5:67; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.668; EPILOG:       loop_exiting_bb1.6:69; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit70; EPILOG:       loop_exiting_bb2.6:71; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit72; EPILOG:       loop_latch.6:73; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.774; EPILOG:       loop_exiting_bb1.7:75; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit76; EPILOG:       loop_exiting_bb2.7:77; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit78; EPILOG:       loop_latch.7:79; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 880; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 881; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter82; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa83; EPILOG:       exit1.loopexit:84; EPILOG-NEXT:    br label %exit185; EPILOG:       exit1.loopexit2:86; EPILOG-NEXT:    br label %exit187; EPILOG:       exit1:88; EPILOG-NEXT:    ret void89; EPILOG:       exit2.loopexit.unr-lcssa:90; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]91; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 092; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit93; EPILOG:       loop_header.epil.preheader:94; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit2.loopexit.unr-lcssa ]95; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 096; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)97; EPILOG-NEXT:    br label %loop_header.epil98; EPILOG:       loop_header.epil:99; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]100; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]101; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil102; EPILOG:       loop_exiting_bb1.epil:103; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit2104; EPILOG:       loop_exiting_bb2.epil:105; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit3106; EPILOG:       loop_latch.epil:107; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1108; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip109; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1110; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter111; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0112; EPILOG:       exit2.loopexit.epilog-lcssa:113; EPILOG-NEXT:    br label %exit2.loopexit114; EPILOG:       exit2.loopexit:115; EPILOG-NEXT:    ret void116;117; EPILOG-BLOCK-LABEL: @test1(118; EPILOG-BLOCK-NEXT:  entry:119; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip120; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1121; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1122; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1123; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new124; EPILOG-BLOCK:       entry.new:125; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter126; EPILOG-BLOCK-NEXT:    br label %loop_header127; EPILOG-BLOCK:       loop_header:128; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]129; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]130; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1131; EPILOG-BLOCK:       loop_exiting_bb1:132; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit133; EPILOG-BLOCK:       loop_exiting_bb2:134; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit135; EPILOG-BLOCK:       exit3.loopexit:136; EPILOG-BLOCK-NEXT:    br label %exit3137; EPILOG-BLOCK:       exit3:138; EPILOG-BLOCK-NEXT:    ret void139; EPILOG-BLOCK:       loop_latch:140; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1141; EPILOG-BLOCK:       loop_exiting_bb1.1:142; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit143; EPILOG-BLOCK:       loop_exiting_bb2.1:144; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit145; EPILOG-BLOCK:       loop_latch.1:146; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2147; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2148; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter149; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0150; EPILOG-BLOCK:       exit1.loopexit:151; EPILOG-BLOCK-NEXT:    br label %exit1152; EPILOG-BLOCK:       exit1:153; EPILOG-BLOCK-NEXT:    ret void154; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:155; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0156; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit157; EPILOG-BLOCK:       loop_header.epil.preheader:158; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 0159; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)160; EPILOG-BLOCK-NEXT:    br label %loop_header.epil161; EPILOG-BLOCK:       loop_header.epil:162; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil163; EPILOG-BLOCK:       loop_exiting_bb1.epil:164; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1165; EPILOG-BLOCK:       loop_exiting_bb2.epil:166; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3167; EPILOG-BLOCK:       loop_latch.epil:168; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit169; EPILOG-BLOCK:       exit2.loopexit:170; EPILOG-BLOCK-NEXT:    ret void171;172; PROLOG-LABEL: @test1(173; PROLOG-NEXT:  entry:174; PROLOG-NEXT:    %0 = freeze i64 %trip175; PROLOG-NEXT:    %1 = add i64 %0, -1176; PROLOG-NEXT:    %xtraiter = and i64 %0, 7177; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0178; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit179; PROLOG:       loop_header.prol.preheader:180; PROLOG-NEXT:    br label %loop_header.prol181; PROLOG:       loop_header.prol:182; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]183; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]184; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol185; PROLOG:       loop_exiting_bb1.prol:186; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1187; PROLOG:       loop_exiting_bb2.prol:188; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2189; PROLOG:       loop_latch.prol:190; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1191; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip192; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1193; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter194; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0195; PROLOG:       loop_header.prol.loopexit.unr-lcssa:196; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]197; PROLOG-NEXT:    br label %loop_header.prol.loopexit198; PROLOG:       loop_header.prol.loopexit:199; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]200; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7201; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new202; PROLOG:       entry.new:203; PROLOG-NEXT:    br label %loop_header204; PROLOG:       loop_header:205; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]206; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1207; PROLOG:       loop_exiting_bb1:208; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit209; PROLOG:       loop_exiting_bb2:210; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit211; PROLOG:       exit3.loopexit:212; PROLOG-NEXT:    br label %exit3213; PROLOG:       exit3.loopexit2:214; PROLOG-NEXT:    br label %exit3215; PROLOG:       exit3:216; PROLOG-NEXT:    ret void217; PROLOG:       loop_latch:218; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1219; PROLOG:       loop_exiting_bb1.1:220; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit221; PROLOG:       loop_exiting_bb2.1:222; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit223; PROLOG:       loop_latch.1:224; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2225; PROLOG:       loop_exiting_bb1.2:226; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit227; PROLOG:       loop_exiting_bb2.2:228; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit229; PROLOG:       loop_latch.2:230; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3231; PROLOG:       loop_exiting_bb1.3:232; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit233; PROLOG:       loop_exiting_bb2.3:234; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit235; PROLOG:       loop_latch.3:236; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4237; PROLOG:       loop_exiting_bb1.4:238; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit239; PROLOG:       loop_exiting_bb2.4:240; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit241; PROLOG:       loop_latch.4:242; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5243; PROLOG:       loop_exiting_bb1.5:244; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit245; PROLOG:       loop_exiting_bb2.5:246; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit247; PROLOG:       loop_latch.5:248; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6249; PROLOG:       loop_exiting_bb1.6:250; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit251; PROLOG:       loop_exiting_bb2.6:252; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit253; PROLOG:       loop_latch.6:254; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7255; PROLOG:       loop_exiting_bb1.7:256; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit257; PROLOG:       loop_exiting_bb2.7:258; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit259; PROLOG:       loop_latch.7:260; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8261; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip262; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa263; PROLOG:       exit1.loopexit:264; PROLOG-NEXT:    br label %exit1265; PROLOG:       exit1.loopexit1:266; PROLOG-NEXT:    br label %exit1267; PROLOG:       exit1:268; PROLOG-NEXT:    ret void269; PROLOG:       exit2.loopexit.unr-lcssa:270; PROLOG-NEXT:    br label %exit2.loopexit271; PROLOG:       exit2.loopexit:272; PROLOG-NEXT:    ret void273;274; PROLOG-BLOCK-LABEL: @test1(275; PROLOG-BLOCK-NEXT:  entry:276; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip277; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1278; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1279; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0280; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit281; PROLOG-BLOCK:       loop_header.prol.preheader:282; PROLOG-BLOCK-NEXT:    br label %loop_header.prol283; PROLOG-BLOCK:       loop_header.prol:284; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol285; PROLOG-BLOCK:       loop_exiting_bb1.prol:286; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1287; PROLOG-BLOCK:       loop_exiting_bb2.prol:288; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3289; PROLOG-BLOCK:       loop_latch.prol:290; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit291; PROLOG-BLOCK:       loop_header.prol.loopexit:292; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]293; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1294; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new295; PROLOG-BLOCK:       entry.new:296; PROLOG-BLOCK-NEXT:    br label %loop_header297; PROLOG-BLOCK:       loop_header:298; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]299; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1300; PROLOG-BLOCK:       loop_exiting_bb1:301; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit302; PROLOG-BLOCK:       loop_exiting_bb2:303; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit304; PROLOG-BLOCK:       exit3.loopexit:305; PROLOG-BLOCK-NEXT:    br label %exit3306; PROLOG-BLOCK:       exit3:307; PROLOG-BLOCK-NEXT:    ret void308; PROLOG-BLOCK:       loop_latch:309; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1310; PROLOG-BLOCK:       loop_exiting_bb1.1:311; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit312; PROLOG-BLOCK:       loop_exiting_bb2.1:313; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit314; PROLOG-BLOCK:       loop_latch.1:315; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2316; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip317; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0318; PROLOG-BLOCK:       exit1.loopexit:319; PROLOG-BLOCK-NEXT:    br label %exit1320; PROLOG-BLOCK:       exit1:321; PROLOG-BLOCK-NEXT:    ret void322; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:323; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit324; PROLOG-BLOCK:       exit2.loopexit:325; PROLOG-BLOCK-NEXT:    ret void326;327 328entry:329  br label %loop_header330 331loop_header:332  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]333  br i1 %cond, label %loop_latch, label %loop_exiting_bb1334 335loop_exiting_bb1:336  br i1 false, label %loop_exiting_bb2, label %exit1337 338loop_exiting_bb2:339  br i1 false, label %loop_latch, label %exit3340 341exit3:342  ret void343 344loop_latch:345  %iv_next = add i64 %iv, 1346  %cmp = icmp ne i64 %iv_next, %trip347  br i1 %cmp, label %loop_header, label %exit2.loopexit348 349exit1:350  ret void351 352exit2.loopexit:353  ret void354}355 356 357; test with three exiting and two exit blocks.358; The non-latch exit block has 2 unique predecessors.359; There are 2 values passed to the exit blocks that are calculated at every iteration.360; %sum.02 and %add. Both of these are incoming values for phi from every exiting361; unrolled block.362define i32 @test2(ptr nocapture %a, i64 %n) {363; EPILOG-LABEL: @test2(364; EPILOG-NEXT:  entry:365; EPILOG-NEXT:    %0 = freeze i64 %n366; EPILOG-NEXT:    %1 = add i64 %0, -1367; EPILOG-NEXT:    %xtraiter = and i64 %0, 7368; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7369; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new370; EPILOG:       entry.new:371; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter372; EPILOG-NEXT:    br label %header373; EPILOG:       header:374; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]375; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]376; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ]377; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block378; EPILOG:       for.exiting_block:379; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42380; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body381; EPILOG:       for.body:382; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv383; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4384; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02385; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1386; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1387; EPILOG:       for.exiting_block.1:388; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42389; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1390; EPILOG:       for.body.1:391; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next392; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4393; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add394; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2395; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2396; EPILOG:       for.exiting_block.2:397; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42398; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2399; EPILOG:       for.body.2:400; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1401; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4402; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1403; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3404; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3405; EPILOG:       for.exiting_block.3:406; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42407; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3408; EPILOG:       for.body.3:409; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2410; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4411; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2412; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4413; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4414; EPILOG:       for.exiting_block.4:415; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42416; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4417; EPILOG:       for.body.4:418; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3419; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4420; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3421; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5422; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5423; EPILOG:       for.exiting_block.5:424; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42425; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5426; EPILOG:       for.body.5:427; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4428; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4429; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4430; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6431; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6432; EPILOG:       for.exiting_block.6:433; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42434; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6435; EPILOG:       for.body.6:436; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5437; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4438; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5439; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7440; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7441; EPILOG:       for.exiting_block.7:442; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42443; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7444; EPILOG:       for.body.7:445; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6446; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4447; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6448; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8449; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8450; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter451; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa, label %header452; EPILOG:       for.end.unr-lcssa:453; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]454; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %for.body.7 ]455; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %for.body.7 ]456; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0457; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end458; EPILOG:       header.epil.preheader:459; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %for.end.unr-lcssa ]460; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %for.end.unr-lcssa ]461; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 0462; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)463; EPILOG-NEXT:    br label %header.epil464; EPILOG:       header.epil:465; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]466; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.epil.init, %header.epil.preheader ]467; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ]468; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit3, label %for.exiting_block.epil469; EPILOG:       for.exiting_block.epil:470; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42471; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit3, label %for.body.epil472; EPILOG:       for.body.epil:473; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil474; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4475; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil476; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1477; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n478; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1479; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter480; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2481; EPILOG:       for.end.epilog-lcssa:482; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]483; EPILOG-NEXT:    br label %for.end484; EPILOG:       for.end:485; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]486; EPILOG-NEXT:    ret i32 %sum.0.lcssa487; EPILOG:       for.exit2.loopexit:488; EPILOG-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ]489; EPILOG-NEXT:    br label %for.exit2490; EPILOG:       for.exit2.loopexit3:491; EPILOG-NEXT:    %retval.ph4 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]492; EPILOG-NEXT:    br label %for.exit2493; EPILOG:       for.exit2:494; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph4, %for.exit2.loopexit3 ]495; EPILOG-NEXT:    ret i32 %retval496;497; EPILOG-BLOCK-LABEL: @test2(498; EPILOG-BLOCK-NEXT:  entry:499; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n500; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1501; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1502; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1503; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new504; EPILOG-BLOCK:       entry.new:505; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter506; EPILOG-BLOCK-NEXT:    br label %header507; EPILOG-BLOCK:       header:508; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]509; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]510; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ]511; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block512; EPILOG-BLOCK:       for.exiting_block:513; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42514; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body515; EPILOG-BLOCK:       for.body:516; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv517; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4518; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02519; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1520; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1521; EPILOG-BLOCK:       for.exiting_block.1:522; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42523; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1524; EPILOG-BLOCK:       for.body.1:525; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next526; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4527; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add528; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2529; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2530; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter531; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2532; EPILOG-BLOCK:       for.end.unr-lcssa:533; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]534; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %for.body.1 ]535; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %for.body.1 ]536; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0537; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end538; EPILOG-BLOCK:       header.epil.preheader:539; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %for.end.unr-lcssa ]540; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %for.end.unr-lcssa ]541; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 0542; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)543; EPILOG-BLOCK-NEXT:    br label %header.epil544; EPILOG-BLOCK:       header.epil:545; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil546; EPILOG-BLOCK:       for.exiting_block.epil:547; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42548; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil549; EPILOG-BLOCK:       for.body.epil:550; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init551; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4552; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.epil.init553; EPILOG-BLOCK-NEXT:    br label %for.end554; EPILOG-BLOCK:       for.end:555; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]556; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa557; EPILOG-BLOCK:       for.exit2.loopexit:558; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]559; EPILOG-BLOCK-NEXT:    br label %for.exit2560; EPILOG-BLOCK:       for.exit2:561; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil.init, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]562; EPILOG-BLOCK-NEXT:    ret i32 %retval563;564; PROLOG-LABEL: @test2(565; PROLOG-NEXT:  entry:566; PROLOG-NEXT:    %0 = freeze i64 %n567; PROLOG-NEXT:    %1 = add i64 %0, -1568; PROLOG-NEXT:    %xtraiter = and i64 %0, 7569; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0570; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit571; PROLOG:       header.prol.preheader:572; PROLOG-NEXT:    br label %header.prol573; PROLOG:       header.prol:574; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]575; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]576; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ]577; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol578; PROLOG:       for.exiting_block.prol:579; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42580; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol581; PROLOG:       for.body.prol:582; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol583; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4584; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol585; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1586; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n587; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1588; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter589; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2590; PROLOG:       header.prol.loopexit.unr-lcssa:591; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]592; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]593; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]594; PROLOG-NEXT:    br label %header.prol.loopexit595; PROLOG:       header.prol.loopexit:596; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]597; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]598; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]599; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7600; PROLOG-NEXT:    br i1 %3, label %for.end, label %entry.new601; PROLOG:       entry.new:602; PROLOG-NEXT:    br label %header603; PROLOG:       header:604; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]605; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]606; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block607; PROLOG:       for.exiting_block:608; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42609; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body610; PROLOG:       for.body:611; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv612; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4613; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02614; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1615; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1616; PROLOG:       for.exiting_block.1:617; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42618; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1619; PROLOG:       for.body.1:620; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next621; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4622; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add623; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2624; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2625; PROLOG:       for.exiting_block.2:626; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42627; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2628; PROLOG:       for.body.2:629; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1630; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4631; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1632; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3633; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3634; PROLOG:       for.exiting_block.3:635; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42636; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3637; PROLOG:       for.body.3:638; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2639; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4640; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2641; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4642; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4643; PROLOG:       for.exiting_block.4:644; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42645; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4646; PROLOG:       for.body.4:647; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3648; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4649; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3650; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5651; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5652; PROLOG:       for.exiting_block.5:653; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42654; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5655; PROLOG:       for.body.5:656; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4657; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4658; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4659; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6660; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6661; PROLOG:       for.exiting_block.6:662; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42663; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6664; PROLOG:       for.body.6:665; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5666; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4667; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5668; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7669; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7670; PROLOG:       for.exiting_block.7:671; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42672; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7673; PROLOG:       for.body.7:674; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6675; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4676; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6677; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8678; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n679; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header680; PROLOG:       for.end.unr-lcssa:681; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]682; PROLOG-NEXT:    br label %for.end683; PROLOG:       for.end:684; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]685; PROLOG-NEXT:    ret i32 %sum.0.lcssa686; PROLOG:       for.exit2.loopexit:687; PROLOG-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ]688; PROLOG-NEXT:    br label %for.exit2689; PROLOG:       for.exit2.loopexit1:690; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]691; PROLOG-NEXT:    br label %for.exit2692; PROLOG:       for.exit2:693; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]694; PROLOG-NEXT:    ret i32 %retval695;696; PROLOG-BLOCK-LABEL: @test2(697; PROLOG-BLOCK-NEXT:  entry:698; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n699; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1700; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1701; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0702; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit703; PROLOG-BLOCK:       header.prol.preheader:704; PROLOG-BLOCK-NEXT:    br label %header.prol705; PROLOG-BLOCK:       header.prol:706; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol707; PROLOG-BLOCK:       for.exiting_block.prol:708; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42709; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol710; PROLOG-BLOCK:       for.body.prol:711; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4712; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit713; PROLOG-BLOCK:       header.prol.loopexit:714; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %2, %for.body.prol ]715; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ]716; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ]717; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1718; PROLOG-BLOCK-NEXT:    br i1 %3, label %for.end, label %entry.new719; PROLOG-BLOCK:       entry.new:720; PROLOG-BLOCK-NEXT:    br label %header721; PROLOG-BLOCK:       header:722; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]723; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]724; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block725; PROLOG-BLOCK:       for.exiting_block:726; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42727; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body728; PROLOG-BLOCK:       for.body:729; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv730; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4731; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02732; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1733; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1734; PROLOG-BLOCK:       for.exiting_block.1:735; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42736; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1737; PROLOG-BLOCK:       for.body.1:738; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next739; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4740; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add741; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2742; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n743; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2744; PROLOG-BLOCK:       for.end.unr-lcssa:745; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]746; PROLOG-BLOCK-NEXT:    br label %for.end747; PROLOG-BLOCK:       for.end:748; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]749; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa750; PROLOG-BLOCK:       for.exit2.loopexit:751; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]752; PROLOG-BLOCK-NEXT:    br label %for.exit2753; PROLOG-BLOCK:       for.exit2:754; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]755; PROLOG-BLOCK-NEXT:    ret i32 %retval756;757 758 759entry:760  br label %header761 762header:763  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]764  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]765  br i1 false, label %for.exit2, label %for.exiting_block766 767for.exiting_block:768  %cmp = icmp eq i64 %n, 42769  br i1 %cmp, label %for.exit2, label %for.body770 771for.body:772  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv773  %0 = load i32, ptr %arrayidx, align 4774  %add = add nsw i32 %0, %sum.02775  %indvars.iv.next = add i64 %indvars.iv, 1776  %exitcond = icmp eq i64 %indvars.iv.next, %n777  br i1 %exitcond, label %for.end, label %header778 779for.end:                                          ; preds = %for.body780  %sum.0.lcssa = phi i32 [ %add, %for.body ]781  ret i32 %sum.0.lcssa782 783for.exit2:784  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]785  ret i32 %retval786}787 788; test with two exiting and three exit blocks.789; the non-latch exiting block has a switch.790define void @test3(i64 %trip, i64 %add, i1 %arg) {791; EPILOG-LABEL: @test3(792; EPILOG-NEXT:  entry:793; EPILOG-NEXT:    %0 = freeze i64 %trip794; EPILOG-NEXT:    %1 = add i64 %0, -1795; EPILOG-NEXT:    %xtraiter = and i64 %0, 7796; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7797; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new798; EPILOG:       entry.new:799; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter800; EPILOG-NEXT:    br label %loop_header801; EPILOG:       loop_header:802; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]803; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]804; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]805; EPILOG-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1806; EPILOG:       loop_exiting_bb1:807; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [808; EPILOG-NEXT:      i64 24, label %exit1.loopexit809; EPILOG-NEXT:      i64 42, label %exit3.loopexit810; EPILOG-NEXT:    ]811; EPILOG:       exit3.loopexit:812; EPILOG-NEXT:    br label %exit3813; EPILOG:       exit3.loopexit3:814; EPILOG-NEXT:    br label %exit3815; EPILOG:       exit3:816; EPILOG-NEXT:    ret void817; EPILOG:       loop_latch:818; EPILOG-NEXT:    %sum.next = add i64 %sum, %add819; EPILOG-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1820; EPILOG:       loop_exiting_bb1.1:821; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [822; EPILOG-NEXT:      i64 24, label %exit1.loopexit823; EPILOG-NEXT:      i64 42, label %exit3.loopexit824; EPILOG-NEXT:    ]825; EPILOG:       loop_latch.1:826; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add827; EPILOG-NEXT:    br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.2828; EPILOG:       loop_exiting_bb1.2:829; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [830; EPILOG-NEXT:      i64 24, label %exit1.loopexit831; EPILOG-NEXT:      i64 42, label %exit3.loopexit832; EPILOG-NEXT:    ]833; EPILOG:       loop_latch.2:834; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add835; EPILOG-NEXT:    br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.3836; EPILOG:       loop_exiting_bb1.3:837; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [838; EPILOG-NEXT:      i64 24, label %exit1.loopexit839; EPILOG-NEXT:      i64 42, label %exit3.loopexit840; EPILOG-NEXT:    ]841; EPILOG:       loop_latch.3:842; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add843; EPILOG-NEXT:    br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.4844; EPILOG:       loop_exiting_bb1.4:845; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [846; EPILOG-NEXT:      i64 24, label %exit1.loopexit847; EPILOG-NEXT:      i64 42, label %exit3.loopexit848; EPILOG-NEXT:    ]849; EPILOG:       loop_latch.4:850; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add851; EPILOG-NEXT:    br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.5852; EPILOG:       loop_exiting_bb1.5:853; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [854; EPILOG-NEXT:      i64 24, label %exit1.loopexit855; EPILOG-NEXT:      i64 42, label %exit3.loopexit856; EPILOG-NEXT:    ]857; EPILOG:       loop_latch.5:858; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add859; EPILOG-NEXT:    br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.6860; EPILOG:       loop_exiting_bb1.6:861; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [862; EPILOG-NEXT:      i64 24, label %exit1.loopexit863; EPILOG-NEXT:      i64 42, label %exit3.loopexit864; EPILOG-NEXT:    ]865; EPILOG:       loop_latch.6:866; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add867; EPILOG-NEXT:    br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.7868; EPILOG:       loop_exiting_bb1.7:869; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [870; EPILOG-NEXT:      i64 24, label %exit1.loopexit871; EPILOG-NEXT:      i64 42, label %exit3.loopexit872; EPILOG-NEXT:    ]873; EPILOG:       loop_latch.7:874; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 8875; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add876; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8877; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter878; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa879; EPILOG:       exit1.loopexit:880; EPILOG-NEXT:    br label %exit1881; EPILOG:       exit1.loopexit2:882; EPILOG-NEXT:    br label %exit1883; EPILOG:       exit1:884; EPILOG-NEXT:    ret void885; EPILOG:       exit2.loopexit.unr-lcssa:886; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]887; EPILOG-NEXT:    %sum.unr = phi i64 [ %sum.next.7, %loop_latch.7 ]888; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0889; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit890; EPILOG:       loop_header.epil.preheader:891; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit2.loopexit.unr-lcssa ]892; EPILOG-NEXT:    %sum.epil.init = phi i64 [ 0, %entry ], [ %sum.unr, %exit2.loopexit.unr-lcssa ]893; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 0894; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)895; EPILOG-NEXT:    br label %loop_header.epil896; EPILOG:       loop_header.epil:897; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]898; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.epil.init, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]899; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]900; EPILOG-NEXT:    br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil901; EPILOG:       loop_exiting_bb1.epil:902; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [903; EPILOG-NEXT:      i64 24, label %exit1.loopexit2904; EPILOG-NEXT:      i64 42, label %exit3.loopexit3905; EPILOG-NEXT:    ]906; EPILOG:       loop_latch.epil:907; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1908; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add909; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip910; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1911; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter912; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3913; EPILOG:       exit2.loopexit.epilog-lcssa:914; EPILOG-NEXT:    br label %exit2.loopexit915; EPILOG:       exit2.loopexit:916; EPILOG-NEXT:    ret void917;918; EPILOG-BLOCK-LABEL: @test3(919; EPILOG-BLOCK-NEXT:  entry:920; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip921; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1922; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1923; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1924; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new925; EPILOG-BLOCK:       entry.new:926; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter927; EPILOG-BLOCK-NEXT:    br label %loop_header928; EPILOG-BLOCK:       loop_header:929; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]930; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]931; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]932; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1933; EPILOG-BLOCK:       loop_exiting_bb1:934; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [935; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit936; EPILOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit937; EPILOG-BLOCK-NEXT:    ]938; EPILOG-BLOCK:       exit3.loopexit:939; EPILOG-BLOCK-NEXT:    br label %exit3940; EPILOG-BLOCK:       exit3:941; EPILOG-BLOCK-NEXT:    ret void942; EPILOG-BLOCK:       loop_latch:943; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add944; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1945; EPILOG-BLOCK:       loop_exiting_bb1.1:946; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [947; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit948; EPILOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit949; EPILOG-BLOCK-NEXT:    ]950; EPILOG-BLOCK:       loop_latch.1:951; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2952; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add953; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2954; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter955; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3956; EPILOG-BLOCK:       exit1.loopexit:957; EPILOG-BLOCK-NEXT:    br label %exit1958; EPILOG-BLOCK:       exit1:959; EPILOG-BLOCK-NEXT:    ret void960; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:961; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ %sum.next.1, %loop_latch.1 ]962; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0963; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit964; EPILOG-BLOCK:       loop_header.epil.preheader:965; EPILOG-BLOCK-NEXT:    %sum.epil.init = phi i64 [ 0, %entry ], [ %sum.unr, %exit2.loopexit.unr-lcssa ]966; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 0967; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)968; EPILOG-BLOCK-NEXT:    br label %loop_header.epil969; EPILOG-BLOCK:       loop_header.epil:970; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil971; EPILOG-BLOCK:       loop_exiting_bb1.epil:972; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil.init, label %loop_latch.epil [973; EPILOG-BLOCK-NEXT:      i64 24, label %exit1974; EPILOG-BLOCK-NEXT:      i64 42, label %exit3975; EPILOG-BLOCK-NEXT:    ]976; EPILOG-BLOCK:       loop_latch.epil:977; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit978; EPILOG-BLOCK:       exit2.loopexit:979; EPILOG-BLOCK-NEXT:    ret void980;981; PROLOG-LABEL: @test3(982; PROLOG-NEXT:  entry:983; PROLOG-NEXT:    %0 = freeze i64 %trip984; PROLOG-NEXT:    %1 = add i64 %0, -1985; PROLOG-NEXT:    %xtraiter = and i64 %0, 7986; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0987; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit988; PROLOG:       loop_header.prol.preheader:989; PROLOG-NEXT:    br label %loop_header.prol990; PROLOG:       loop_header.prol:991; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]992; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]993; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]994; PROLOG-NEXT:    br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol995; PROLOG:       loop_exiting_bb1.prol:996; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [997; PROLOG-NEXT:      i64 24, label %exit1.loopexit1998; PROLOG-NEXT:      i64 42, label %exit3.loopexit2999; PROLOG-NEXT:    ]1000; PROLOG:       loop_latch.prol:1001; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 11002; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add1003; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip1004; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 11005; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter1006; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !31007; PROLOG:       loop_header.prol.loopexit.unr-lcssa:1008; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]1009; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]1010; PROLOG-NEXT:    br label %loop_header.prol.loopexit1011; PROLOG:       loop_header.prol.loopexit:1012; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]1013; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]1014; PROLOG-NEXT:    %2 = icmp ult i64 %1, 71015; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new1016; PROLOG:       entry.new:1017; PROLOG-NEXT:    br label %loop_header1018; PROLOG:       loop_header:1019; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]1020; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]1021; PROLOG-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb11022; PROLOG:       loop_exiting_bb1:1023; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [1024; PROLOG-NEXT:      i64 24, label %exit1.loopexit1025; PROLOG-NEXT:      i64 42, label %exit3.loopexit1026; PROLOG-NEXT:    ]1027; PROLOG:       exit3.loopexit:1028; PROLOG-NEXT:    br label %exit31029; PROLOG:       exit3.loopexit2:1030; PROLOG-NEXT:    br label %exit31031; PROLOG:       exit3:1032; PROLOG-NEXT:    ret void1033; PROLOG:       loop_latch:1034; PROLOG-NEXT:    %sum.next = add i64 %sum, %add1035; PROLOG-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.11036; PROLOG:       loop_exiting_bb1.1:1037; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [1038; PROLOG-NEXT:      i64 24, label %exit1.loopexit1039; PROLOG-NEXT:      i64 42, label %exit3.loopexit1040; PROLOG-NEXT:    ]1041; PROLOG:       loop_latch.1:1042; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add1043; PROLOG-NEXT:    br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.21044; PROLOG:       loop_exiting_bb1.2:1045; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [1046; PROLOG-NEXT:      i64 24, label %exit1.loopexit1047; PROLOG-NEXT:      i64 42, label %exit3.loopexit1048; PROLOG-NEXT:    ]1049; PROLOG:       loop_latch.2:1050; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add1051; PROLOG-NEXT:    br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.31052; PROLOG:       loop_exiting_bb1.3:1053; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [1054; PROLOG-NEXT:      i64 24, label %exit1.loopexit1055; PROLOG-NEXT:      i64 42, label %exit3.loopexit1056; PROLOG-NEXT:    ]1057; PROLOG:       loop_latch.3:1058; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add1059; PROLOG-NEXT:    br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.41060; PROLOG:       loop_exiting_bb1.4:1061; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [1062; PROLOG-NEXT:      i64 24, label %exit1.loopexit1063; PROLOG-NEXT:      i64 42, label %exit3.loopexit1064; PROLOG-NEXT:    ]1065; PROLOG:       loop_latch.4:1066; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add1067; PROLOG-NEXT:    br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.51068; PROLOG:       loop_exiting_bb1.5:1069; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [1070; PROLOG-NEXT:      i64 24, label %exit1.loopexit1071; PROLOG-NEXT:      i64 42, label %exit3.loopexit1072; PROLOG-NEXT:    ]1073; PROLOG:       loop_latch.5:1074; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add1075; PROLOG-NEXT:    br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.61076; PROLOG:       loop_exiting_bb1.6:1077; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [1078; PROLOG-NEXT:      i64 24, label %exit1.loopexit1079; PROLOG-NEXT:      i64 42, label %exit3.loopexit1080; PROLOG-NEXT:    ]1081; PROLOG:       loop_latch.6:1082; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add1083; PROLOG-NEXT:    br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.71084; PROLOG:       loop_exiting_bb1.7:1085; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [1086; PROLOG-NEXT:      i64 24, label %exit1.loopexit1087; PROLOG-NEXT:      i64 42, label %exit3.loopexit1088; PROLOG-NEXT:    ]1089; PROLOG:       loop_latch.7:1090; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 81091; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add1092; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip1093; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa1094; PROLOG:       exit1.loopexit:1095; PROLOG-NEXT:    br label %exit11096; PROLOG:       exit1.loopexit1:1097; PROLOG-NEXT:    br label %exit11098; PROLOG:       exit1:1099; PROLOG-NEXT:    ret void1100; PROLOG:       exit2.loopexit.unr-lcssa:1101; PROLOG-NEXT:    br label %exit2.loopexit1102; PROLOG:       exit2.loopexit:1103; PROLOG-NEXT:    ret void1104;1105; PROLOG-BLOCK-LABEL: @test3(1106; PROLOG-BLOCK-NEXT:  entry:1107; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip1108; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -11109; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 11110; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01111; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit1112; PROLOG-BLOCK:       loop_header.prol.preheader:1113; PROLOG-BLOCK-NEXT:    br label %loop_header.prol1114; PROLOG-BLOCK:       loop_header.prol:1115; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol1116; PROLOG-BLOCK:       loop_exiting_bb1.prol:1117; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [1118; PROLOG-BLOCK-NEXT:      i64 24, label %exit11119; PROLOG-BLOCK-NEXT:      i64 42, label %exit31120; PROLOG-BLOCK-NEXT:    ]1121; PROLOG-BLOCK:       loop_latch.prol:1122; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit1123; PROLOG-BLOCK:       loop_header.prol.loopexit:1124; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]1125; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]1126; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 11127; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new1128; PROLOG-BLOCK:       entry.new:1129; PROLOG-BLOCK-NEXT:    br label %loop_header1130; PROLOG-BLOCK:       loop_header:1131; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]1132; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]1133; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb11134; PROLOG-BLOCK:       loop_exiting_bb1:1135; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [1136; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit1137; PROLOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit1138; PROLOG-BLOCK-NEXT:    ]1139; PROLOG-BLOCK:       exit3.loopexit:1140; PROLOG-BLOCK-NEXT:    br label %exit31141; PROLOG-BLOCK:       exit3:1142; PROLOG-BLOCK-NEXT:    ret void1143; PROLOG-BLOCK:       loop_latch:1144; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add1145; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.11146; PROLOG-BLOCK:       loop_exiting_bb1.1:1147; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [1148; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit1149; PROLOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit1150; PROLOG-BLOCK-NEXT:    ]1151; PROLOG-BLOCK:       loop_latch.1:1152; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 21153; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add1154; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip1155; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !31156; PROLOG-BLOCK:       exit1.loopexit:1157; PROLOG-BLOCK-NEXT:    br label %exit11158; PROLOG-BLOCK:       exit1:1159; PROLOG-BLOCK-NEXT:    ret void1160; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:1161; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit1162; PROLOG-BLOCK:       exit2.loopexit:1163; PROLOG-BLOCK-NEXT:    ret void1164;1165 1166entry:1167  br label %loop_header1168 1169loop_header:1170  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]1171  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]1172  br i1 %arg, label %loop_latch, label %loop_exiting_bb11173 1174loop_exiting_bb1:1175  switch i64 %sum, label %loop_latch [1176  i64 24, label %exit11177  i64 42, label %exit31178  ]1179 1180exit3:1181  ret void1182 1183loop_latch:1184  %iv_next = add nuw nsw i64 %iv, 11185  %sum.next = add i64 %sum, %add1186  %cmp = icmp ne i64 %iv_next, %trip1187  br i1 %cmp, label %loop_header, label %exit2.loopexit1188 1189exit1:1190  ret void1191 1192exit2.loopexit:1193  ret void1194}1195 1196; FIXME: Support multiple exiting blocks to the same latch exit block.1197; Three exiting blocks where header and latch exit to same LatchExit.1198define i32 @hdr_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) {1199; EPILOG-LABEL: @hdr_latch_same_exit(1200; EPILOG-NEXT:  entry:1201; EPILOG-NEXT:    %0 = freeze i64 %n1202; EPILOG-NEXT:    %1 = add i64 %0, -11203; EPILOG-NEXT:    %xtraiter = and i64 %0, 71204; EPILOG-NEXT:    %2 = icmp ult i64 %1, 71205; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new1206; EPILOG:       entry.new:1207; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter1208; EPILOG-NEXT:    br label %header1209; EPILOG:       header:1210; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]1211; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]1212; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]1213; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block1214; EPILOG:       for.exiting_block:1215; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 421216; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch1217; EPILOG:       latch:1218; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1219; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 41220; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.021221; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11222; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.11223; EPILOG:       for.exiting_block.1:1224; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 421225; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.11226; EPILOG:       latch.1:1227; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1228; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 41229; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add1230; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 21231; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.21232; EPILOG:       for.exiting_block.2:1233; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 421234; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.21235; EPILOG:       latch.2:1236; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.11237; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 41238; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.11239; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 31240; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.31241; EPILOG:       for.exiting_block.3:1242; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 421243; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.31244; EPILOG:       latch.3:1245; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.21246; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 41247; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.21248; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 41249; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.41250; EPILOG:       for.exiting_block.4:1251; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 421252; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.41253; EPILOG:       latch.4:1254; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.31255; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 41256; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.31257; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 51258; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.51259; EPILOG:       for.exiting_block.5:1260; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 421261; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.51262; EPILOG:       latch.5:1263; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.41264; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 41265; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.41266; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 61267; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.61268; EPILOG:       for.exiting_block.6:1269; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 421270; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.61271; EPILOG:       latch.6:1272; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.51273; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 41274; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.51275; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 71276; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.71277; EPILOG:       for.exiting_block.7:1278; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 421279; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.71280; EPILOG:       latch.7:1281; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.61282; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 41283; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.61284; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 81285; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 81286; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter1287; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa, label %header1288; EPILOG:       latchExit.unr-lcssa:1289; EPILOG-NEXT:    %result.ph = phi i32 [ %add.7, %latch.7 ]1290; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %latch.7 ]1291; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %latch.7 ]1292; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01293; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit1294; EPILOG:       header.epil.preheader:1295; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]1296; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]1297; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 01298; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)1299; EPILOG-NEXT:    br label %header.epil1300; EPILOG:       header.epil:1301; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]1302; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %header.epil.preheader ]1303; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]1304; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit3, label %for.exiting_block.epil1305; EPILOG:       for.exiting_block.epil:1306; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 421307; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit5, label %latch.epil1308; EPILOG:       latch.epil:1309; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil1310; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 41311; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil1312; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 11313; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n1314; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 11315; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter1316; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !41317; EPILOG:       latchExit.epilog-lcssa.loopexit:1318; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ]1319; EPILOG-NEXT:    br label %latchExit.epilog-lcssa1320; EPILOG:       latchExit.epilog-lcssa.loopexit3:1321; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]1322; EPILOG-NEXT:    br label %latchExit.epilog-lcssa1323; EPILOG:       latchExit.epilog-lcssa:1324; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]1325; EPILOG-NEXT:    br label %latchExit1326; EPILOG:       latchExit:1327; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]1328; EPILOG-NEXT:    ret i32 %result1329; EPILOG:       for.exit2.loopexit:1330; EPILOG-NEXT:    br label %for.exit21331; EPILOG:       for.exit2.loopexit5:1332; EPILOG-NEXT:    br label %for.exit21333; EPILOG:       for.exit2:1334; EPILOG-NEXT:    ret i32 421335;1336; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(1337; EPILOG-BLOCK-NEXT:  entry:1338; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n1339; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -11340; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 11341; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 11342; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new1343; EPILOG-BLOCK:       entry.new:1344; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter1345; EPILOG-BLOCK-NEXT:    br label %header1346; EPILOG-BLOCK:       header:1347; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]1348; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]1349; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]1350; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block1351; EPILOG-BLOCK:       for.exiting_block:1352; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 421353; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch1354; EPILOG-BLOCK:       latch:1355; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1356; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 41357; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.021358; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11359; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.11360; EPILOG-BLOCK:       for.exiting_block.1:1361; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 421362; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.11363; EPILOG-BLOCK:       latch.1:1364; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1365; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 41366; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add1367; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 21368; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 21369; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter1370; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa, label %header, !llvm.loop !41371; EPILOG-BLOCK:       latchExit.unr-lcssa:1372; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ %add.1, %latch.1 ]1373; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %latch.1 ]1374; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %latch.1 ]1375; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01376; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit1377; EPILOG-BLOCK:       header.epil.preheader:1378; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]1379; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]1380; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 01381; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)1382; EPILOG-BLOCK-NEXT:    br label %header.epil1383; EPILOG-BLOCK:       header.epil:1384; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil1385; EPILOG-BLOCK:       for.exiting_block.epil:1386; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 421387; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil1388; EPILOG-BLOCK:       latch.epil:1389; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init1390; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 41391; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.epil.init1392; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa1393; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:1394; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]1395; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa1396; EPILOG-BLOCK:       latchExit.epilog-lcssa:1397; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]1398; EPILOG-BLOCK-NEXT:    br label %latchExit1399; EPILOG-BLOCK:       latchExit:1400; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]1401; EPILOG-BLOCK-NEXT:    ret i32 %result1402; EPILOG-BLOCK:       for.exit2.loopexit:1403; EPILOG-BLOCK-NEXT:    br label %for.exit21404; EPILOG-BLOCK:       for.exit2:1405; EPILOG-BLOCK-NEXT:    ret i32 421406;1407; PROLOG-LABEL: @hdr_latch_same_exit(1408; PROLOG-NEXT:  entry:1409; PROLOG-NEXT:    %0 = freeze i64 %n1410; PROLOG-NEXT:    %1 = add i64 %0, -11411; PROLOG-NEXT:    %xtraiter = and i64 %0, 71412; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01413; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit1414; PROLOG:       header.prol.preheader:1415; PROLOG-NEXT:    br label %header.prol1416; PROLOG:       header.prol:1417; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]1418; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]1419; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]1420; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol1421; PROLOG:       for.exiting_block.prol:1422; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 421423; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol1424; PROLOG:       latch.prol:1425; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol1426; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 41427; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol1428; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 11429; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n1430; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 11431; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter1432; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !41433; PROLOG:       header.prol.loopexit.unr-lcssa:1434; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]1435; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]1436; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]1437; PROLOG-NEXT:    br label %header.prol.loopexit1438; PROLOG:       header.prol.loopexit:1439; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]1440; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]1441; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]1442; PROLOG-NEXT:    %3 = icmp ult i64 %1, 71443; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new1444; PROLOG:       entry.new:1445; PROLOG-NEXT:    br label %header1446; PROLOG:       header:1447; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]1448; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]1449; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block1450; PROLOG:       for.exiting_block:1451; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 421452; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch1453; PROLOG:       latch:1454; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1455; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 41456; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.021457; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 11458; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.11459; PROLOG:       for.exiting_block.1:1460; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 421461; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.11462; PROLOG:       latch.1:1463; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1464; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 41465; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add1466; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 21467; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.21468; PROLOG:       for.exiting_block.2:1469; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 421470; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.21471; PROLOG:       latch.2:1472; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.11473; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 41474; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.11475; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 31476; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.31477; PROLOG:       for.exiting_block.3:1478; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 421479; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.31480; PROLOG:       latch.3:1481; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.21482; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 41483; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.21484; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 41485; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.41486; PROLOG:       for.exiting_block.4:1487; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 421488; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.41489; PROLOG:       latch.4:1490; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.31491; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 41492; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.31493; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 51494; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.51495; PROLOG:       for.exiting_block.5:1496; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 421497; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.51498; PROLOG:       latch.5:1499; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.41500; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 41501; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.41502; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 61503; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.61504; PROLOG:       for.exiting_block.6:1505; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 421506; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.61507; PROLOG:       latch.6:1508; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.51509; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 41510; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.51511; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 71512; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.71513; PROLOG:       for.exiting_block.7:1514; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 421515; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.71516; PROLOG:       latch.7:1517; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.61518; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 41519; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.61520; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 81521; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n1522; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header1523; PROLOG:       latchExit.unr-lcssa.loopexit:1524; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ], [ %add.7, %latch.7 ]1525; PROLOG-NEXT:    br label %latchExit.unr-lcssa1526; PROLOG:       latchExit.unr-lcssa.loopexit1:1527; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]1528; PROLOG-NEXT:    br label %latchExit.unr-lcssa1529; PROLOG:       latchExit.unr-lcssa:1530; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]1531; PROLOG-NEXT:    br label %latchExit1532; PROLOG:       latchExit:1533; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]1534; PROLOG-NEXT:    ret i32 %result1535; PROLOG:       for.exit2.loopexit:1536; PROLOG-NEXT:    br label %for.exit21537; PROLOG:       for.exit2.loopexit3:1538; PROLOG-NEXT:    br label %for.exit21539; PROLOG:       for.exit2:1540; PROLOG-NEXT:    ret i32 421541;1542; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(1543; PROLOG-BLOCK-NEXT:  entry:1544; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n1545; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -11546; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 11547; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01548; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit1549; PROLOG-BLOCK:       header.prol.preheader:1550; PROLOG-BLOCK-NEXT:    br label %header.prol1551; PROLOG-BLOCK:       header.prol:1552; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol1553; PROLOG-BLOCK:       for.exiting_block.prol:1554; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 421555; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol1556; PROLOG-BLOCK:       latch.prol:1557; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 41558; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit1559; PROLOG-BLOCK:       header.prol.loopexit:1560; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]1561; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]1562; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]1563; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 11564; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new1565; PROLOG-BLOCK:       entry.new:1566; PROLOG-BLOCK-NEXT:    br label %header1567; PROLOG-BLOCK:       header:1568; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]1569; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]1570; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block1571; PROLOG-BLOCK:       for.exiting_block:1572; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 421573; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch1574; PROLOG-BLOCK:       latch:1575; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1576; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 41577; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.021578; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 11579; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.11580; PROLOG-BLOCK:       for.exiting_block.1:1581; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 421582; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.11583; PROLOG-BLOCK:       latch.1:1584; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1585; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 41586; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add1587; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 21588; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n1589; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !41590; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:1591; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]1592; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa1593; PROLOG-BLOCK:       latchExit.unr-lcssa:1594; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]1595; PROLOG-BLOCK-NEXT:    br label %latchExit1596; PROLOG-BLOCK:       latchExit:1597; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]1598; PROLOG-BLOCK-NEXT:    ret i32 %result1599; PROLOG-BLOCK:       for.exit2.loopexit:1600; PROLOG-BLOCK-NEXT:    br label %for.exit21601; PROLOG-BLOCK:       for.exit2:1602; PROLOG-BLOCK-NEXT:    ret i32 421603;1604 1605entry:1606  br label %header1607 1608header:1609  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]1610  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]1611  br i1 %cond, label %latchExit, label %for.exiting_block1612 1613for.exiting_block:1614  %cmp = icmp eq i64 %n, 421615  br i1 %cmp, label %for.exit2, label %latch1616 1617latch:                                         ; preds = %latch, %entry1618  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1619  %0 = load i32, ptr %arrayidx, align 41620  %add = add nsw i32 %0, %sum.021621  %indvars.iv.next = add i64 %indvars.iv, 11622  %exitcond = icmp eq i64 %indvars.iv.next, %n1623  br i1 %exitcond, label %latchExit, label %header1624 1625latchExit:                                          ; preds = %latch, %entry1626  %result = phi i32 [ 0, %header ], [ %add, %latch ]1627  ret i32 %result1628 1629for.exit2:1630  ret i32 421631}1632 1633; Two exiting blocks to latch where the exiting blocks are Latch and a1634; non-header1635; FIXME: We should unroll this loop.1636define i32 @otherblock_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) {1637; EPILOG-LABEL: @otherblock_latch_same_exit(1638; EPILOG-NEXT:  entry:1639; EPILOG-NEXT:    %0 = freeze i64 %n1640; EPILOG-NEXT:    %1 = add i64 %0, -11641; EPILOG-NEXT:    %xtraiter = and i64 %0, 71642; EPILOG-NEXT:    %2 = icmp ult i64 %1, 71643; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new1644; EPILOG:       entry.new:1645; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter1646; EPILOG-NEXT:    br label %header1647; EPILOG:       header:1648; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]1649; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]1650; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]1651; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block1652; EPILOG:       for.exiting_block:1653; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 421654; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch1655; EPILOG:       latch:1656; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1657; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 41658; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.021659; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11660; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.11661; EPILOG:       for.exiting_block.1:1662; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 421663; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.11664; EPILOG:       latch.1:1665; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1666; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 41667; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add1668; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 21669; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.21670; EPILOG:       for.exiting_block.2:1671; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 421672; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.21673; EPILOG:       latch.2:1674; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.11675; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 41676; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.11677; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 31678; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.31679; EPILOG:       for.exiting_block.3:1680; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 421681; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.31682; EPILOG:       latch.3:1683; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.21684; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 41685; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.21686; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 41687; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.41688; EPILOG:       for.exiting_block.4:1689; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 421690; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.41691; EPILOG:       latch.4:1692; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.31693; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 41694; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.31695; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 51696; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.51697; EPILOG:       for.exiting_block.5:1698; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 421699; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.51700; EPILOG:       latch.5:1701; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.41702; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 41703; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.41704; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 61705; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.61706; EPILOG:       for.exiting_block.6:1707; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 421708; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.61709; EPILOG:       latch.6:1710; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.51711; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 41712; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.51713; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 71714; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.71715; EPILOG:       for.exiting_block.7:1716; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 421717; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.71718; EPILOG:       latch.7:1719; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.61720; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 41721; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.61722; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 81723; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 81724; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter1725; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa, label %header1726; EPILOG:       latchExit.unr-lcssa:1727; EPILOG-NEXT:    %result.ph = phi i32 [ %add.7, %latch.7 ]1728; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %latch.7 ]1729; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %latch.7 ]1730; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01731; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit1732; EPILOG:       header.epil.preheader:1733; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]1734; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]1735; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 01736; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)1737; EPILOG-NEXT:    br label %header.epil1738; EPILOG:       header.epil:1739; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]1740; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %header.epil.preheader ]1741; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]1742; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit3, label %for.exiting_block.epil1743; EPILOG:       for.exiting_block.epil:1744; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 421745; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit4, label %latch.epil1746; EPILOG:       latch.epil:1747; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil1748; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 41749; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil1750; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 11751; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n1752; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 11753; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter1754; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit4, !llvm.loop !51755; EPILOG:       latchExit.epilog-lcssa.loopexit:1756; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ]1757; EPILOG-NEXT:    br label %latchExit.epilog-lcssa1758; EPILOG:       latchExit.epilog-lcssa.loopexit4:1759; EPILOG-NEXT:    %result.ph1.ph5 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]1760; EPILOG-NEXT:    br label %latchExit.epilog-lcssa1761; EPILOG:       latchExit.epilog-lcssa:1762; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph5, %latchExit.epilog-lcssa.loopexit4 ]1763; EPILOG-NEXT:    br label %latchExit1764; EPILOG:       latchExit:1765; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]1766; EPILOG-NEXT:    ret i32 %result1767; EPILOG:       for.exit2.loopexit:1768; EPILOG-NEXT:    br label %for.exit21769; EPILOG:       for.exit2.loopexit3:1770; EPILOG-NEXT:    br label %for.exit21771; EPILOG:       for.exit2:1772; EPILOG-NEXT:    ret i32 421773;1774; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(1775; EPILOG-BLOCK-NEXT:  entry:1776; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n1777; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -11778; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 11779; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 11780; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new1781; EPILOG-BLOCK:       entry.new:1782; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter1783; EPILOG-BLOCK-NEXT:    br label %header1784; EPILOG-BLOCK:       header:1785; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]1786; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]1787; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]1788; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block1789; EPILOG-BLOCK:       for.exiting_block:1790; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 421791; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch1792; EPILOG-BLOCK:       latch:1793; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1794; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 41795; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.021796; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11797; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.11798; EPILOG-BLOCK:       for.exiting_block.1:1799; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 421800; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.11801; EPILOG-BLOCK:       latch.1:1802; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1803; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 41804; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add1805; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 21806; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 21807; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter1808; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa, label %header, !llvm.loop !51809; EPILOG-BLOCK:       latchExit.unr-lcssa:1810; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ %add.1, %latch.1 ]1811; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %latch.1 ]1812; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %latch.1 ]1813; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01814; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit1815; EPILOG-BLOCK:       header.epil.preheader:1816; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]1817; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]1818; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 01819; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)1820; EPILOG-BLOCK-NEXT:    br label %header.epil1821; EPILOG-BLOCK:       header.epil:1822; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil1823; EPILOG-BLOCK:       for.exiting_block.epil:1824; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 421825; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil1826; EPILOG-BLOCK:       latch.epil:1827; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init1828; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 41829; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.epil.init1830; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa1831; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:1832; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]1833; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa1834; EPILOG-BLOCK:       latchExit.epilog-lcssa:1835; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]1836; EPILOG-BLOCK-NEXT:    br label %latchExit1837; EPILOG-BLOCK:       latchExit:1838; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]1839; EPILOG-BLOCK-NEXT:    ret i32 %result1840; EPILOG-BLOCK:       for.exit2.loopexit:1841; EPILOG-BLOCK-NEXT:    br label %for.exit21842; EPILOG-BLOCK:       for.exit2:1843; EPILOG-BLOCK-NEXT:    ret i32 421844;1845; PROLOG-LABEL: @otherblock_latch_same_exit(1846; PROLOG-NEXT:  entry:1847; PROLOG-NEXT:    %0 = freeze i64 %n1848; PROLOG-NEXT:    %1 = add i64 %0, -11849; PROLOG-NEXT:    %xtraiter = and i64 %0, 71850; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01851; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit1852; PROLOG:       header.prol.preheader:1853; PROLOG-NEXT:    br label %header.prol1854; PROLOG:       header.prol:1855; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]1856; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]1857; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]1858; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol1859; PROLOG:       for.exiting_block.prol:1860; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 421861; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol1862; PROLOG:       latch.prol:1863; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol1864; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 41865; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol1866; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 11867; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n1868; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 11869; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter1870; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !51871; PROLOG:       header.prol.loopexit.unr-lcssa:1872; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]1873; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]1874; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]1875; PROLOG-NEXT:    br label %header.prol.loopexit1876; PROLOG:       header.prol.loopexit:1877; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]1878; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]1879; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]1880; PROLOG-NEXT:    %3 = icmp ult i64 %1, 71881; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new1882; PROLOG:       entry.new:1883; PROLOG-NEXT:    br label %header1884; PROLOG:       header:1885; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]1886; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]1887; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block1888; PROLOG:       for.exiting_block:1889; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 421890; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch1891; PROLOG:       latch:1892; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1893; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 41894; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.021895; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 11896; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.11897; PROLOG:       for.exiting_block.1:1898; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 421899; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.11900; PROLOG:       latch.1:1901; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next1902; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 41903; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add1904; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 21905; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.21906; PROLOG:       for.exiting_block.2:1907; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 421908; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.21909; PROLOG:       latch.2:1910; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.11911; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 41912; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.11913; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 31914; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.31915; PROLOG:       for.exiting_block.3:1916; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 421917; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.31918; PROLOG:       latch.3:1919; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.21920; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 41921; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.21922; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 41923; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.41924; PROLOG:       for.exiting_block.4:1925; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 421926; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.41927; PROLOG:       latch.4:1928; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.31929; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 41930; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.31931; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 51932; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.51933; PROLOG:       for.exiting_block.5:1934; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 421935; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.51936; PROLOG:       latch.5:1937; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.41938; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 41939; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.41940; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 61941; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.61942; PROLOG:       for.exiting_block.6:1943; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 421944; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.61945; PROLOG:       latch.6:1946; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.51947; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 41948; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.51949; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 71950; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.71951; PROLOG:       for.exiting_block.7:1952; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 421953; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.71954; PROLOG:       latch.7:1955; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.61956; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 41957; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.61958; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 81959; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n1960; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header1961; PROLOG:       latchExit.unr-lcssa.loopexit:1962; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ], [ %add.7, %latch.7 ]1963; PROLOG-NEXT:    br label %latchExit.unr-lcssa1964; PROLOG:       latchExit.unr-lcssa.loopexit2:1965; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]1966; PROLOG-NEXT:    br label %latchExit.unr-lcssa1967; PROLOG:       latchExit.unr-lcssa:1968; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]1969; PROLOG-NEXT:    br label %latchExit1970; PROLOG:       latchExit:1971; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]1972; PROLOG-NEXT:    ret i32 %result1973; PROLOG:       for.exit2.loopexit:1974; PROLOG-NEXT:    br label %for.exit21975; PROLOG:       for.exit2.loopexit1:1976; PROLOG-NEXT:    br label %for.exit21977; PROLOG:       for.exit2:1978; PROLOG-NEXT:    ret i32 421979;1980; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(1981; PROLOG-BLOCK-NEXT:  entry:1982; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n1983; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -11984; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 11985; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 01986; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit1987; PROLOG-BLOCK:       header.prol.preheader:1988; PROLOG-BLOCK-NEXT:    br label %header.prol1989; PROLOG-BLOCK:       header.prol:1990; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol1991; PROLOG-BLOCK:       for.exiting_block.prol:1992; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 421993; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol1994; PROLOG-BLOCK:       latch.prol:1995; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 41996; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit1997; PROLOG-BLOCK:       header.prol.loopexit:1998; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]1999; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]2000; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]2001; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 12002; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new2003; PROLOG-BLOCK:       entry.new:2004; PROLOG-BLOCK-NEXT:    br label %header2005; PROLOG-BLOCK:       header:2006; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]2007; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]2008; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2009; PROLOG-BLOCK:       for.exiting_block:2010; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 422011; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch2012; PROLOG-BLOCK:       latch:2013; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2014; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 42015; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.022016; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 12017; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12018; PROLOG-BLOCK:       for.exiting_block.1:2019; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 422020; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.12021; PROLOG-BLOCK:       latch.1:2022; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2023; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 42024; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add2025; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22026; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n2027; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !52028; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:2029; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]2030; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa2031; PROLOG-BLOCK:       latchExit.unr-lcssa:2032; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]2033; PROLOG-BLOCK-NEXT:    br label %latchExit2034; PROLOG-BLOCK:       latchExit:2035; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]2036; PROLOG-BLOCK-NEXT:    ret i32 %result2037; PROLOG-BLOCK:       for.exit2.loopexit:2038; PROLOG-BLOCK-NEXT:    br label %for.exit22039; PROLOG-BLOCK:       for.exit2:2040; PROLOG-BLOCK-NEXT:    ret i32 422041;2042 2043entry:2044  br label %header2045 2046header:2047  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]2048  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]2049  br i1 %cond, label %for.exit2, label %for.exiting_block2050 2051for.exiting_block:2052  %cmp = icmp eq i64 %n, 422053  br i1 %cmp, label %latchExit, label %latch2054 2055latch:                                         ; preds = %latch, %entry2056  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2057  %0 = load i32, ptr %arrayidx, align 42058  %add = add nsw i32 %0, %sum.022059  %indvars.iv.next = add i64 %indvars.iv, 12060  %exitcond = icmp eq i64 %indvars.iv.next, %n2061  br i1 %exitcond, label %latchExit, label %header2062 2063latchExit:                                          ; preds = %latch, %entry2064  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]2065  ret i32 %result2066 2067for.exit2:2068  ret i32 422069}2070 2071; Two exiting blocks to latch where the exiting blocks are Latch and a2072; non-header2073; Same as above test except the incoming value for latch Phi is from the header2074; FIXME: We should be able to runtime unroll.2075define i32 @otherblock_latch_same_exit2(ptr nocapture %a, i64 %n, i1 %cond) {2076; EPILOG-LABEL: @otherblock_latch_same_exit2(2077; EPILOG-NEXT:  entry:2078; EPILOG-NEXT:    %0 = freeze i64 %n2079; EPILOG-NEXT:    %1 = add i64 %0, -12080; EPILOG-NEXT:    %xtraiter = and i64 %0, 72081; EPILOG-NEXT:    %2 = icmp ult i64 %1, 72082; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new2083; EPILOG:       entry.new:2084; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter2085; EPILOG-NEXT:    br label %header2086; EPILOG:       header:2087; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]2088; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]2089; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]2090; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2091; EPILOG:       for.exiting_block:2092; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 422093; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch2094; EPILOG:       latch:2095; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2096; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 42097; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.022098; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12099; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12100; EPILOG:       for.exiting_block.1:2101; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 422102; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.12103; EPILOG:       latch.1:2104; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2105; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 42106; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add2107; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 22108; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.22109; EPILOG:       for.exiting_block.2:2110; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 422111; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.22112; EPILOG:       latch.2:2113; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.12114; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 42115; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.12116; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 32117; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.32118; EPILOG:       for.exiting_block.3:2119; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 422120; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.32121; EPILOG:       latch.3:2122; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.22123; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 42124; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.22125; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 42126; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.42127; EPILOG:       for.exiting_block.4:2128; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 422129; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.42130; EPILOG:       latch.4:2131; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.32132; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 42133; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.32134; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 52135; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.52136; EPILOG:       for.exiting_block.5:2137; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 422138; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.52139; EPILOG:       latch.5:2140; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.42141; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 42142; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.42143; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 62144; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.62145; EPILOG:       for.exiting_block.6:2146; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 422147; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.62148; EPILOG:       latch.6:2149; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.52150; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 42151; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.52152; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 72153; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.72154; EPILOG:       for.exiting_block.7:2155; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 422156; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.72157; EPILOG:       latch.7:2158; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.62159; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 42160; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.62161; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 82162; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 82163; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter2164; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa, label %header2165; EPILOG:       latchExit.unr-lcssa:2166; EPILOG-NEXT:    %result.ph = phi i32 [ %add.7, %latch.7 ]2167; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %latch.7 ]2168; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %latch.7 ]2169; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02170; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit2171; EPILOG:       header.epil.preheader:2172; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]2173; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]2174; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 02175; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)2176; EPILOG-NEXT:    br label %header.epil2177; EPILOG:       header.epil:2178; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]2179; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %header.epil.preheader ]2180; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]2181; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit3, label %for.exiting_block.epil2182; EPILOG:       for.exiting_block.epil:2183; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 422184; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit4, label %latch.epil2185; EPILOG:       latch.epil:2186; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil2187; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 42188; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil2189; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 12190; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n2191; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 12192; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter2193; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit4, !llvm.loop !62194; EPILOG:       latchExit.epilog-lcssa.loopexit:2195; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]2196; EPILOG-NEXT:    br label %latchExit.epilog-lcssa2197; EPILOG:       latchExit.epilog-lcssa.loopexit4:2198; EPILOG-NEXT:    %result.ph1.ph5 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]2199; EPILOG-NEXT:    br label %latchExit.epilog-lcssa2200; EPILOG:       latchExit.epilog-lcssa:2201; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph5, %latchExit.epilog-lcssa.loopexit4 ]2202; EPILOG-NEXT:    br label %latchExit2203; EPILOG:       latchExit:2204; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]2205; EPILOG-NEXT:    ret i32 %result2206; EPILOG:       for.exit2.loopexit:2207; EPILOG-NEXT:    br label %for.exit22208; EPILOG:       for.exit2.loopexit3:2209; EPILOG-NEXT:    br label %for.exit22210; EPILOG:       for.exit2:2211; EPILOG-NEXT:    ret i32 422212;2213; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(2214; EPILOG-BLOCK-NEXT:  entry:2215; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n2216; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -12217; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 12218; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 12219; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new2220; EPILOG-BLOCK:       entry.new:2221; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter2222; EPILOG-BLOCK-NEXT:    br label %header2223; EPILOG-BLOCK:       header:2224; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]2225; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]2226; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]2227; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2228; EPILOG-BLOCK:       for.exiting_block:2229; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 422230; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch2231; EPILOG-BLOCK:       latch:2232; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2233; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 42234; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.022235; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12236; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12237; EPILOG-BLOCK:       for.exiting_block.1:2238; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 422239; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.12240; EPILOG-BLOCK:       latch.1:2241; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2242; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 42243; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add2244; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22245; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 22246; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter2247; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa, label %header, !llvm.loop !62248; EPILOG-BLOCK:       latchExit.unr-lcssa:2249; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ %add.1, %latch.1 ]2250; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %latch.1 ]2251; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %latch.1 ]2252; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02253; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit2254; EPILOG-BLOCK:       header.epil.preheader:2255; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]2256; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]2257; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 02258; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)2259; EPILOG-BLOCK-NEXT:    br label %header.epil2260; EPILOG-BLOCK:       header.epil:2261; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil2262; EPILOG-BLOCK:       for.exiting_block.epil:2263; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 422264; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil2265; EPILOG-BLOCK:       latch.epil:2266; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init2267; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 42268; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.epil.init2269; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa2270; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:2271; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]2272; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa2273; EPILOG-BLOCK:       latchExit.epilog-lcssa:2274; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]2275; EPILOG-BLOCK-NEXT:    br label %latchExit2276; EPILOG-BLOCK:       latchExit:2277; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]2278; EPILOG-BLOCK-NEXT:    ret i32 %result2279; EPILOG-BLOCK:       for.exit2.loopexit:2280; EPILOG-BLOCK-NEXT:    br label %for.exit22281; EPILOG-BLOCK:       for.exit2:2282; EPILOG-BLOCK-NEXT:    ret i32 422283;2284; PROLOG-LABEL: @otherblock_latch_same_exit2(2285; PROLOG-NEXT:  entry:2286; PROLOG-NEXT:    %0 = freeze i64 %n2287; PROLOG-NEXT:    %1 = add i64 %0, -12288; PROLOG-NEXT:    %xtraiter = and i64 %0, 72289; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02290; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit2291; PROLOG:       header.prol.preheader:2292; PROLOG-NEXT:    br label %header.prol2293; PROLOG:       header.prol:2294; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]2295; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]2296; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]2297; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol2298; PROLOG:       for.exiting_block.prol:2299; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 422300; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol2301; PROLOG:       latch.prol:2302; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol2303; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 42304; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol2305; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 12306; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n2307; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 12308; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter2309; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !62310; PROLOG:       header.prol.loopexit.unr-lcssa:2311; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]2312; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]2313; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]2314; PROLOG-NEXT:    br label %header.prol.loopexit2315; PROLOG:       header.prol.loopexit:2316; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]2317; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]2318; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]2319; PROLOG-NEXT:    %3 = icmp ult i64 %1, 72320; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new2321; PROLOG:       entry.new:2322; PROLOG-NEXT:    br label %header2323; PROLOG:       header:2324; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]2325; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]2326; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2327; PROLOG:       for.exiting_block:2328; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 422329; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch2330; PROLOG:       latch:2331; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2332; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 42333; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.022334; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 12335; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12336; PROLOG:       for.exiting_block.1:2337; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 422338; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.12339; PROLOG:       latch.1:2340; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2341; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 42342; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add2343; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22344; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.22345; PROLOG:       for.exiting_block.2:2346; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 422347; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.22348; PROLOG:       latch.2:2349; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.12350; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 42351; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.12352; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 32353; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.32354; PROLOG:       for.exiting_block.3:2355; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 422356; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.32357; PROLOG:       latch.3:2358; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.22359; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 42360; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.22361; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 42362; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.42363; PROLOG:       for.exiting_block.4:2364; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 422365; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.42366; PROLOG:       latch.4:2367; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.32368; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 42369; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.32370; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 52371; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.52372; PROLOG:       for.exiting_block.5:2373; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 422374; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.52375; PROLOG:       latch.5:2376; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.42377; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 42378; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.42379; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 62380; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.62381; PROLOG:       for.exiting_block.6:2382; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 422383; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.62384; PROLOG:       latch.6:2385; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.52386; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 42387; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.52388; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 72389; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.72390; PROLOG:       for.exiting_block.7:2391; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 422392; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.72393; PROLOG:       latch.7:2394; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.62395; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 42396; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.62397; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 82398; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n2399; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header2400; PROLOG:       latchExit.unr-lcssa.loopexit:2401; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]2402; PROLOG-NEXT:    br label %latchExit.unr-lcssa2403; PROLOG:       latchExit.unr-lcssa.loopexit2:2404; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]2405; PROLOG-NEXT:    br label %latchExit.unr-lcssa2406; PROLOG:       latchExit.unr-lcssa:2407; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]2408; PROLOG-NEXT:    br label %latchExit2409; PROLOG:       latchExit:2410; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]2411; PROLOG-NEXT:    ret i32 %result2412; PROLOG:       for.exit2.loopexit:2413; PROLOG-NEXT:    br label %for.exit22414; PROLOG:       for.exit2.loopexit1:2415; PROLOG-NEXT:    br label %for.exit22416; PROLOG:       for.exit2:2417; PROLOG-NEXT:    ret i32 422418;2419; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(2420; PROLOG-BLOCK-NEXT:  entry:2421; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n2422; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -12423; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 12424; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02425; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit2426; PROLOG-BLOCK:       header.prol.preheader:2427; PROLOG-BLOCK-NEXT:    br label %header.prol2428; PROLOG-BLOCK:       header.prol:2429; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol2430; PROLOG-BLOCK:       for.exiting_block.prol:2431; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 422432; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol2433; PROLOG-BLOCK:       latch.prol:2434; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 42435; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit2436; PROLOG-BLOCK:       header.prol.loopexit:2437; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]2438; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]2439; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]2440; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 12441; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new2442; PROLOG-BLOCK:       entry.new:2443; PROLOG-BLOCK-NEXT:    br label %header2444; PROLOG-BLOCK:       header:2445; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]2446; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]2447; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2448; PROLOG-BLOCK:       for.exiting_block:2449; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 422450; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch2451; PROLOG-BLOCK:       latch:2452; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2453; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 42454; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.022455; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 12456; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12457; PROLOG-BLOCK:       for.exiting_block.1:2458; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 422459; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.12460; PROLOG-BLOCK:       latch.1:2461; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2462; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 42463; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add2464; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22465; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n2466; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !62467; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:2468; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]2469; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa2470; PROLOG-BLOCK:       latchExit.unr-lcssa:2471; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]2472; PROLOG-BLOCK-NEXT:    br label %latchExit2473; PROLOG-BLOCK:       latchExit:2474; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]2475; PROLOG-BLOCK-NEXT:    ret i32 %result2476; PROLOG-BLOCK:       for.exit2.loopexit:2477; PROLOG-BLOCK-NEXT:    br label %for.exit22478; PROLOG-BLOCK:       for.exit2:2479; PROLOG-BLOCK-NEXT:    ret i32 422480;2481 2482entry:2483  br label %header2484 2485header:2486  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]2487  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]2488  br i1 %cond, label %for.exit2, label %for.exiting_block2489 2490for.exiting_block:2491  %cmp = icmp eq i64 %n, 422492  br i1 %cmp, label %latchExit, label %latch2493 2494latch:                                         ; preds = %latch, %entry2495  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2496  %0 = load i32, ptr %arrayidx, align 42497  %add = add nsw i32 %0, %sum.022498  %indvars.iv.next = add i64 %indvars.iv, 12499  %exitcond = icmp eq i64 %indvars.iv.next, %n2500  br i1 %exitcond, label %latchExit, label %header2501 2502latchExit:                                          ; preds = %latch, %entry2503  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]2504  ret i32 %result2505 2506for.exit2:2507  ret i32 422508}2509 2510; Two exiting blocks to latch where the exiting blocks are Latch and a2511; non-header2512; Same as above test except the incoming value for cloned latch Phi is from the2513; for.exiting_block.2514; FIXME: We should be able to runtime unroll.2515define i32 @otherblock_latch_same_exit3(ptr nocapture %a, i64 %n, i1 %cond) {2516; EPILOG-LABEL: @otherblock_latch_same_exit3(2517; EPILOG-NEXT:  entry:2518; EPILOG-NEXT:    %0 = freeze i64 %n2519; EPILOG-NEXT:    %1 = add i64 %0, -12520; EPILOG-NEXT:    %xtraiter = and i64 %0, 72521; EPILOG-NEXT:    %2 = icmp ult i64 %1, 72522; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new2523; EPILOG:       entry.new:2524; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter2525; EPILOG-NEXT:    br label %header2526; EPILOG:       header:2527; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]2528; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]2529; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]2530; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2531; EPILOG:       for.exiting_block:2532; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2533; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 42534; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.022535; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 422536; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch2537; EPILOG:       latch:2538; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12539; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12540; EPILOG:       for.exiting_block.1:2541; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2542; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 42543; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add2544; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 422545; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.12546; EPILOG:       latch.1:2547; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 22548; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.22549; EPILOG:       for.exiting_block.2:2550; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.12551; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 42552; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.12553; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 422554; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.22555; EPILOG:       latch.2:2556; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 32557; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.32558; EPILOG:       for.exiting_block.3:2559; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.22560; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 42561; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.22562; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 422563; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.32564; EPILOG:       latch.3:2565; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 42566; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.42567; EPILOG:       for.exiting_block.4:2568; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.32569; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 42570; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.32571; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 422572; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.42573; EPILOG:       latch.4:2574; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 52575; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.52576; EPILOG:       for.exiting_block.5:2577; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.42578; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 42579; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.42580; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 422581; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.52582; EPILOG:       latch.5:2583; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 62584; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.62585; EPILOG:       for.exiting_block.6:2586; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.52587; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 42588; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.52589; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 422590; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.62591; EPILOG:       latch.6:2592; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 72593; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.72594; EPILOG:       for.exiting_block.7:2595; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.62596; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 42597; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.62598; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 422599; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.72600; EPILOG:       latch.7:2601; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 82602; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 82603; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter2604; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa, label %header2605; EPILOG:       latchExit.unr-lcssa:2606; EPILOG-NEXT:    %result.ph = phi i32 [ %add.7, %latch.7 ]2607; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %latch.7 ]2608; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %latch.7 ]2609; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02610; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit2611; EPILOG:       header.epil.preheader:2612; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]2613; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]2614; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 02615; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)2616; EPILOG-NEXT:    br label %header.epil2617; EPILOG:       header.epil:2618; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]2619; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %header.epil.preheader ]2620; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]2621; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit3, label %for.exiting_block.epil2622; EPILOG:       for.exiting_block.epil:2623; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil2624; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 42625; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil2626; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 422627; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit4, label %latch.epil2628; EPILOG:       latch.epil:2629; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 12630; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n2631; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 12632; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter2633; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit4, !llvm.loop !72634; EPILOG:       latchExit.epilog-lcssa.loopexit:2635; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]2636; EPILOG-NEXT:    br label %latchExit.epilog-lcssa2637; EPILOG:       latchExit.epilog-lcssa.loopexit4:2638; EPILOG-NEXT:    %result.ph1.ph5 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]2639; EPILOG-NEXT:    br label %latchExit.epilog-lcssa2640; EPILOG:       latchExit.epilog-lcssa:2641; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph5, %latchExit.epilog-lcssa.loopexit4 ]2642; EPILOG-NEXT:    br label %latchExit2643; EPILOG:       latchExit:2644; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]2645; EPILOG-NEXT:    ret i32 %result2646; EPILOG:       for.exit2.loopexit:2647; EPILOG-NEXT:    br label %for.exit22648; EPILOG:       for.exit2.loopexit3:2649; EPILOG-NEXT:    br label %for.exit22650; EPILOG:       for.exit2:2651; EPILOG-NEXT:    ret i32 422652;2653; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(2654; EPILOG-BLOCK-NEXT:  entry:2655; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n2656; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -12657; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 12658; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 12659; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new2660; EPILOG-BLOCK:       entry.new:2661; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter2662; EPILOG-BLOCK-NEXT:    br label %header2663; EPILOG-BLOCK:       header:2664; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]2665; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]2666; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]2667; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2668; EPILOG-BLOCK:       for.exiting_block:2669; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2670; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 42671; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.022672; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 422673; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch2674; EPILOG-BLOCK:       latch:2675; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12676; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12677; EPILOG-BLOCK:       for.exiting_block.1:2678; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2679; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 42680; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add2681; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 422682; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.12683; EPILOG-BLOCK:       latch.1:2684; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22685; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 22686; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter2687; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa, label %header, !llvm.loop !72688; EPILOG-BLOCK:       latchExit.unr-lcssa:2689; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ %add.1, %latch.1 ]2690; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %latch.1 ]2691; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %latch.1 ]2692; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02693; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit2694; EPILOG-BLOCK:       header.epil.preheader:2695; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latchExit.unr-lcssa ]2696; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latchExit.unr-lcssa ]2697; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 02698; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)2699; EPILOG-BLOCK-NEXT:    br label %header.epil2700; EPILOG-BLOCK:       header.epil:2701; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil2702; EPILOG-BLOCK:       for.exiting_block.epil:2703; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init2704; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 42705; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.epil.init2706; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 422707; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil2708; EPILOG-BLOCK:       latch.epil:2709; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa2710; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:2711; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]2712; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa2713; EPILOG-BLOCK:       latchExit.epilog-lcssa:2714; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]2715; EPILOG-BLOCK-NEXT:    br label %latchExit2716; EPILOG-BLOCK:       latchExit:2717; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]2718; EPILOG-BLOCK-NEXT:    ret i32 %result2719; EPILOG-BLOCK:       for.exit2.loopexit:2720; EPILOG-BLOCK-NEXT:    br label %for.exit22721; EPILOG-BLOCK:       for.exit2:2722; EPILOG-BLOCK-NEXT:    ret i32 422723;2724; PROLOG-LABEL: @otherblock_latch_same_exit3(2725; PROLOG-NEXT:  entry:2726; PROLOG-NEXT:    %0 = freeze i64 %n2727; PROLOG-NEXT:    %1 = add i64 %0, -12728; PROLOG-NEXT:    %xtraiter = and i64 %0, 72729; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02730; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit2731; PROLOG:       header.prol.preheader:2732; PROLOG-NEXT:    br label %header.prol2733; PROLOG:       header.prol:2734; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]2735; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]2736; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]2737; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol2738; PROLOG:       for.exiting_block.prol:2739; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol2740; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 42741; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol2742; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 422743; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol2744; PROLOG:       latch.prol:2745; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 12746; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n2747; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 12748; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter2749; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !72750; PROLOG:       header.prol.loopexit.unr-lcssa:2751; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]2752; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]2753; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]2754; PROLOG-NEXT:    br label %header.prol.loopexit2755; PROLOG:       header.prol.loopexit:2756; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]2757; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]2758; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]2759; PROLOG-NEXT:    %3 = icmp ult i64 %1, 72760; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new2761; PROLOG:       entry.new:2762; PROLOG-NEXT:    br label %header2763; PROLOG:       header:2764; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]2765; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]2766; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2767; PROLOG:       for.exiting_block:2768; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2769; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 42770; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.022771; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 422772; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch2773; PROLOG:       latch:2774; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 12775; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12776; PROLOG:       for.exiting_block.1:2777; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2778; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 42779; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add2780; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 422781; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.12782; PROLOG:       latch.1:2783; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22784; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.22785; PROLOG:       for.exiting_block.2:2786; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.12787; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 42788; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.12789; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 422790; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.22791; PROLOG:       latch.2:2792; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 32793; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.32794; PROLOG:       for.exiting_block.3:2795; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.22796; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 42797; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.22798; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 422799; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.32800; PROLOG:       latch.3:2801; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 42802; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.42803; PROLOG:       for.exiting_block.4:2804; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.32805; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 42806; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.32807; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 422808; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.42809; PROLOG:       latch.4:2810; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 52811; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.52812; PROLOG:       for.exiting_block.5:2813; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.42814; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 42815; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.42816; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 422817; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.52818; PROLOG:       latch.5:2819; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 62820; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.62821; PROLOG:       for.exiting_block.6:2822; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.52823; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 42824; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.52825; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 422826; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.62827; PROLOG:       latch.6:2828; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 72829; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.72830; PROLOG:       for.exiting_block.7:2831; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.62832; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 42833; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.62834; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 422835; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.72836; PROLOG:       latch.7:2837; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 82838; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n2839; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header2840; PROLOG:       latchExit.unr-lcssa.loopexit:2841; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]2842; PROLOG-NEXT:    br label %latchExit.unr-lcssa2843; PROLOG:       latchExit.unr-lcssa.loopexit2:2844; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]2845; PROLOG-NEXT:    br label %latchExit.unr-lcssa2846; PROLOG:       latchExit.unr-lcssa:2847; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]2848; PROLOG-NEXT:    br label %latchExit2849; PROLOG:       latchExit:2850; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]2851; PROLOG-NEXT:    ret i32 %result2852; PROLOG:       for.exit2.loopexit:2853; PROLOG-NEXT:    br label %for.exit22854; PROLOG:       for.exit2.loopexit1:2855; PROLOG-NEXT:    br label %for.exit22856; PROLOG:       for.exit2:2857; PROLOG-NEXT:    ret i32 422858;2859; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(2860; PROLOG-BLOCK-NEXT:  entry:2861; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n2862; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -12863; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 12864; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 02865; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit2866; PROLOG-BLOCK:       header.prol.preheader:2867; PROLOG-BLOCK-NEXT:    br label %header.prol2868; PROLOG-BLOCK:       header.prol:2869; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol2870; PROLOG-BLOCK:       for.exiting_block.prol:2871; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 42872; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 422873; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol2874; PROLOG-BLOCK:       latch.prol:2875; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit2876; PROLOG-BLOCK:       header.prol.loopexit:2877; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]2878; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]2879; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]2880; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 12881; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new2882; PROLOG-BLOCK:       entry.new:2883; PROLOG-BLOCK-NEXT:    br label %header2884; PROLOG-BLOCK:       header:2885; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]2886; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]2887; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block2888; PROLOG-BLOCK:       for.exiting_block:2889; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2890; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 42891; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.022892; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 422893; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch2894; PROLOG-BLOCK:       latch:2895; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 12896; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.12897; PROLOG-BLOCK:       for.exiting_block.1:2898; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next2899; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 42900; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add2901; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 422902; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.12903; PROLOG-BLOCK:       latch.1:2904; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 22905; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n2906; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !72907; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:2908; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]2909; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa2910; PROLOG-BLOCK:       latchExit.unr-lcssa:2911; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]2912; PROLOG-BLOCK-NEXT:    br label %latchExit2913; PROLOG-BLOCK:       latchExit:2914; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]2915; PROLOG-BLOCK-NEXT:    ret i32 %result2916; PROLOG-BLOCK:       for.exit2.loopexit:2917; PROLOG-BLOCK-NEXT:    br label %for.exit22918; PROLOG-BLOCK:       for.exit2:2919; PROLOG-BLOCK-NEXT:    ret i32 422920;2921 2922entry:2923  br label %header2924 2925header:2926  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]2927  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]2928  br i1 %cond, label %for.exit2, label %for.exiting_block2929 2930for.exiting_block:2931  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2932  %0 = load i32, ptr %arrayidx, align 42933  %add = add nsw i32 %0, %sum.022934  %cmp = icmp eq i64 %n, 422935  br i1 %cmp, label %latchExit, label %latch2936 2937latch:                                         ; preds = %latch, %entry2938  %indvars.iv.next = add i64 %indvars.iv, 12939  %exitcond = icmp eq i64 %indvars.iv.next, %n2940  br i1 %exitcond, label %latchExit, label %header2941 2942latchExit:                                          ; preds = %latch, %entry2943  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]2944  ret i32 %result2945 2946for.exit2:2947  ret i32 422948}2949 2950; Show a case where we have multiple exits, but (provably) exit on the2951; first iteration and thus have nothing to unroll2952define void @non_loop(i32 %arg) {2953; CHECK-LABEL: @non_loop(2954; CHECK-NEXT:  entry:2955; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg2956; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock2957; CHECK:       preheader:2958; CHECK-NEXT:    br label %header2959; CHECK:       header:2960; CHECK-NEXT:    br i1 true, label %latchExit, label %latch2961; CHECK:       latch:2962; CHECK-NEXT:    br label %latchExit2963; CHECK:       latchExit:2964; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]2965; CHECK-NEXT:    br label %returnblock2966; CHECK:       returnblock:2967; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]2968; CHECK-NEXT:    ret void2969;2970 2971entry:2972  %i = icmp sgt i32 undef, %arg2973  br i1 %i, label %preheader, label %returnblock2974 2975preheader:                                 ; preds = %entry2976  br label %header2977 2978header:                                           ; preds = %preheader, %latch2979  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]2980  %inc = add nsw i32 %i4, 12981  br i1 true, label %latchExit, label %latch2982 2983latch:                                            ; preds = %header2984  %cmp = icmp slt i32 %inc, undef2985  br i1 %cmp, label %header, label %latchExit2986 2987latchExit:                                ; preds = %header, %latch2988  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]2989  br label %returnblock2990 2991returnblock:                                         ; preds = %latchExit, %entry2992  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]2993  ret void2994}2995 2996; Latch exit is shared by all exiting blocks2997define void @unique_exit(i32 %N, i32 %M) {2998; EPILOG-LABEL: @unique_exit(2999; EPILOG-NEXT:  preheader:3000; EPILOG-NEXT:    %M.shifted = shl i32 %M, 33001; EPILOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)3002; EPILOG-NEXT:    %0 = freeze i32 %umax3003; EPILOG-NEXT:    %1 = add i32 %0, -13004; EPILOG-NEXT:    %xtraiter = and i32 %0, 73005; EPILOG-NEXT:    %2 = icmp ult i32 %1, 73006; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %preheader.new3007; EPILOG:       preheader.new:3008; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter3009; EPILOG-NEXT:    br label %header3010; EPILOG:       header:3011; EPILOG-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ]3012; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]3013; EPILOG-NEXT:    %inc = add nuw nsw i32 %i4, 13014; EPILOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N3015; EPILOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit3016; EPILOG:       latch:3017; EPILOG-NEXT:    %inc.1 = add nuw nsw i32 %i4, 23018; EPILOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N3019; EPILOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit3020; EPILOG:       latch.1:3021; EPILOG-NEXT:    %inc.2 = add nuw nsw i32 %i4, 33022; EPILOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N3023; EPILOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit3024; EPILOG:       latch.2:3025; EPILOG-NEXT:    %inc.3 = add nuw nsw i32 %i4, 43026; EPILOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N3027; EPILOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit3028; EPILOG:       latch.3:3029; EPILOG-NEXT:    %inc.4 = add nuw nsw i32 %i4, 53030; EPILOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N3031; EPILOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit3032; EPILOG:       latch.4:3033; EPILOG-NEXT:    %inc.5 = add nuw nsw i32 %i4, 63034; EPILOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N3035; EPILOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit3036; EPILOG:       latch.5:3037; EPILOG-NEXT:    %inc.6 = add nuw nsw i32 %i4, 73038; EPILOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N3039; EPILOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit3040; EPILOG:       latch.6:3041; EPILOG-NEXT:    %inc.7 = add nuw i32 %i4, 83042; EPILOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N3043; EPILOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit3044; EPILOG:       latch.7:3045; EPILOG-NEXT:    %niter.next.7 = add nuw i32 %niter, 83046; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter3047; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa3048; EPILOG:       latchExit.unr-lcssa:3049; EPILOG-NEXT:    %i2.ph.ph = phi i32 [ -1, %latch.7 ]3050; EPILOG-NEXT:    %i4.unr = phi i32 [ %inc.7, %latch.7 ]3051; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 03052; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit3053; EPILOG:       header.epil.preheader:3054; EPILOG-NEXT:    %i4.epil.init = phi i32 [ 0, %preheader ], [ %i4.unr, %latchExit.unr-lcssa ]3055; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i32 %xtraiter, 03056; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3057; EPILOG-NEXT:    br label %header.epil3058; EPILOG:       header.epil:3059; EPILOG-NEXT:    %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.epil.init, %header.epil.preheader ]3060; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]3061; EPILOG-NEXT:    %inc.epil = add nuw i32 %i4.epil, 13062; EPILOG-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N3063; EPILOG-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit33064; EPILOG:       latch.epil:3065; EPILOG-NEXT:    %cmp.epil = icmp ult i32 %inc.epil, %M.shifted3066; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 13067; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter3068; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !83069; EPILOG:       latchExit.epilog-lcssa.loopexit:3070; EPILOG-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ]3071; EPILOG-NEXT:    br label %latchExit.epilog-lcssa3072; EPILOG:       latchExit.epilog-lcssa.loopexit3:3073; EPILOG-NEXT:    %i2.ph.ph1.ph4 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ]3074; EPILOG-NEXT:    br label %latchExit.epilog-lcssa3075; EPILOG:       latchExit.epilog-lcssa:3076; EPILOG-NEXT:    %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]3077; EPILOG-NEXT:    br label %latchExit3078; EPILOG:       latchExit:3079; EPILOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]3080; EPILOG-NEXT:    ret void3081;3082; EPILOG-BLOCK-LABEL: @unique_exit(3083; EPILOG-BLOCK-NEXT:  preheader:3084; EPILOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 33085; EPILOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)3086; EPILOG-BLOCK-NEXT:    %0 = freeze i32 %umax3087; EPILOG-BLOCK-NEXT:    %1 = add i32 %0, -13088; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 13089; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 13090; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %preheader.new3091; EPILOG-BLOCK:       preheader.new:3092; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter3093; EPILOG-BLOCK-NEXT:    br label %header3094; EPILOG-BLOCK:       header:3095; EPILOG-BLOCK-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ]3096; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]3097; EPILOG-BLOCK-NEXT:    %inc = add nuw nsw i32 %i4, 13098; EPILOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N3099; EPILOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit3100; EPILOG-BLOCK:       latch:3101; EPILOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %i4, 23102; EPILOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N3103; EPILOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit3104; EPILOG-BLOCK:       latch.1:3105; EPILOG-BLOCK-NEXT:    %niter.next.1 = add nuw i32 %niter, 23106; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter3107; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa, !llvm.loop !83108; EPILOG-BLOCK:       latchExit.unr-lcssa:3109; EPILOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ -1, %latch.1 ]3110; EPILOG-BLOCK-NEXT:    %i4.unr = phi i32 [ %inc.1, %latch.1 ]3111; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 03112; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit3113; EPILOG-BLOCK:       header.epil.preheader:3114; EPILOG-BLOCK-NEXT:    %i4.epil.init = phi i32 [ 0, %preheader ], [ %i4.unr, %latchExit.unr-lcssa ]3115; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i32 %xtraiter, 03116; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3117; EPILOG-BLOCK-NEXT:    br label %header.epil3118; EPILOG-BLOCK:       header.epil:3119; EPILOG-BLOCK-NEXT:    %inc.epil = add nuw i32 %i4.epil.init, 13120; EPILOG-BLOCK-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N3121; EPILOG-BLOCK-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa3122; EPILOG-BLOCK:       latch.epil:3123; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa3124; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:3125; EPILOG-BLOCK-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ]3126; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa3127; EPILOG-BLOCK:       latchExit.epilog-lcssa:3128; EPILOG-BLOCK-NEXT:    %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.epil.init, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ]3129; EPILOG-BLOCK-NEXT:    br label %latchExit3130; EPILOG-BLOCK:       latchExit:3131; EPILOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]3132; EPILOG-BLOCK-NEXT:    ret void3133;3134; PROLOG-LABEL: @unique_exit(3135; PROLOG-NEXT:  preheader:3136; PROLOG-NEXT:    %M.shifted = shl i32 %M, 33137; PROLOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)3138; PROLOG-NEXT:    %0 = freeze i32 %umax3139; PROLOG-NEXT:    %1 = add i32 %0, -13140; PROLOG-NEXT:    %xtraiter = and i32 %0, 73141; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 03142; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit3143; PROLOG:       header.prol.preheader:3144; PROLOG-NEXT:    br label %header.prol3145; PROLOG:       header.prol:3146; PROLOG-NEXT:    %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ]3147; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]3148; PROLOG-NEXT:    %inc.prol = add nuw i32 %i4.prol, 13149; PROLOG-NEXT:    %cmp1.prol = icmp ult i32 %inc.prol, %N3150; PROLOG-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit13151; PROLOG:       latch.prol:3152; PROLOG-NEXT:    %cmp.prol = icmp ult i32 %inc.prol, %M.shifted3153; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 13154; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter3155; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !83156; PROLOG:       header.prol.loopexit.unr-lcssa:3157; PROLOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ]3158; PROLOG-NEXT:    %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ]3159; PROLOG-NEXT:    br label %header.prol.loopexit3160; PROLOG:       header.prol.loopexit:3161; PROLOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ]3162; PROLOG-NEXT:    %i2.ph.unr = phi i32 [ poison, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ]3163; PROLOG-NEXT:    %2 = icmp ult i32 %1, 73164; PROLOG-NEXT:    br i1 %2, label %latchExit, label %preheader.new3165; PROLOG:       preheader.new:3166; PROLOG-NEXT:    br label %header3167; PROLOG:       header:3168; PROLOG-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ]3169; PROLOG-NEXT:    %inc = add nuw i32 %i4, 13170; PROLOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N3171; PROLOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit3172; PROLOG:       latch:3173; PROLOG-NEXT:    %inc.1 = add nuw i32 %i4, 23174; PROLOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N3175; PROLOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit3176; PROLOG:       latch.1:3177; PROLOG-NEXT:    %inc.2 = add nuw i32 %i4, 33178; PROLOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N3179; PROLOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit3180; PROLOG:       latch.2:3181; PROLOG-NEXT:    %inc.3 = add nuw i32 %i4, 43182; PROLOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N3183; PROLOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit3184; PROLOG:       latch.3:3185; PROLOG-NEXT:    %inc.4 = add nuw i32 %i4, 53186; PROLOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N3187; PROLOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit3188; PROLOG:       latch.4:3189; PROLOG-NEXT:    %inc.5 = add nuw i32 %i4, 63190; PROLOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N3191; PROLOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit3192; PROLOG:       latch.5:3193; PROLOG-NEXT:    %inc.6 = add nuw i32 %i4, 73194; PROLOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N3195; PROLOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit3196; PROLOG:       latch.6:3197; PROLOG-NEXT:    %inc.7 = add nuw i32 %i4, 83198; PROLOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N3199; PROLOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit3200; PROLOG:       latch.7:3201; PROLOG-NEXT:    %cmp.7 = icmp ult i32 %inc.7, %M.shifted3202; PROLOG-NEXT:    br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit3203; PROLOG:       latchExit.unr-lcssa.loopexit:3204; PROLOG-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ]3205; PROLOG-NEXT:    br label %latchExit.unr-lcssa3206; PROLOG:       latchExit.unr-lcssa.loopexit1:3207; PROLOG-NEXT:    %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ]3208; PROLOG-NEXT:    br label %latchExit.unr-lcssa3209; PROLOG:       latchExit.unr-lcssa:3210; PROLOG-NEXT:    %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]3211; PROLOG-NEXT:    br label %latchExit3212; PROLOG:       latchExit:3213; PROLOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]3214; PROLOG-NEXT:    ret void3215;3216; PROLOG-BLOCK-LABEL: @unique_exit(3217; PROLOG-BLOCK-NEXT:  preheader:3218; PROLOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 33219; PROLOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)3220; PROLOG-BLOCK-NEXT:    %0 = freeze i32 %umax3221; PROLOG-BLOCK-NEXT:    %1 = add i32 %0, -13222; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 13223; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 03224; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit3225; PROLOG-BLOCK:       header.prol.preheader:3226; PROLOG-BLOCK-NEXT:    br label %header.prol3227; PROLOG-BLOCK:       header.prol:3228; PROLOG-BLOCK-NEXT:    %cmp1.prol = icmp ult i32 1, %N3229; PROLOG-BLOCK-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa3230; PROLOG-BLOCK:       latch.prol:3231; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit3232; PROLOG-BLOCK:       header.prol.loopexit:3233; PROLOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ]3234; PROLOG-BLOCK-NEXT:    %i2.ph.unr = phi i32 [ poison, %preheader ], [ -1, %latch.prol ]3235; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 13236; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %preheader.new3237; PROLOG-BLOCK:       preheader.new:3238; PROLOG-BLOCK-NEXT:    br label %header3239; PROLOG-BLOCK:       header:3240; PROLOG-BLOCK-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ]3241; PROLOG-BLOCK-NEXT:    %inc = add nuw i32 %i4, 13242; PROLOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N3243; PROLOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit3244; PROLOG-BLOCK:       latch:3245; PROLOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %i4, 23246; PROLOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N3247; PROLOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit3248; PROLOG-BLOCK:       latch.1:3249; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ult i32 %inc.1, %M.shifted3250; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !83251; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:3252; PROLOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ]3253; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa3254; PROLOG-BLOCK:       latchExit.unr-lcssa:3255; PROLOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]3256; PROLOG-BLOCK-NEXT:    br label %latchExit3257; PROLOG-BLOCK:       latchExit:3258; PROLOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]3259; PROLOG-BLOCK-NEXT:    ret void3260;3261 3262preheader:3263  %M.shifted = shl nuw i32 %M, 33264  br label %header3265 3266header:                                           ; preds = %preheader, %latch3267  %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ]3268  %inc = add nuw i32 %i4, 13269  %cmp1 = icmp ult i32 %inc, %N3270  br i1 %cmp1, label %latch, label %latchExit3271 3272latch:                                            ; preds = %header3273  %cmp = icmp ult i32 %inc, %M.shifted3274  br i1 %cmp, label %header, label %latchExit3275 3276latchExit:                                ; preds = %header, %latch3277  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]3278  ret void3279}3280 3281 3282; two exiting and two exit blocks.3283; the non-latch exiting block has duplicate edges to the non-latch exit block.3284define i64 @test5(i64 %trip, i64 %add, i1 %cond) {3285; EPILOG-LABEL: @test5(3286; EPILOG-NEXT:  entry:3287; EPILOG-NEXT:    %0 = freeze i64 %trip3288; EPILOG-NEXT:    %1 = add i64 %0, -13289; EPILOG-NEXT:    %xtraiter = and i64 %0, 73290; EPILOG-NEXT:    %2 = icmp ult i64 %1, 73291; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new3292; EPILOG:       entry.new:3293; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter3294; EPILOG-NEXT:    br label %loop_header3295; EPILOG:       loop_header:3296; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]3297; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]3298; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]3299; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting3300; EPILOG:       loop_exiting:3301; EPILOG-NEXT:    %ivy = add i64 %iv, %add3302; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [3303; EPILOG-NEXT:      i64 24, label %exit1.loopexit3304; EPILOG-NEXT:      i64 42, label %exit1.loopexit3305; EPILOG-NEXT:    ]3306; EPILOG:       loop_latch:3307; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 13308; EPILOG-NEXT:    %sum.next = add i64 %sum, %add3309; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.13310; EPILOG:       loop_exiting.1:3311; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add3312; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [3313; EPILOG-NEXT:      i64 24, label %exit1.loopexit3314; EPILOG-NEXT:      i64 42, label %exit1.loopexit3315; EPILOG-NEXT:    ]3316; EPILOG:       loop_latch.1:3317; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 23318; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add3319; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.23320; EPILOG:       loop_exiting.2:3321; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add3322; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [3323; EPILOG-NEXT:      i64 24, label %exit1.loopexit3324; EPILOG-NEXT:      i64 42, label %exit1.loopexit3325; EPILOG-NEXT:    ]3326; EPILOG:       loop_latch.2:3327; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 33328; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add3329; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.33330; EPILOG:       loop_exiting.3:3331; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add3332; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [3333; EPILOG-NEXT:      i64 24, label %exit1.loopexit3334; EPILOG-NEXT:      i64 42, label %exit1.loopexit3335; EPILOG-NEXT:    ]3336; EPILOG:       loop_latch.3:3337; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 43338; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add3339; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.43340; EPILOG:       loop_exiting.4:3341; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add3342; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [3343; EPILOG-NEXT:      i64 24, label %exit1.loopexit3344; EPILOG-NEXT:      i64 42, label %exit1.loopexit3345; EPILOG-NEXT:    ]3346; EPILOG:       loop_latch.4:3347; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 53348; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add3349; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.53350; EPILOG:       loop_exiting.5:3351; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add3352; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [3353; EPILOG-NEXT:      i64 24, label %exit1.loopexit3354; EPILOG-NEXT:      i64 42, label %exit1.loopexit3355; EPILOG-NEXT:    ]3356; EPILOG:       loop_latch.5:3357; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 63358; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add3359; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.63360; EPILOG:       loop_exiting.6:3361; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add3362; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [3363; EPILOG-NEXT:      i64 24, label %exit1.loopexit3364; EPILOG-NEXT:      i64 42, label %exit1.loopexit3365; EPILOG-NEXT:    ]3366; EPILOG:       loop_latch.6:3367; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 73368; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add3369; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.73370; EPILOG:       loop_exiting.7:3371; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add3372; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [3373; EPILOG-NEXT:      i64 24, label %exit1.loopexit3374; EPILOG-NEXT:      i64 42, label %exit1.loopexit3375; EPILOG-NEXT:    ]3376; EPILOG:       loop_latch.7:3377; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 83378; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add3379; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 83380; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter3381; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa3382; EPILOG:       exit1.loopexit:3383; EPILOG-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ]3384; EPILOG-NEXT:    br label %exit13385; EPILOG:       exit1.loopexit3:3386; EPILOG-NEXT:    %result.ph4 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]3387; EPILOG-NEXT:    br label %exit13388; EPILOG:       exit1:3389; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph4, %exit1.loopexit3 ]3390; EPILOG-NEXT:    ret i64 %result3391; EPILOG:       latchexit.unr-lcssa:3392; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]3393; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]3394; EPILOG-NEXT:    %sum.unr = phi i64 [ %sum.next.7, %loop_latch.7 ]3395; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03396; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit3397; EPILOG:       loop_header.epil.preheader:3398; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %latchexit.unr-lcssa ]3399; EPILOG-NEXT:    %sum.epil.init = phi i64 [ 0, %entry ], [ %sum.unr, %latchexit.unr-lcssa ]3400; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 03401; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3402; EPILOG-NEXT:    br label %loop_header.epil3403; EPILOG:       loop_header.epil:3404; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]3405; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.epil.init, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]3406; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]3407; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil3408; EPILOG:       loop_exiting.epil:3409; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add3410; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [3411; EPILOG-NEXT:      i64 24, label %exit1.loopexit33412; EPILOG-NEXT:      i64 42, label %exit1.loopexit33413; EPILOG-NEXT:    ]3414; EPILOG:       loop_latch.epil:3415; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 13416; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add3417; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip3418; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 13419; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter3420; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !93421; EPILOG:       latchexit.epilog-lcssa:3422; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]3423; EPILOG-NEXT:    br label %latchexit3424; EPILOG:       latchexit:3425; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]3426; EPILOG-NEXT:    ret i64 %sum.next.lcssa3427;3428; EPILOG-BLOCK-LABEL: @test5(3429; EPILOG-BLOCK-NEXT:  entry:3430; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip3431; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -13432; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 13433; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 13434; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new3435; EPILOG-BLOCK:       entry.new:3436; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter3437; EPILOG-BLOCK-NEXT:    br label %loop_header3438; EPILOG-BLOCK:       loop_header:3439; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]3440; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]3441; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]3442; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting3443; EPILOG-BLOCK:       loop_exiting:3444; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add3445; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [3446; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit3447; EPILOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit3448; EPILOG-BLOCK-NEXT:    ]3449; EPILOG-BLOCK:       loop_latch:3450; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 13451; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add3452; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.13453; EPILOG-BLOCK:       loop_exiting.1:3454; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add3455; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [3456; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit3457; EPILOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit3458; EPILOG-BLOCK-NEXT:    ]3459; EPILOG-BLOCK:       loop_latch.1:3460; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 23461; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add3462; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 23463; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter3464; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !93465; EPILOG-BLOCK:       exit1.loopexit:3466; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]3467; EPILOG-BLOCK-NEXT:    br label %exit13468; EPILOG-BLOCK:       exit1:3469; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]3470; EPILOG-BLOCK-NEXT:    ret i64 %result3471; EPILOG-BLOCK:       latchexit.unr-lcssa:3472; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]3473; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ %iv_next.1, %loop_latch.1 ]3474; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ %sum.next.1, %loop_latch.1 ]3475; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03476; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit3477; EPILOG-BLOCK:       loop_header.epil.preheader:3478; EPILOG-BLOCK-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %latchexit.unr-lcssa ]3479; EPILOG-BLOCK-NEXT:    %sum.epil.init = phi i64 [ 0, %entry ], [ %sum.unr, %latchexit.unr-lcssa ]3480; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 03481; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3482; EPILOG-BLOCK-NEXT:    br label %loop_header.epil3483; EPILOG-BLOCK:       loop_header.epil:3484; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil3485; EPILOG-BLOCK:       loop_exiting.epil:3486; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.epil.init, %add3487; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil.init, label %loop_latch.epil [3488; EPILOG-BLOCK-NEXT:      i64 24, label %exit13489; EPILOG-BLOCK-NEXT:      i64 42, label %exit13490; EPILOG-BLOCK-NEXT:    ]3491; EPILOG-BLOCK:       loop_latch.epil:3492; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil.init, %add3493; EPILOG-BLOCK-NEXT:    br label %latchexit3494; EPILOG-BLOCK:       latchexit:3495; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]3496; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa3497;3498; PROLOG-LABEL: @test5(3499; PROLOG-NEXT:  entry:3500; PROLOG-NEXT:    %0 = freeze i64 %trip3501; PROLOG-NEXT:    %1 = add i64 %0, -13502; PROLOG-NEXT:    %xtraiter = and i64 %0, 73503; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03504; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit3505; PROLOG:       loop_header.prol.preheader:3506; PROLOG-NEXT:    br label %loop_header.prol3507; PROLOG:       loop_header.prol:3508; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]3509; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]3510; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]3511; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol3512; PROLOG:       loop_exiting.prol:3513; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add3514; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [3515; PROLOG-NEXT:      i64 24, label %exit1.loopexit13516; PROLOG-NEXT:      i64 42, label %exit1.loopexit13517; PROLOG-NEXT:    ]3518; PROLOG:       loop_latch.prol:3519; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 13520; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add3521; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip3522; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 13523; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter3524; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !93525; PROLOG:       loop_header.prol.loopexit.unr-lcssa:3526; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]3527; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]3528; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]3529; PROLOG-NEXT:    br label %loop_header.prol.loopexit3530; PROLOG:       loop_header.prol.loopexit:3531; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]3532; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]3533; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]3534; PROLOG-NEXT:    %2 = icmp ult i64 %1, 73535; PROLOG-NEXT:    br i1 %2, label %latchexit, label %entry.new3536; PROLOG:       entry.new:3537; PROLOG-NEXT:    br label %loop_header3538; PROLOG:       loop_header:3539; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]3540; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]3541; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting3542; PROLOG:       loop_exiting:3543; PROLOG-NEXT:    %ivy = add i64 %iv, %add3544; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [3545; PROLOG-NEXT:      i64 24, label %exit1.loopexit3546; PROLOG-NEXT:      i64 42, label %exit1.loopexit3547; PROLOG-NEXT:    ]3548; PROLOG:       loop_latch:3549; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 13550; PROLOG-NEXT:    %sum.next = add i64 %sum, %add3551; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.13552; PROLOG:       loop_exiting.1:3553; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add3554; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [3555; PROLOG-NEXT:      i64 24, label %exit1.loopexit3556; PROLOG-NEXT:      i64 42, label %exit1.loopexit3557; PROLOG-NEXT:    ]3558; PROLOG:       loop_latch.1:3559; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 23560; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add3561; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.23562; PROLOG:       loop_exiting.2:3563; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add3564; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [3565; PROLOG-NEXT:      i64 24, label %exit1.loopexit3566; PROLOG-NEXT:      i64 42, label %exit1.loopexit3567; PROLOG-NEXT:    ]3568; PROLOG:       loop_latch.2:3569; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 33570; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add3571; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.33572; PROLOG:       loop_exiting.3:3573; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add3574; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [3575; PROLOG-NEXT:      i64 24, label %exit1.loopexit3576; PROLOG-NEXT:      i64 42, label %exit1.loopexit3577; PROLOG-NEXT:    ]3578; PROLOG:       loop_latch.3:3579; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 43580; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add3581; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.43582; PROLOG:       loop_exiting.4:3583; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add3584; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [3585; PROLOG-NEXT:      i64 24, label %exit1.loopexit3586; PROLOG-NEXT:      i64 42, label %exit1.loopexit3587; PROLOG-NEXT:    ]3588; PROLOG:       loop_latch.4:3589; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 53590; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add3591; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.53592; PROLOG:       loop_exiting.5:3593; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add3594; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [3595; PROLOG-NEXT:      i64 24, label %exit1.loopexit3596; PROLOG-NEXT:      i64 42, label %exit1.loopexit3597; PROLOG-NEXT:    ]3598; PROLOG:       loop_latch.5:3599; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 63600; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add3601; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.63602; PROLOG:       loop_exiting.6:3603; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add3604; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [3605; PROLOG-NEXT:      i64 24, label %exit1.loopexit3606; PROLOG-NEXT:      i64 42, label %exit1.loopexit3607; PROLOG-NEXT:    ]3608; PROLOG:       loop_latch.6:3609; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 73610; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add3611; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.73612; PROLOG:       loop_exiting.7:3613; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add3614; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [3615; PROLOG-NEXT:      i64 24, label %exit1.loopexit3616; PROLOG-NEXT:      i64 42, label %exit1.loopexit3617; PROLOG-NEXT:    ]3618; PROLOG:       loop_latch.7:3619; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 83620; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add3621; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip3622; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa3623; PROLOG:       exit1.loopexit:3624; PROLOG-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ]3625; PROLOG-NEXT:    br label %exit13626; PROLOG:       exit1.loopexit1:3627; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]3628; PROLOG-NEXT:    br label %exit13629; PROLOG:       exit1:3630; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]3631; PROLOG-NEXT:    ret i64 %result3632; PROLOG:       latchexit.unr-lcssa:3633; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]3634; PROLOG-NEXT:    br label %latchexit3635; PROLOG:       latchexit:3636; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]3637; PROLOG-NEXT:    ret i64 %sum.next.lcssa3638;3639; PROLOG-BLOCK-LABEL: @test5(3640; PROLOG-BLOCK-NEXT:  entry:3641; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip3642; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -13643; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 13644; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03645; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit3646; PROLOG-BLOCK:       loop_header.prol.preheader:3647; PROLOG-BLOCK-NEXT:    br label %loop_header.prol3648; PROLOG-BLOCK:       loop_header.prol:3649; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol3650; PROLOG-BLOCK:       loop_exiting.prol:3651; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [3652; PROLOG-BLOCK-NEXT:      i64 24, label %exit13653; PROLOG-BLOCK-NEXT:      i64 42, label %exit13654; PROLOG-BLOCK-NEXT:    ]3655; PROLOG-BLOCK:       loop_latch.prol:3656; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit3657; PROLOG-BLOCK:       loop_header.prol.loopexit:3658; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]3659; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]3660; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %add, %loop_latch.prol ]3661; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 13662; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %entry.new3663; PROLOG-BLOCK:       entry.new:3664; PROLOG-BLOCK-NEXT:    br label %loop_header3665; PROLOG-BLOCK:       loop_header:3666; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]3667; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]3668; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting3669; PROLOG-BLOCK:       loop_exiting:3670; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add3671; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [3672; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit3673; PROLOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit3674; PROLOG-BLOCK-NEXT:    ]3675; PROLOG-BLOCK:       loop_latch:3676; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 13677; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add3678; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.13679; PROLOG-BLOCK:       loop_exiting.1:3680; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add3681; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [3682; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit3683; PROLOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit3684; PROLOG-BLOCK-NEXT:    ]3685; PROLOG-BLOCK:       loop_latch.1:3686; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 23687; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add3688; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip3689; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !93690; PROLOG-BLOCK:       exit1.loopexit:3691; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]3692; PROLOG-BLOCK-NEXT:    br label %exit13693; PROLOG-BLOCK:       exit1:3694; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]3695; PROLOG-BLOCK-NEXT:    ret i64 %result3696; PROLOG-BLOCK:       latchexit.unr-lcssa:3697; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]3698; PROLOG-BLOCK-NEXT:    br label %latchexit3699; PROLOG-BLOCK:       latchexit:3700; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]3701; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa3702;3703 3704entry:3705  br label %loop_header3706 3707loop_header:3708  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]3709  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]3710  br i1 %cond, label %loop_latch, label %loop_exiting3711 3712loop_exiting:3713  %ivy = add i64 %iv, %add3714  switch i64 %sum, label %loop_latch [3715  i64 24, label %exit13716  i64 42, label %exit13717  ]3718 3719loop_latch:3720  %iv_next = add nuw nsw i64 %iv, 13721  %sum.next = add i64 %sum, %add3722  %cmp = icmp ne i64 %iv_next, %trip3723  br i1 %cmp, label %loop_header, label %latchexit3724 3725exit1:3726  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]3727  ret i64 %result3728 3729latchexit:3730  ret i64 %sum.next3731}3732 3733; test when exit blocks have successors.3734define i32 @test6(ptr nocapture %a, i64 %n, i1 %cond, i32 %x) {3735; EPILOG-LABEL: @test6(3736; EPILOG-NEXT:  entry:3737; EPILOG-NEXT:    %0 = freeze i64 %n3738; EPILOG-NEXT:    %1 = add i64 %0, -13739; EPILOG-NEXT:    %xtraiter = and i64 %0, 73740; EPILOG-NEXT:    %2 = icmp ult i64 %1, 73741; EPILOG-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new3742; EPILOG:       entry.new:3743; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter3744; EPILOG-NEXT:    br label %header3745; EPILOG:       header:3746; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]3747; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]3748; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]3749; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block3750; EPILOG:       for.exiting_block:3751; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 423752; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch3753; EPILOG:       latch:3754; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv3755; EPILOG-NEXT:    %load = load i32, ptr %arrayidx, align 43756; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.023757; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 13758; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.13759; EPILOG:       for.exiting_block.1:3760; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 423761; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.13762; EPILOG:       latch.1:3763; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next3764; EPILOG-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 43765; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add3766; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 23767; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.23768; EPILOG:       for.exiting_block.2:3769; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 423770; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.23771; EPILOG:       latch.2:3772; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.13773; EPILOG-NEXT:    %load.2 = load i32, ptr %arrayidx.2, align 43774; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.13775; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 33776; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.33777; EPILOG:       for.exiting_block.3:3778; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 423779; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.33780; EPILOG:       latch.3:3781; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.23782; EPILOG-NEXT:    %load.3 = load i32, ptr %arrayidx.3, align 43783; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.23784; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 43785; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.43786; EPILOG:       for.exiting_block.4:3787; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 423788; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.43789; EPILOG:       latch.4:3790; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.33791; EPILOG-NEXT:    %load.4 = load i32, ptr %arrayidx.4, align 43792; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.33793; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 53794; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.53795; EPILOG:       for.exiting_block.5:3796; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 423797; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.53798; EPILOG:       latch.5:3799; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.43800; EPILOG-NEXT:    %load.5 = load i32, ptr %arrayidx.5, align 43801; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.43802; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 63803; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.63804; EPILOG:       for.exiting_block.6:3805; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 423806; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.63807; EPILOG:       latch.6:3808; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.53809; EPILOG-NEXT:    %load.6 = load i32, ptr %arrayidx.6, align 43810; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.53811; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 73812; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.73813; EPILOG:       for.exiting_block.7:3814; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 423815; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.73816; EPILOG:       latch.7:3817; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.63818; EPILOG-NEXT:    %load.7 = load i32, ptr %arrayidx.7, align 43819; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.63820; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 83821; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 83822; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter3823; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa, label %header3824; EPILOG:       latch_exit.unr-lcssa:3825; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]3826; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.7, %latch.7 ]3827; EPILOG-NEXT:    %sum.02.unr = phi i32 [ %add.7, %latch.7 ]3828; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03829; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit3830; EPILOG:       header.epil.preheader:3831; EPILOG-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latch_exit.unr-lcssa ]3832; EPILOG-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latch_exit.unr-lcssa ]3833; EPILOG-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 03834; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3835; EPILOG-NEXT:    br label %header.epil3836; EPILOG:       header.epil:3837; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.epil.init, %header.epil.preheader ]3838; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil.init, %header.epil.preheader ]3839; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]3840; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit3, label %for.exiting_block.epil3841; EPILOG:       for.exiting_block.epil:3842; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 423843; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit3, label %latch.epil3844; EPILOG:       latch.epil:3845; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil3846; EPILOG-NEXT:    %load.epil = load i32, ptr %arrayidx.epil, align 43847; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil3848; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 13849; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n3850; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 13851; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter3852; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !103853; EPILOG:       latch_exit.epilog-lcssa:3854; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]3855; EPILOG-NEXT:    br label %latch_exit3856; EPILOG:       latch_exit:3857; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]3858; EPILOG-NEXT:    ret i32 %sum.0.lcssa3859; EPILOG:       for.exit2.loopexit:3860; EPILOG-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ]3861; EPILOG-NEXT:    br label %for.exit23862; EPILOG:       for.exit2.loopexit3:3863; EPILOG-NEXT:    %retval.ph4 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]3864; EPILOG-NEXT:    br label %for.exit23865; EPILOG:       for.exit2:3866; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph4, %for.exit2.loopexit3 ]3867; EPILOG-NEXT:    %addx = add i32 %retval, %x3868; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false3869; EPILOG:       exit_true:3870; EPILOG-NEXT:    ret i32 %retval3871; EPILOG:       exit_false:3872; EPILOG-NEXT:    ret i32 %addx3873;3874; EPILOG-BLOCK-LABEL: @test6(3875; EPILOG-BLOCK-NEXT:  entry:3876; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n3877; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -13878; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 13879; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 13880; EPILOG-BLOCK-NEXT:    br i1 %2, label %header.epil.preheader, label %entry.new3881; EPILOG-BLOCK:       entry.new:3882; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter3883; EPILOG-BLOCK-NEXT:    br label %header3884; EPILOG-BLOCK:       header:3885; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]3886; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]3887; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]3888; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block3889; EPILOG-BLOCK:       for.exiting_block:3890; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 423891; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch3892; EPILOG-BLOCK:       latch:3893; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv3894; EPILOG-BLOCK-NEXT:    %load = load i32, ptr %arrayidx, align 43895; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.023896; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 13897; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.13898; EPILOG-BLOCK:       for.exiting_block.1:3899; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 423900; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.13901; EPILOG-BLOCK:       latch.1:3902; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next3903; EPILOG-BLOCK-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 43904; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add3905; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 23906; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 23907; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter3908; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !103909; EPILOG-BLOCK:       latch_exit.unr-lcssa:3910; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]3911; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ %indvars.iv.next.1, %latch.1 ]3912; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ %add.1, %latch.1 ]3913; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03914; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit3915; EPILOG-BLOCK:       header.epil.preheader:3916; EPILOG-BLOCK-NEXT:    %indvars.iv.epil.init = phi i64 [ 0, %entry ], [ %indvars.iv.unr, %latch_exit.unr-lcssa ]3917; EPILOG-BLOCK-NEXT:    %sum.02.epil.init = phi i32 [ 0, %entry ], [ %sum.02.unr, %latch_exit.unr-lcssa ]3918; EPILOG-BLOCK-NEXT:    %lcmp.mod2 = icmp ne i64 %xtraiter, 03919; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod2)3920; EPILOG-BLOCK-NEXT:    br label %header.epil3921; EPILOG-BLOCK:       header.epil:3922; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil3923; EPILOG-BLOCK:       for.exiting_block.epil:3924; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 423925; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil3926; EPILOG-BLOCK:       latch.epil:3927; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil.init3928; EPILOG-BLOCK-NEXT:    %load.epil = load i32, ptr %arrayidx.epil, align 43929; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil.init3930; EPILOG-BLOCK-NEXT:    br label %latch_exit3931; EPILOG-BLOCK:       latch_exit:3932; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]3933; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa3934; EPILOG-BLOCK:       for.exit2.loopexit:3935; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]3936; EPILOG-BLOCK-NEXT:    br label %for.exit23937; EPILOG-BLOCK:       for.exit2:3938; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil.init, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]3939; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x3940; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false3941; EPILOG-BLOCK:       exit_true:3942; EPILOG-BLOCK-NEXT:    ret i32 %retval3943; EPILOG-BLOCK:       exit_false:3944; EPILOG-BLOCK-NEXT:    ret i32 %addx3945;3946; PROLOG-LABEL: @test6(3947; PROLOG-NEXT:  entry:3948; PROLOG-NEXT:    %0 = freeze i64 %n3949; PROLOG-NEXT:    %1 = add i64 %0, -13950; PROLOG-NEXT:    %xtraiter = and i64 %0, 73951; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 03952; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit3953; PROLOG:       header.prol.preheader:3954; PROLOG-NEXT:    br label %header.prol3955; PROLOG:       header.prol:3956; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]3957; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]3958; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]3959; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol3960; PROLOG:       for.exiting_block.prol:3961; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 423962; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol3963; PROLOG:       latch.prol:3964; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol3965; PROLOG-NEXT:    %load.prol = load i32, ptr %arrayidx.prol, align 43966; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol3967; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 13968; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n3969; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 13970; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter3971; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !103972; PROLOG:       header.prol.loopexit.unr-lcssa:3973; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]3974; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]3975; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]3976; PROLOG-NEXT:    br label %header.prol.loopexit3977; PROLOG:       header.prol.loopexit:3978; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]3979; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]3980; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]3981; PROLOG-NEXT:    %2 = icmp ult i64 %1, 73982; PROLOG-NEXT:    br i1 %2, label %latch_exit, label %entry.new3983; PROLOG:       entry.new:3984; PROLOG-NEXT:    br label %header3985; PROLOG:       header:3986; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]3987; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]3988; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block3989; PROLOG:       for.exiting_block:3990; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 423991; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch3992; PROLOG:       latch:3993; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv3994; PROLOG-NEXT:    %load = load i32, ptr %arrayidx, align 43995; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.023996; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 13997; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.13998; PROLOG:       for.exiting_block.1:3999; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 424000; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.14001; PROLOG:       latch.1:4002; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next4003; PROLOG-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 44004; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add4005; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 24006; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.24007; PROLOG:       for.exiting_block.2:4008; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 424009; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.24010; PROLOG:       latch.2:4011; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.14012; PROLOG-NEXT:    %load.2 = load i32, ptr %arrayidx.2, align 44013; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.14014; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 34015; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.34016; PROLOG:       for.exiting_block.3:4017; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 424018; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.34019; PROLOG:       latch.3:4020; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.24021; PROLOG-NEXT:    %load.3 = load i32, ptr %arrayidx.3, align 44022; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.24023; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 44024; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.44025; PROLOG:       for.exiting_block.4:4026; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 424027; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.44028; PROLOG:       latch.4:4029; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.34030; PROLOG-NEXT:    %load.4 = load i32, ptr %arrayidx.4, align 44031; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.34032; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 54033; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.54034; PROLOG:       for.exiting_block.5:4035; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 424036; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.54037; PROLOG:       latch.5:4038; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.44039; PROLOG-NEXT:    %load.5 = load i32, ptr %arrayidx.5, align 44040; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.44041; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 64042; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.64043; PROLOG:       for.exiting_block.6:4044; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 424045; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.64046; PROLOG:       latch.6:4047; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.54048; PROLOG-NEXT:    %load.6 = load i32, ptr %arrayidx.6, align 44049; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.54050; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 74051; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.74052; PROLOG:       for.exiting_block.7:4053; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 424054; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.74055; PROLOG:       latch.7:4056; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.64057; PROLOG-NEXT:    %load.7 = load i32, ptr %arrayidx.7, align 44058; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.64059; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 84060; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n4061; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header4062; PROLOG:       latch_exit.unr-lcssa:4063; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]4064; PROLOG-NEXT:    br label %latch_exit4065; PROLOG:       latch_exit:4066; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]4067; PROLOG-NEXT:    ret i32 %sum.0.lcssa4068; PROLOG:       for.exit2.loopexit:4069; PROLOG-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ]4070; PROLOG-NEXT:    br label %for.exit24071; PROLOG:       for.exit2.loopexit1:4072; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]4073; PROLOG-NEXT:    br label %for.exit24074; PROLOG:       for.exit2:4075; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]4076; PROLOG-NEXT:    %addx = add i32 %retval, %x4077; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false4078; PROLOG:       exit_true:4079; PROLOG-NEXT:    ret i32 %retval4080; PROLOG:       exit_false:4081; PROLOG-NEXT:    ret i32 %addx4082;4083; PROLOG-BLOCK-LABEL: @test6(4084; PROLOG-BLOCK-NEXT:  entry:4085; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n4086; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -14087; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 14088; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04089; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit4090; PROLOG-BLOCK:       header.prol.preheader:4091; PROLOG-BLOCK-NEXT:    br label %header.prol4092; PROLOG-BLOCK:       header.prol:4093; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol4094; PROLOG-BLOCK:       for.exiting_block.prol:4095; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 424096; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol4097; PROLOG-BLOCK:       latch.prol:4098; PROLOG-BLOCK-NEXT:    %load.prol = load i32, ptr %a, align 44099; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit4100; PROLOG-BLOCK:       header.prol.loopexit:4101; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %load.prol, %latch.prol ]4102; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]4103; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]4104; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 14105; PROLOG-BLOCK-NEXT:    br i1 %2, label %latch_exit, label %entry.new4106; PROLOG-BLOCK:       entry.new:4107; PROLOG-BLOCK-NEXT:    br label %header4108; PROLOG-BLOCK:       header:4109; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]4110; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]4111; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block4112; PROLOG-BLOCK:       for.exiting_block:4113; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 424114; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch4115; PROLOG-BLOCK:       latch:4116; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv4117; PROLOG-BLOCK-NEXT:    %load = load i32, ptr %arrayidx, align 44118; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.024119; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 14120; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.14121; PROLOG-BLOCK:       for.exiting_block.1:4122; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 424123; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.14124; PROLOG-BLOCK:       latch.1:4125; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next4126; PROLOG-BLOCK-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 44127; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add4128; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 24129; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n4130; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !104131; PROLOG-BLOCK:       latch_exit.unr-lcssa:4132; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]4133; PROLOG-BLOCK-NEXT:    br label %latch_exit4134; PROLOG-BLOCK:       latch_exit:4135; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]4136; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa4137; PROLOG-BLOCK:       for.exit2.loopexit:4138; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]4139; PROLOG-BLOCK-NEXT:    br label %for.exit24140; PROLOG-BLOCK:       for.exit2:4141; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]4142; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x4143; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false4144; PROLOG-BLOCK:       exit_true:4145; PROLOG-BLOCK-NEXT:    ret i32 %retval4146; PROLOG-BLOCK:       exit_false:4147; PROLOG-BLOCK-NEXT:    ret i32 %addx4148;4149 4150entry:4151  br label %header4152 4153header:4154  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]4155  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]4156  br i1 false, label %for.exit2, label %for.exiting_block4157 4158for.exiting_block:4159  %cmp = icmp eq i64 %n, 424160  br i1 %cmp, label %for.exit2, label %latch4161 4162latch:4163  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv4164  %load = load i32, ptr %arrayidx, align 44165  %add = add nsw i32 %load, %sum.024166  %indvars.iv.next = add i64 %indvars.iv, 14167  %exitcond = icmp eq i64 %indvars.iv.next, %n4168  br i1 %exitcond, label %latch_exit, label %header4169 4170latch_exit:4171  %sum.0.lcssa = phi i32 [ %add, %latch ]4172  ret i32 %sum.0.lcssa4173 4174for.exit2:4175  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]4176  %addx = add i32 %retval, %x4177  br i1 %cond, label %exit_true, label %exit_false4178 4179exit_true:4180  ret i32 %retval4181 4182exit_false:4183  ret i32 %addx4184}4185 4186; test when value in exit block does not have VMap.4187define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {4188; EPILOG-LABEL: @test7(4189; EPILOG-NEXT:  bb:4190; EPILOG-NEXT:    %i = icmp slt i32 undef, 24191; EPILOG-NEXT:    %sext = sext i32 undef to i644192; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 164193; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader4194; EPILOG:       preheader:4195; EPILOG-NEXT:    %0 = add nsw i64 %sext, -14196; EPILOG-NEXT:    %1 = freeze i64 %04197; EPILOG-NEXT:    %2 = add i64 %1, -14198; EPILOG-NEXT:    %xtraiter = and i64 %1, 74199; EPILOG-NEXT:    %3 = icmp ult i64 %2, 74200; EPILOG-NEXT:    br i1 %3, label %header.epil.preheader, label %preheader.new4201; EPILOG:       preheader.new:4202; EPILOG-NEXT:    %unroll_iter = sub i64 %1, %xtraiter4203; EPILOG-NEXT:    br label %header4204; EPILOG:       header:4205; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]4206; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]4207; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch4208; EPILOG:       latch:4209; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.14210; EPILOG:       latch.1:4211; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.24212; EPILOG:       latch.2:4213; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.34214; EPILOG:       latch.3:4215; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.44216; EPILOG:       latch.4:4217; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.54218; EPILOG:       latch.5:4219; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.64220; EPILOG:       latch.6:4221; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.74222; EPILOG:       latch.7:4223; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %i6, 84224; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 84225; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter4226; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa4227; EPILOG:       latchexit.unr-lcssa:4228; EPILOG-NEXT:    %i6.unr = phi i64 [ %add.7, %latch.7 ]4229; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04230; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit4231; EPILOG:       header.epil.preheader:4232; EPILOG-NEXT:    %i6.epil.init = phi i64 [ 1, %preheader ], [ %i6.unr, %latchexit.unr-lcssa ]4233; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 04234; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4235; EPILOG-NEXT:    br label %header.epil4236; EPILOG:       header.epil:4237; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.epil.init, %header.epil.preheader ], [ %add.epil, %latch.epil ]4238; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]4239; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit2, label %latch.epil4240; EPILOG:       latch.epil:4241; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 14242; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext4243; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 14244; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter4245; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !114246; EPILOG:       latchexit.epilog-lcssa:4247; EPILOG-NEXT:    br label %latchexit4248; EPILOG:       latchexit:4249; EPILOG-NEXT:    unreachable4250; EPILOG:       loopexit2:4251; EPILOG-NEXT:    ret i32 %shft4252; EPILOG:       loopexit1.loopexit:4253; EPILOG-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]4254; EPILOG-NEXT:    br label %loopexit14255; EPILOG:       loopexit1.loopexit2:4256; EPILOG-NEXT:    %sext3.ph3 = phi i32 [ %shft, %header.epil ]4257; EPILOG-NEXT:    br label %loopexit14258; EPILOG:       loopexit1:4259; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph3, %loopexit1.loopexit2 ]4260; EPILOG-NEXT:    ret i32 %sext34261;4262; EPILOG-BLOCK-LABEL: @test7(4263; EPILOG-BLOCK-NEXT:  bb:4264; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 24265; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i644266; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 164267; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader4268; EPILOG-BLOCK:       preheader:4269; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -14270; EPILOG-BLOCK-NEXT:    %1 = freeze i64 %04271; EPILOG-BLOCK-NEXT:    %2 = add i64 %1, -14272; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 14273; EPILOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 14274; EPILOG-BLOCK-NEXT:    br i1 %3, label %header.epil.preheader, label %preheader.new4275; EPILOG-BLOCK:       preheader.new:4276; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %1, %xtraiter4277; EPILOG-BLOCK-NEXT:    br label %header4278; EPILOG-BLOCK:       header:4279; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]4280; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]4281; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch4282; EPILOG-BLOCK:       latch:4283; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.14284; EPILOG-BLOCK:       latch.1:4285; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %i6, 24286; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 24287; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter4288; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !114289; EPILOG-BLOCK:       latchexit.unr-lcssa:4290; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04291; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit4292; EPILOG-BLOCK:       header.epil.preheader:4293; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 04294; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4295; EPILOG-BLOCK-NEXT:    br label %header.epil4296; EPILOG-BLOCK:       header.epil:4297; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil4298; EPILOG-BLOCK:       latch.epil:4299; EPILOG-BLOCK-NEXT:    br label %latchexit4300; EPILOG-BLOCK:       latchexit:4301; EPILOG-BLOCK-NEXT:    unreachable4302; EPILOG-BLOCK:       loopexit2:4303; EPILOG-BLOCK-NEXT:    ret i32 %shft4304; EPILOG-BLOCK:       loopexit1.loopexit:4305; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]4306; EPILOG-BLOCK-NEXT:    br label %loopexit14307; EPILOG-BLOCK:       loopexit1:4308; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]4309; EPILOG-BLOCK-NEXT:    ret i32 %sext34310;4311; PROLOG-LABEL: @test7(4312; PROLOG-NEXT:  bb:4313; PROLOG-NEXT:    %i = icmp slt i32 undef, 24314; PROLOG-NEXT:    %sext = sext i32 undef to i644315; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 164316; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader4317; PROLOG:       preheader:4318; PROLOG-NEXT:    %0 = add nsw i64 %sext, -14319; PROLOG-NEXT:    %1 = freeze i64 %04320; PROLOG-NEXT:    %2 = add i64 %1, -14321; PROLOG-NEXT:    %xtraiter = and i64 %1, 74322; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04323; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit4324; PROLOG:       header.prol.preheader:4325; PROLOG-NEXT:    br label %header.prol4326; PROLOG:       header.prol:4327; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]4328; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]4329; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol4330; PROLOG:       latch.prol:4331; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 14332; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext4333; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 14334; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter4335; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !114336; PROLOG:       header.prol.loopexit.unr-lcssa:4337; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]4338; PROLOG-NEXT:    br label %header.prol.loopexit4339; PROLOG:       header.prol.loopexit:4340; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]4341; PROLOG-NEXT:    %3 = icmp ult i64 %2, 74342; PROLOG-NEXT:    br i1 %3, label %latchexit, label %preheader.new4343; PROLOG:       preheader.new:4344; PROLOG-NEXT:    br label %header4345; PROLOG:       header:4346; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]4347; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch4348; PROLOG:       latch:4349; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.14350; PROLOG:       latch.1:4351; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.24352; PROLOG:       latch.2:4353; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.34354; PROLOG:       latch.3:4355; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.44356; PROLOG:       latch.4:4357; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.54358; PROLOG:       latch.5:4359; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.64360; PROLOG:       latch.6:4361; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.74362; PROLOG:       latch.7:4363; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %i6, 84364; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext4365; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa4366; PROLOG:       latchexit.unr-lcssa:4367; PROLOG-NEXT:    br label %latchexit4368; PROLOG:       latchexit:4369; PROLOG-NEXT:    unreachable4370; PROLOG:       loopexit2:4371; PROLOG-NEXT:    ret i32 %shft4372; PROLOG:       loopexit1.loopexit:4373; PROLOG-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]4374; PROLOG-NEXT:    br label %loopexit14375; PROLOG:       loopexit1.loopexit1:4376; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]4377; PROLOG-NEXT:    br label %loopexit14378; PROLOG:       loopexit1:4379; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]4380; PROLOG-NEXT:    ret i32 %sext34381;4382; PROLOG-BLOCK-LABEL: @test7(4383; PROLOG-BLOCK-NEXT:  bb:4384; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 24385; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i644386; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 164387; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader4388; PROLOG-BLOCK:       preheader:4389; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -14390; PROLOG-BLOCK-NEXT:    %1 = freeze i64 %04391; PROLOG-BLOCK-NEXT:    %2 = add i64 %1, -14392; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 14393; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04394; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit4395; PROLOG-BLOCK:       header.prol.preheader:4396; PROLOG-BLOCK-NEXT:    br label %header.prol4397; PROLOG-BLOCK:       header.prol:4398; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol4399; PROLOG-BLOCK:       latch.prol:4400; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit4401; PROLOG-BLOCK:       header.prol.loopexit:4402; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]4403; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 14404; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchexit, label %preheader.new4405; PROLOG-BLOCK:       preheader.new:4406; PROLOG-BLOCK-NEXT:    br label %header4407; PROLOG-BLOCK:       header:4408; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]4409; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch4410; PROLOG-BLOCK:       latch:4411; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.14412; PROLOG-BLOCK:       latch.1:4413; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %i6, 24414; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext4415; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !114416; PROLOG-BLOCK:       latchexit.unr-lcssa:4417; PROLOG-BLOCK-NEXT:    br label %latchexit4418; PROLOG-BLOCK:       latchexit:4419; PROLOG-BLOCK-NEXT:    unreachable4420; PROLOG-BLOCK:       loopexit2:4421; PROLOG-BLOCK-NEXT:    ret i32 %shft4422; PROLOG-BLOCK:       loopexit1.loopexit:4423; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]4424; PROLOG-BLOCK-NEXT:    br label %loopexit14425; PROLOG-BLOCK:       loopexit1:4426; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]4427; PROLOG-BLOCK-NEXT:    ret i32 %sext34428;4429bb:4430  %i = icmp slt i32 undef, 24431  %sext = sext i32 undef to i644432  %shft = ashr exact i32 %arg, 164433  br i1 %i, label %loopexit2, label %preheader4434 4435preheader:                                              ; preds = %bb24436  br label %header4437 4438header:                                              ; preds = %latch, %preheader4439  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]4440  br i1 false, label %loopexit1, label %latch4441 4442latch:                                              ; preds = %header4443  %add = add nuw nsw i64 %i6, 14444  %i9 = icmp slt i64 %add, %sext4445  br i1 %i9, label %header, label %latchexit4446 4447latchexit:                                             ; preds = %latch4448  unreachable4449 4450loopexit2:                                             ; preds = %bb24451  ret i32 %shft4452 4453loopexit1:                                             ; preds = %header4454  %sext3 = phi i32 [ %shft, %header ]4455  ret i32 %sext34456}4457 4458; Nested loop and inner loop is unrolled.  The tricky bit here is that4459; several blocks in the inner loop fall out of the outer block when we4460; use the epilogue block remainder strategy.4461define void @test8() {4462; EPILOG-LABEL: @test8(4463; EPILOG-NEXT:  bb:4464; EPILOG-NEXT:    br label %outerloop4465; EPILOG:       outerloop.loopexit.loopexit:4466; EPILOG-NEXT:    br label %outerloop.loopexit4467; EPILOG:       outerloop.loopexit.loopexit2:4468; EPILOG-NEXT:    br label %outerloop.loopexit4469; EPILOG:       outerloop.loopexit:4470; EPILOG-NEXT:    br label %outerloop4471; EPILOG:       outerloop:4472; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]4473; EPILOG-NEXT:    %0 = sub i64 100, %i4474; EPILOG-NEXT:    %1 = sub i64 99, %i4475; EPILOG-NEXT:    %xtraiter = and i64 %0, 74476; EPILOG-NEXT:    %2 = icmp ult i64 %1, 74477; EPILOG-NEXT:    br i1 %2, label %innerH.epil.preheader, label %outerloop.new4478; EPILOG:       outerloop.new:4479; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter4480; EPILOG-NEXT:    br label %innerH4481; EPILOG:       innerH:4482; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]4483; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]4484; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch4485; EPILOG:       latch:4486; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.14487; EPILOG:       latch.1:4488; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.24489; EPILOG:       latch.2:4490; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.34491; EPILOG:       latch.3:4492; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.44493; EPILOG:       latch.4:4494; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.54495; EPILOG:       latch.5:4496; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.64497; EPILOG:       latch.6:4498; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i3, 84499; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.74500; EPILOG:       latch.7:4501; EPILOG-NEXT:    %niter.next.7 = add nuw nsw i64 %niter, 84502; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter4503; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa4504; EPILOG:       exit.unr-lcssa:4505; EPILOG-NEXT:    %i3.unr = phi i64 [ %i4.7, %latch.7 ]4506; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04507; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit4508; EPILOG:       innerH.epil.preheader:4509; EPILOG-NEXT:    %i3.epil.init = phi i64 [ %i, %outerloop ], [ %i3.unr, %exit.unr-lcssa ]4510; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 04511; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4512; EPILOG-NEXT:    br label %innerH.epil4513; EPILOG:       innerH.epil:4514; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.epil.init, %innerH.epil.preheader ]4515; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]4516; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 14517; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit2, label %latch.epil4518; EPILOG:       latch.epil:4519; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 1004520; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 14521; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter4522; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !124523; EPILOG:       exit.epilog-lcssa:4524; EPILOG-NEXT:    br label %exit4525; EPILOG:       exit.loopexit:4526; EPILOG-NEXT:    br label %exit4527; EPILOG:       exit:4528; EPILOG-NEXT:    ret void4529;4530; EPILOG-BLOCK-LABEL: @test8(4531; EPILOG-BLOCK-NEXT:  bb:4532; EPILOG-BLOCK-NEXT:    br label %outerloop4533; EPILOG-BLOCK:       outerloop.loopexit.loopexit:4534; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit4535; EPILOG-BLOCK:       outerloop.loopexit:4536; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %outerloop.new.14537; EPILOG-BLOCK:       outerloop.new.1:4538; EPILOG-BLOCK-NEXT:    br label %innerH.14539; EPILOG-BLOCK:       innerH.1:4540; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]4541; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]4542; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.134543; EPILOG-BLOCK:       latch.13:4544; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i3.1, 24545; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.14546; EPILOG-BLOCK:       latch.1.1:4547; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.1, 24548; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 1004549; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.1, !llvm.loop !124550; EPILOG-BLOCK:       exit.unr-lcssa.1:4551; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit4552; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:4553; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.14554; EPILOG-BLOCK:       innerH.epil.preheader.1:4555; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 false)4556; EPILOG-BLOCK-NEXT:    br label %innerH.epil.14557; EPILOG-BLOCK:       innerH.epil.1:4558; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil4559; EPILOG-BLOCK:       outerloop.loopexit.1:4560; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !134561; EPILOG-BLOCK:       outerloop:4562; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]4563; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i4564; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i4565; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 14566; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 14567; EPILOG-BLOCK-NEXT:    br i1 %2, label %innerH.epil.preheader, label %outerloop.new4568; EPILOG-BLOCK:       outerloop.new:4569; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter4570; EPILOG-BLOCK-NEXT:    br label %innerH4571; EPILOG-BLOCK:       innerH:4572; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]4573; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]4574; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch4575; EPILOG-BLOCK:       latch:4576; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i3, 24577; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.14578; EPILOG-BLOCK:       latch.1:4579; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 24580; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter4581; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa, !llvm.loop !124582; EPILOG-BLOCK:       exit.unr-lcssa:4583; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04584; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit4585; EPILOG-BLOCK:       innerH.epil.preheader:4586; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 04587; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4588; EPILOG-BLOCK-NEXT:    br label %innerH.epil4589; EPILOG-BLOCK:       innerH.epil:4590; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil4591; EPILOG-BLOCK:       latch.epil:4592; EPILOG-BLOCK-NEXT:    br label %exit4593; EPILOG-BLOCK:       exit.loopexit:4594; EPILOG-BLOCK-NEXT:    br label %exit4595; EPILOG-BLOCK:       exit:4596; EPILOG-BLOCK-NEXT:    ret void4597;4598; PROLOG-LABEL: @test8(4599; PROLOG-NEXT:  bb:4600; PROLOG-NEXT:    br label %outerloop4601; PROLOG:       outerloop.loopexit.loopexit:4602; PROLOG-NEXT:    br label %outerloop.loopexit4603; PROLOG:       outerloop.loopexit.loopexit1:4604; PROLOG-NEXT:    br label %outerloop.loopexit4605; PROLOG:       outerloop.loopexit:4606; PROLOG-NEXT:    br label %outerloop4607; PROLOG:       outerloop:4608; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]4609; PROLOG-NEXT:    %0 = sub i64 100, %i4610; PROLOG-NEXT:    %1 = sub i64 99, %i4611; PROLOG-NEXT:    %xtraiter = and i64 %0, 74612; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04613; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit4614; PROLOG:       innerH.prol.preheader:4615; PROLOG-NEXT:    br label %innerH.prol4616; PROLOG:       innerH.prol:4617; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]4618; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]4619; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 14620; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol4621; PROLOG:       latch.prol:4622; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 1004623; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 14624; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter4625; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !124626; PROLOG:       innerH.prol.loopexit.unr-lcssa:4627; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]4628; PROLOG-NEXT:    br label %innerH.prol.loopexit4629; PROLOG:       innerH.prol.loopexit:4630; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]4631; PROLOG-NEXT:    %2 = icmp ult i64 %1, 74632; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new4633; PROLOG:       outerloop.new:4634; PROLOG-NEXT:    br label %innerH4635; PROLOG:       innerH:4636; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]4637; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch4638; PROLOG:       latch:4639; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.14640; PROLOG:       latch.1:4641; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.24642; PROLOG:       latch.2:4643; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.34644; PROLOG:       latch.3:4645; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.44646; PROLOG:       latch.4:4647; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.54648; PROLOG:       latch.5:4649; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.64650; PROLOG:       latch.6:4651; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i3, 84652; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.74653; PROLOG:       latch.7:4654; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 1004655; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa4656; PROLOG:       exit.unr-lcssa:4657; PROLOG-NEXT:    br label %exit4658; PROLOG:       exit.loopexit:4659; PROLOG-NEXT:    br label %exit4660; PROLOG:       exit:4661; PROLOG-NEXT:    ret void4662;4663; PROLOG-BLOCK-LABEL: @test8(4664; PROLOG-BLOCK-NEXT:  bb:4665; PROLOG-BLOCK-NEXT:    br label %outerloop4666; PROLOG-BLOCK:       outerloop.loopexit.loopexit:4667; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit4668; PROLOG-BLOCK:       outerloop.loopexit:4669; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.14670; PROLOG-BLOCK:       innerH.prol.preheader.1:4671; PROLOG-BLOCK-NEXT:    br label %innerH.prol.14672; PROLOG-BLOCK:       innerH.prol.1:4673; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.14674; PROLOG-BLOCK:       latch.prol.1:4675; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.14676; PROLOG-BLOCK:       innerH.prol.loopexit.1:4677; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]4678; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.14679; PROLOG-BLOCK:       outerloop.new.1:4680; PROLOG-BLOCK-NEXT:    br label %innerH.14681; PROLOG-BLOCK:       innerH.1:4682; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]4683; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.114684; PROLOG-BLOCK:       latch.11:4685; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i3.1, 24686; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.14687; PROLOG-BLOCK:       latch.1.1:4688; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 1004689; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit2, !llvm.loop !124690; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:4691; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.14692; PROLOG-BLOCK:       outerloop.loopexit.1:4693; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !134694; PROLOG-BLOCK:       outerloop:4695; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]4696; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i4697; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i4698; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 14699; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 04700; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit4701; PROLOG-BLOCK:       innerH.prol.preheader:4702; PROLOG-BLOCK-NEXT:    br label %innerH.prol4703; PROLOG-BLOCK:       innerH.prol:4704; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 14705; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol4706; PROLOG-BLOCK:       latch.prol:4707; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit4708; PROLOG-BLOCK:       innerH.prol.loopexit:4709; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]4710; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 14711; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new4712; PROLOG-BLOCK:       outerloop.new:4713; PROLOG-BLOCK-NEXT:    br label %innerH4714; PROLOG-BLOCK:       innerH:4715; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]4716; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch4717; PROLOG-BLOCK:       latch:4718; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i3, 24719; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.14720; PROLOG-BLOCK:       latch.1:4721; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 1004722; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !124723; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:4724; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa4725; PROLOG-BLOCK:       exit.unr-lcssa.loopexit2:4726; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa4727; PROLOG-BLOCK:       exit.unr-lcssa:4728; PROLOG-BLOCK-NEXT:    br label %exit4729; PROLOG-BLOCK:       exit.loopexit:4730; PROLOG-BLOCK-NEXT:    br label %exit4731; PROLOG-BLOCK:       exit:4732; PROLOG-BLOCK-NEXT:    ret void4733;4734 4735bb:4736  br label %outerloop4737 4738outerloop:                                              ; preds = %innerH, %bb4739  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]4740  br label %innerH4741 4742innerH:                                              ; preds = %latch, %outerloop4743  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]4744  %i4 = add nuw nsw i64 %i3, 14745  br i1 false, label %outerloop, label %latch4746 4747latch:                                              ; preds = %innerH4748  %i6 = icmp ult i64 %i4, 1004749  br i1 %i6, label %innerH, label %exit4750 4751exit:                                              ; preds = %latch4752  ret void4753}4754 4755declare ptr addrspace(1) @foo(i32)4756; inner loop prolog unrolled4757; a value from outer loop is used in exit block of inner loop.4758; Don't create VMap entries for such values (%trip).4759define ptr addrspace(1) @test9(ptr nocapture readonly %arg, i32 %n) {4760; EPILOG-LABEL: @test9(4761; EPILOG-NEXT:  bb:4762; EPILOG-NEXT:    %0 = add i32 %n, -14763; EPILOG-NEXT:    br label %outerloopHdr4764; EPILOG:       outerloopHdr:4765; EPILOG-NEXT:    %trip = add i32 %n, -14766; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip4767; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch4768; EPILOG:       preheader:4769; EPILOG-NEXT:    %i4 = zext i32 0 to i644770; EPILOG-NEXT:    %1 = freeze i32 %04771; EPILOG-NEXT:    %2 = add i32 %1, -14772; EPILOG-NEXT:    %xtraiter = and i32 %1, 74773; EPILOG-NEXT:    %3 = icmp ult i32 %2, 74774; EPILOG-NEXT:    br i1 %3, label %header.epil.preheader, label %preheader.new4775; EPILOG:       preheader.new:4776; EPILOG-NEXT:    %unroll_iter = sub i32 %1, %xtraiter4777; EPILOG-NEXT:    br label %header4778; EPILOG:       header:4779; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]4780; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]4781; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit4782; EPILOG:       innerexit.loopexit:4783; EPILOG-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ]4784; EPILOG-NEXT:    br label %innerexit4785; EPILOG:       innerexit.loopexit2:4786; EPILOG-NEXT:    %trip.lcssa.ph3 = phi i32 [ %trip, %header.epil ]4787; EPILOG-NEXT:    br label %innerexit4788; EPILOG:       innerexit:4789; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph3, %innerexit.loopexit2 ]4790; EPILOG-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)4791; EPILOG-NEXT:    ret ptr addrspace(1) %i94792; EPILOG:       latch:4793; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit4794; EPILOG:       latch.1:4795; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit4796; EPILOG:       latch.2:4797; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit4798; EPILOG:       latch.3:4799; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit4800; EPILOG:       latch.4:4801; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit4802; EPILOG:       latch.5:4803; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit4804; EPILOG:       latch.6:4805; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit4806; EPILOG:       latch.7:4807; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %phi, 84808; EPILOG-NEXT:    %niter.next.7 = add i32 %niter, 84809; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter4810; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa4811; EPILOG:       outerLatch.loopexit.unr-lcssa:4812; EPILOG-NEXT:    %phi.unr = phi i64 [ %iv.next.7, %latch.7 ]4813; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 04814; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit4815; EPILOG:       header.epil.preheader:4816; EPILOG-NEXT:    %phi.epil.init = phi i64 [ %i4, %preheader ], [ %phi.unr, %outerLatch.loopexit.unr-lcssa ]4817; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i32 %xtraiter, 04818; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4819; EPILOG-NEXT:    br label %header.epil4820; EPILOG:       header.epil:4821; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.epil.init, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]4822; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]4823; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i324824; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit24825; EPILOG:       latch.epil:4826; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 14827; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip4828; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 14829; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 14830; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter4831; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !134832; EPILOG:       outerLatch.loopexit.epilog-lcssa:4833; EPILOG-NEXT:    br label %outerLatch.loopexit4834; EPILOG:       outerLatch.loopexit:4835; EPILOG-NEXT:    br label %outerLatch4836; EPILOG:       outerLatch:4837; EPILOG-NEXT:    br label %outerloopHdr4838;4839; EPILOG-BLOCK-LABEL: @test9(4840; EPILOG-BLOCK-NEXT:  bb:4841; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -14842; EPILOG-BLOCK-NEXT:    br label %outerloopHdr4843; EPILOG-BLOCK:       outerloopHdr:4844; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -14845; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip4846; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch4847; EPILOG-BLOCK:       preheader:4848; EPILOG-BLOCK-NEXT:    %1 = freeze i32 %04849; EPILOG-BLOCK-NEXT:    %2 = add i32 %1, -14850; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 14851; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 14852; EPILOG-BLOCK-NEXT:    br i1 %3, label %header.epil.preheader, label %preheader.new4853; EPILOG-BLOCK:       preheader.new:4854; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %1, %xtraiter4855; EPILOG-BLOCK-NEXT:    br label %header4856; EPILOG-BLOCK:       header:4857; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]4858; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]4859; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit4860; EPILOG-BLOCK:       innerexit.loopexit.loopexit:4861; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]4862; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit4863; EPILOG-BLOCK:       innerexit.loopexit.loopexit5:4864; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]4865; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit4866; EPILOG-BLOCK:       innerexit.loopexit:4867; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]4868; EPILOG-BLOCK-NEXT:    br label %innerexit4869; EPILOG-BLOCK:       innerexit.loopexit2:4870; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph3 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]4871; EPILOG-BLOCK-NEXT:    br label %innerexit4872; EPILOG-BLOCK:       innerexit:4873; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph3, %innerexit.loopexit2 ]4874; EPILOG-BLOCK-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)4875; EPILOG-BLOCK-NEXT:    ret ptr addrspace(1) %i94876; EPILOG-BLOCK:       latch:4877; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit4878; EPILOG-BLOCK:       latch.1:4879; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %phi, 24880; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter, 24881; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter4882; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !144883; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:4884; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 04885; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit4886; EPILOG-BLOCK:       header.epil.preheader:4887; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i32 %xtraiter, 04888; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)4889; EPILOG-BLOCK-NEXT:    br label %header.epil4890; EPILOG-BLOCK:       header.epil:4891; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit24892; EPILOG-BLOCK:       latch.epil:4893; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit4894; EPILOG-BLOCK:       outerLatch.loopexit:4895; EPILOG-BLOCK-NEXT:    br label %outerLatch4896; EPILOG-BLOCK:       outerLatch:4897; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -14898; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.14899; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.14900; EPILOG-BLOCK:       preheader.1:4901; EPILOG-BLOCK-NEXT:    %4 = freeze i32 %04902; EPILOG-BLOCK-NEXT:    %5 = add i32 %4, -14903; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 14904; EPILOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 14905; EPILOG-BLOCK-NEXT:    br i1 %6, label %header.epil.preheader.1, label %preheader.new.14906; EPILOG-BLOCK:       preheader.new.1:4907; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %4, %xtraiter.14908; EPILOG-BLOCK-NEXT:    br label %header.14909; EPILOG-BLOCK:       header.1:4910; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]4911; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]4912; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit54913; EPILOG-BLOCK:       latch.14:4914; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit54915; EPILOG-BLOCK:       latch.1.1:4916; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %phi.1, 24917; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.1, 24918; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.14919; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !144920; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:4921; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 04922; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.14923; EPILOG-BLOCK:       header.epil.preheader.1:4924; EPILOG-BLOCK-NEXT:    %lcmp.mod1.1 = icmp ne i32 %xtraiter.1, 04925; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1.1)4926; EPILOG-BLOCK-NEXT:    br label %header.epil.14927; EPILOG-BLOCK:       header.epil.1:4928; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit24929; EPILOG-BLOCK:       latch.epil.1:4930; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.14931; EPILOG-BLOCK:       outerLatch.loopexit.1:4932; EPILOG-BLOCK-NEXT:    br label %outerLatch.14933; EPILOG-BLOCK:       outerLatch.1:4934; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !154935;4936; PROLOG-LABEL: @test9(4937; PROLOG-NEXT:  bb:4938; PROLOG-NEXT:    %0 = add i32 %n, -14939; PROLOG-NEXT:    br label %outerloopHdr4940; PROLOG:       outerloopHdr:4941; PROLOG-NEXT:    %trip = add i32 %n, -14942; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip4943; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch4944; PROLOG:       preheader:4945; PROLOG-NEXT:    %i4 = zext i32 0 to i644946; PROLOG-NEXT:    %1 = freeze i32 %04947; PROLOG-NEXT:    %2 = add i32 %1, -14948; PROLOG-NEXT:    %xtraiter = and i32 %1, 74949; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 04950; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit4951; PROLOG:       header.prol.preheader:4952; PROLOG-NEXT:    br label %header.prol4953; PROLOG:       header.prol:4954; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]4955; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]4956; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i324957; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit14958; PROLOG:       latch.prol:4959; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 14960; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip4961; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 14962; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 14963; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter4964; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !134965; PROLOG:       header.prol.loopexit.unr-lcssa:4966; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]4967; PROLOG-NEXT:    br label %header.prol.loopexit4968; PROLOG:       header.prol.loopexit:4969; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]4970; PROLOG-NEXT:    %3 = icmp ult i32 %2, 74971; PROLOG-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new4972; PROLOG:       preheader.new:4973; PROLOG-NEXT:    br label %header4974; PROLOG:       header:4975; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]4976; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit4977; PROLOG:       innerexit.loopexit:4978; PROLOG-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ]4979; PROLOG-NEXT:    br label %innerexit4980; PROLOG:       innerexit.loopexit1:4981; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]4982; PROLOG-NEXT:    br label %innerexit4983; PROLOG:       innerexit:4984; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]4985; PROLOG-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)4986; PROLOG-NEXT:    ret ptr addrspace(1) %i94987; PROLOG:       latch:4988; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit4989; PROLOG:       latch.1:4990; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit4991; PROLOG:       latch.2:4992; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit4993; PROLOG:       latch.3:4994; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit4995; PROLOG:       latch.4:4996; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit4997; PROLOG:       latch.5:4998; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit4999; PROLOG:       latch.6:5000; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %phi, 75001; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i325002; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit5003; PROLOG:       latch.7:5004; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 15005; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip5006; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %phi, 85007; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa5008; PROLOG:       outerLatch.loopexit.unr-lcssa:5009; PROLOG-NEXT:    br label %outerLatch.loopexit5010; PROLOG:       outerLatch.loopexit:5011; PROLOG-NEXT:    br label %outerLatch5012; PROLOG:       outerLatch:5013; PROLOG-NEXT:    br label %outerloopHdr5014;5015; PROLOG-BLOCK-LABEL: @test9(5016; PROLOG-BLOCK-NEXT:  bb:5017; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -15018; PROLOG-BLOCK-NEXT:    br label %outerloopHdr5019; PROLOG-BLOCK:       outerloopHdr:5020; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -15021; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip5022; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch5023; PROLOG-BLOCK:       preheader:5024; PROLOG-BLOCK-NEXT:    %1 = freeze i32 %05025; PROLOG-BLOCK-NEXT:    %2 = add i32 %1, -15026; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 15027; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 05028; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit5029; PROLOG-BLOCK:       header.prol.preheader:5030; PROLOG-BLOCK-NEXT:    br label %header.prol5031; PROLOG-BLOCK:       header.prol:5032; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit15033; PROLOG-BLOCK:       latch.prol:5034; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit5035; PROLOG-BLOCK:       header.prol.loopexit:5036; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]5037; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 15038; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new5039; PROLOG-BLOCK:       preheader.new:5040; PROLOG-BLOCK-NEXT:    br label %header5041; PROLOG-BLOCK:       header:5042; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]5043; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit5044; PROLOG-BLOCK:       innerexit.loopexit.loopexit:5045; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]5046; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit5047; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:5048; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]5049; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit5050; PROLOG-BLOCK:       innerexit.loopexit:5051; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]5052; PROLOG-BLOCK-NEXT:    br label %innerexit5053; PROLOG-BLOCK:       innerexit.loopexit1:5054; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]5055; PROLOG-BLOCK-NEXT:    br label %innerexit5056; PROLOG-BLOCK:       innerexit:5057; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]5058; PROLOG-BLOCK-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)5059; PROLOG-BLOCK-NEXT:    ret ptr addrspace(1) %i95060; PROLOG-BLOCK:       latch:5061; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 15062; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i325063; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit5064; PROLOG-BLOCK:       latch.1:5065; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 15066; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip5067; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %phi, 25068; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !145069; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:5070; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit5071; PROLOG-BLOCK:       outerLatch.loopexit:5072; PROLOG-BLOCK-NEXT:    br label %outerLatch5073; PROLOG-BLOCK:       outerLatch:5074; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -15075; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.15076; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.15077; PROLOG-BLOCK:       preheader.1:5078; PROLOG-BLOCK-NEXT:    %4 = freeze i32 %05079; PROLOG-BLOCK-NEXT:    %5 = add i32 %4, -15080; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 15081; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 05082; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.15083; PROLOG-BLOCK:       header.prol.preheader.1:5084; PROLOG-BLOCK-NEXT:    br label %header.prol.15085; PROLOG-BLOCK:       header.prol.1:5086; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit15087; PROLOG-BLOCK:       latch.prol.1:5088; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.15089; PROLOG-BLOCK:       header.prol.loopexit.1:5090; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]5091; PROLOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 15092; PROLOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.15093; PROLOG-BLOCK:       preheader.new.1:5094; PROLOG-BLOCK-NEXT:    br label %header.15095; PROLOG-BLOCK:       header.1:5096; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]5097; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit55098; PROLOG-BLOCK:       latch.14:5099; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 15100; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i325101; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit55102; PROLOG-BLOCK:       latch.1.1:5103; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 15104; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.15105; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %phi.1, 25106; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !145107; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:5108; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.15109; PROLOG-BLOCK:       outerLatch.loopexit.1:5110; PROLOG-BLOCK-NEXT:    br label %outerLatch.15111; PROLOG-BLOCK:       outerLatch.1:5112; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !155113;5114bb:5115  br label %outerloopHdr5116 5117outerloopHdr:                                              ; preds = %outerLatch, %bb5118  %trip = add i32 %n, -15119  %outercnd = icmp slt i32 0, %trip5120  br i1 %outercnd, label %preheader, label %outerLatch5121 5122preheader:                                              ; preds = %outerloopHdr5123  %i4 = zext i32 0 to i645124  br label %header5125 5126header:                                              ; preds = %latch, %preheader5127  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]5128  %i7 = trunc i64 %phi to i325129  br i1 true, label %latch, label %innerexit5130 5131innerexit:                                              ; preds = %header5132  %i9 = call ptr addrspace(1) @foo(i32 %trip)5133  ret ptr addrspace(1) %i95134 5135latch:                                             ; preds = %header5136  %i11 = add nsw i32 %i7, 15137  %innercnd = icmp slt i32 %i11, %trip5138  %iv.next = add nuw nsw i64 %phi, 15139  br i1 %innercnd, label %header, label %outerLatch5140 5141outerLatch:                                             ; preds = %latch, %outerloopHdr5142  br label %outerloopHdr5143}5144 5145declare void @bar()5146 5147; This is a case where we should be able to eliminate N-1 copies5148; of the early exit test in the main loop when runtime unrolling5149; by N.5150define void @test10(i64 %trip, i64 %trip2) {5151; EPILOG-LABEL: @test10(5152; EPILOG-NEXT:  entry:5153; EPILOG-NEXT:    %0 = freeze i64 %trip5154; EPILOG-NEXT:    %1 = add i64 %0, -15155; EPILOG-NEXT:    %xtraiter = and i64 %0, 75156; EPILOG-NEXT:    %2 = icmp ult i64 %1, 75157; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5158; EPILOG:       entry.new:5159; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5160; EPILOG-NEXT:    br label %loop_header5161; EPILOG:       loop_header:5162; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5163; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]5164; EPILOG-NEXT:    call void @bar()5165; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25166; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit5167; EPILOG:       loop_latch:5168; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 15169; EPILOG-NEXT:    call void @bar()5170; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25171; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit5172; EPILOG:       loop_latch.1:5173; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 25174; EPILOG-NEXT:    call void @bar()5175; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip25176; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit5177; EPILOG:       loop_latch.2:5178; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 35179; EPILOG-NEXT:    call void @bar()5180; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip25181; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit5182; EPILOG:       loop_latch.3:5183; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 45184; EPILOG-NEXT:    call void @bar()5185; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip25186; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit5187; EPILOG:       loop_latch.4:5188; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 55189; EPILOG-NEXT:    call void @bar()5190; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip25191; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit5192; EPILOG:       loop_latch.5:5193; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 65194; EPILOG-NEXT:    call void @bar()5195; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip25196; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit5197; EPILOG:       loop_latch.6:5198; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 75199; EPILOG-NEXT:    call void @bar()5200; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip25201; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit5202; EPILOG:       loop_latch.7:5203; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 85204; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 85205; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter5206; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa5207; EPILOG:       exit1.loopexit:5208; EPILOG-NEXT:    br label %exit15209; EPILOG:       exit1.loopexit2:5210; EPILOG-NEXT:    br label %exit15211; EPILOG:       exit1:5212; EPILOG-NEXT:    ret void5213; EPILOG:       exit2.unr-lcssa:5214; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]5215; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05216; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit25217; EPILOG:       loop_header.epil.preheader:5218; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit2.unr-lcssa ]5219; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05220; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5221; EPILOG-NEXT:    br label %loop_header.epil5222; EPILOG:       loop_header.epil:5223; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]5224; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]5225; EPILOG-NEXT:    call void @bar()5226; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip25227; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit25228; EPILOG:       loop_latch.epil:5229; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 15230; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip5231; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 15232; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter5233; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !145234; EPILOG:       exit2.epilog-lcssa:5235; EPILOG-NEXT:    br label %exit25236; EPILOG:       exit2:5237; EPILOG-NEXT:    ret void5238;5239; EPILOG-BLOCK-LABEL: @test10(5240; EPILOG-BLOCK-NEXT:  entry:5241; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip5242; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -15243; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15244; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15245; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5246; EPILOG-BLOCK:       entry.new:5247; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5248; EPILOG-BLOCK-NEXT:    br label %loop_header5249; EPILOG-BLOCK:       loop_header:5250; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5251; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]5252; EPILOG-BLOCK-NEXT:    call void @bar()5253; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25254; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit5255; EPILOG-BLOCK:       loop_latch:5256; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 15257; EPILOG-BLOCK-NEXT:    call void @bar()5258; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25259; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit5260; EPILOG-BLOCK:       loop_latch.1:5261; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25262; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 25263; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter5264; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !165265; EPILOG-BLOCK:       exit1.loopexit:5266; EPILOG-BLOCK-NEXT:    br label %exit15267; EPILOG-BLOCK:       exit1:5268; EPILOG-BLOCK-NEXT:    ret void5269; EPILOG-BLOCK:       exit2.unr-lcssa:5270; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ %iv_next.1, %loop_latch.1 ]5271; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05272; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit25273; EPILOG-BLOCK:       loop_header.epil.preheader:5274; EPILOG-BLOCK-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit2.unr-lcssa ]5275; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05276; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5277; EPILOG-BLOCK-NEXT:    br label %loop_header.epil5278; EPILOG-BLOCK:       loop_header.epil:5279; EPILOG-BLOCK-NEXT:    call void @bar()5280; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil.init, %trip25281; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit15282; EPILOG-BLOCK:       loop_latch.epil:5283; EPILOG-BLOCK-NEXT:    br label %exit25284; EPILOG-BLOCK:       exit2:5285; EPILOG-BLOCK-NEXT:    ret void5286;5287; PROLOG-LABEL: @test10(5288; PROLOG-NEXT:  entry:5289; PROLOG-NEXT:    %0 = freeze i64 %trip5290; PROLOG-NEXT:    %1 = add i64 %0, -15291; PROLOG-NEXT:    %xtraiter = and i64 %0, 75292; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05293; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5294; PROLOG:       loop_header.prol.preheader:5295; PROLOG-NEXT:    br label %loop_header.prol5296; PROLOG:       loop_header.prol:5297; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]5298; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]5299; PROLOG-NEXT:    call void @bar()5300; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip25301; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit15302; PROLOG:       loop_latch.prol:5303; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 15304; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip5305; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 15306; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter5307; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !145308; PROLOG:       loop_header.prol.loopexit.unr-lcssa:5309; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]5310; PROLOG-NEXT:    br label %loop_header.prol.loopexit5311; PROLOG:       loop_header.prol.loopexit:5312; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]5313; PROLOG-NEXT:    %2 = icmp ult i64 %1, 75314; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new5315; PROLOG:       entry.new:5316; PROLOG-NEXT:    br label %loop_header5317; PROLOG:       loop_header:5318; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5319; PROLOG-NEXT:    call void @bar()5320; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25321; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit5322; PROLOG:       loop_latch:5323; PROLOG-NEXT:    %iv_next = add i64 %iv, 15324; PROLOG-NEXT:    call void @bar()5325; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25326; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit5327; PROLOG:       loop_latch.1:5328; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 25329; PROLOG-NEXT:    call void @bar()5330; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip25331; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit5332; PROLOG:       loop_latch.2:5333; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 35334; PROLOG-NEXT:    call void @bar()5335; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip25336; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit5337; PROLOG:       loop_latch.3:5338; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 45339; PROLOG-NEXT:    call void @bar()5340; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip25341; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit5342; PROLOG:       loop_latch.4:5343; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 55344; PROLOG-NEXT:    call void @bar()5345; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip25346; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit5347; PROLOG:       loop_latch.5:5348; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 65349; PROLOG-NEXT:    call void @bar()5350; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip25351; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit5352; PROLOG:       loop_latch.6:5353; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 75354; PROLOG-NEXT:    call void @bar()5355; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip25356; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit5357; PROLOG:       loop_latch.7:5358; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 85359; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip5360; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa5361; PROLOG:       exit1.loopexit:5362; PROLOG-NEXT:    br label %exit15363; PROLOG:       exit1.loopexit1:5364; PROLOG-NEXT:    br label %exit15365; PROLOG:       exit1:5366; PROLOG-NEXT:    ret void5367; PROLOG:       exit2.unr-lcssa:5368; PROLOG-NEXT:    br label %exit25369; PROLOG:       exit2:5370; PROLOG-NEXT:    ret void5371;5372; PROLOG-BLOCK-LABEL: @test10(5373; PROLOG-BLOCK-NEXT:  entry:5374; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip5375; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -15376; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15377; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05378; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5379; PROLOG-BLOCK:       loop_header.prol.preheader:5380; PROLOG-BLOCK-NEXT:    br label %loop_header.prol5381; PROLOG-BLOCK:       loop_header.prol:5382; PROLOG-BLOCK-NEXT:    call void @bar()5383; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip25384; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit15385; PROLOG-BLOCK:       loop_latch.prol:5386; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit5387; PROLOG-BLOCK:       loop_header.prol.loopexit:5388; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]5389; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15390; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new5391; PROLOG-BLOCK:       entry.new:5392; PROLOG-BLOCK-NEXT:    br label %loop_header5393; PROLOG-BLOCK:       loop_header:5394; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5395; PROLOG-BLOCK-NEXT:    call void @bar()5396; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25397; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit5398; PROLOG-BLOCK:       loop_latch:5399; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 15400; PROLOG-BLOCK-NEXT:    call void @bar()5401; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25402; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit5403; PROLOG-BLOCK:       loop_latch.1:5404; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25405; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip5406; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !165407; PROLOG-BLOCK:       exit1.loopexit:5408; PROLOG-BLOCK-NEXT:    br label %exit15409; PROLOG-BLOCK:       exit1:5410; PROLOG-BLOCK-NEXT:    ret void5411; PROLOG-BLOCK:       exit2.unr-lcssa:5412; PROLOG-BLOCK-NEXT:    br label %exit25413; PROLOG-BLOCK:       exit2:5414; PROLOG-BLOCK-NEXT:    ret void5415;5416entry:5417  br label %loop_header5418 5419loop_header:5420  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]5421  call void @bar()5422  %cmp_early = icmp ne i64 %iv, %trip25423  br i1 %cmp_early, label %loop_latch, label %exit15424 5425loop_latch:5426  %iv_next = add i64 %iv, 15427  %cmp = icmp ne i64 %iv_next, %trip5428  br i1 %cmp, label %loop_header, label %exit25429 5430exit1:5431  ret void5432 5433exit2:5434  ret void5435}5436 5437; With a loop invariant, we can eliminate the last N-15438; copies of the exit test in the unrolled main loop body.5439define void @test11(i64 %trip, i1 %cond) {5440; EPILOG-LABEL: @test11(5441; EPILOG-NEXT:  entry:5442; EPILOG-NEXT:    %0 = freeze i64 %trip5443; EPILOG-NEXT:    %1 = add i64 %0, -15444; EPILOG-NEXT:    %xtraiter = and i64 %0, 75445; EPILOG-NEXT:    %2 = icmp ult i64 %1, 75446; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5447; EPILOG:       entry.new:5448; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5449; EPILOG-NEXT:    br label %loop_header5450; EPILOG:       loop_header:5451; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5452; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]5453; EPILOG-NEXT:    call void @bar()5454; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit5455; EPILOG:       loop_latch:5456; EPILOG-NEXT:    call void @bar()5457; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit5458; EPILOG:       loop_latch.1:5459; EPILOG-NEXT:    call void @bar()5460; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit5461; EPILOG:       loop_latch.2:5462; EPILOG-NEXT:    call void @bar()5463; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit5464; EPILOG:       loop_latch.3:5465; EPILOG-NEXT:    call void @bar()5466; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit5467; EPILOG:       loop_latch.4:5468; EPILOG-NEXT:    call void @bar()5469; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit5470; EPILOG:       loop_latch.5:5471; EPILOG-NEXT:    call void @bar()5472; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit5473; EPILOG:       loop_latch.6:5474; EPILOG-NEXT:    call void @bar()5475; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit5476; EPILOG:       loop_latch.7:5477; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 85478; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 85479; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter5480; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa5481; EPILOG:       exit1.loopexit:5482; EPILOG-NEXT:    br label %exit15483; EPILOG:       exit1.loopexit2:5484; EPILOG-NEXT:    br label %exit15485; EPILOG:       exit1:5486; EPILOG-NEXT:    ret void5487; EPILOG:       exit2.unr-lcssa:5488; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]5489; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05490; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit25491; EPILOG:       loop_header.epil.preheader:5492; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit2.unr-lcssa ]5493; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05494; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5495; EPILOG-NEXT:    br label %loop_header.epil5496; EPILOG:       loop_header.epil:5497; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]5498; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]5499; EPILOG-NEXT:    call void @bar()5500; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit25501; EPILOG:       loop_latch.epil:5502; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 15503; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip5504; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 15505; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter5506; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !155507; EPILOG:       exit2.epilog-lcssa:5508; EPILOG-NEXT:    br label %exit25509; EPILOG:       exit2:5510; EPILOG-NEXT:    ret void5511;5512; EPILOG-BLOCK-LABEL: @test11(5513; EPILOG-BLOCK-NEXT:  entry:5514; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip5515; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -15516; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15517; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15518; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5519; EPILOG-BLOCK:       entry.new:5520; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5521; EPILOG-BLOCK-NEXT:    br label %loop_header5522; EPILOG-BLOCK:       loop_header:5523; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5524; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]5525; EPILOG-BLOCK-NEXT:    call void @bar()5526; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit5527; EPILOG-BLOCK:       loop_latch:5528; EPILOG-BLOCK-NEXT:    call void @bar()5529; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit5530; EPILOG-BLOCK:       loop_latch.1:5531; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25532; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 25533; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter5534; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !175535; EPILOG-BLOCK:       exit1.loopexit:5536; EPILOG-BLOCK-NEXT:    br label %exit15537; EPILOG-BLOCK:       exit1:5538; EPILOG-BLOCK-NEXT:    ret void5539; EPILOG-BLOCK:       exit2.unr-lcssa:5540; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05541; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit25542; EPILOG-BLOCK:       loop_header.epil.preheader:5543; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05544; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5545; EPILOG-BLOCK-NEXT:    br label %loop_header.epil5546; EPILOG-BLOCK:       loop_header.epil:5547; EPILOG-BLOCK-NEXT:    call void @bar()5548; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit15549; EPILOG-BLOCK:       loop_latch.epil:5550; EPILOG-BLOCK-NEXT:    br label %exit25551; EPILOG-BLOCK:       exit2:5552; EPILOG-BLOCK-NEXT:    ret void5553;5554; PROLOG-LABEL: @test11(5555; PROLOG-NEXT:  entry:5556; PROLOG-NEXT:    %0 = freeze i64 %trip5557; PROLOG-NEXT:    %1 = add i64 %0, -15558; PROLOG-NEXT:    %xtraiter = and i64 %0, 75559; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05560; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5561; PROLOG:       loop_header.prol.preheader:5562; PROLOG-NEXT:    br label %loop_header.prol5563; PROLOG:       loop_header.prol:5564; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]5565; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]5566; PROLOG-NEXT:    call void @bar()5567; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit15568; PROLOG:       loop_latch.prol:5569; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 15570; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip5571; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 15572; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter5573; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !155574; PROLOG:       loop_header.prol.loopexit.unr-lcssa:5575; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]5576; PROLOG-NEXT:    br label %loop_header.prol.loopexit5577; PROLOG:       loop_header.prol.loopexit:5578; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]5579; PROLOG-NEXT:    %2 = icmp ult i64 %1, 75580; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new5581; PROLOG:       entry.new:5582; PROLOG-NEXT:    br label %loop_header5583; PROLOG:       loop_header:5584; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5585; PROLOG-NEXT:    call void @bar()5586; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit5587; PROLOG:       loop_latch:5588; PROLOG-NEXT:    call void @bar()5589; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit5590; PROLOG:       loop_latch.1:5591; PROLOG-NEXT:    call void @bar()5592; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit5593; PROLOG:       loop_latch.2:5594; PROLOG-NEXT:    call void @bar()5595; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit5596; PROLOG:       loop_latch.3:5597; PROLOG-NEXT:    call void @bar()5598; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit5599; PROLOG:       loop_latch.4:5600; PROLOG-NEXT:    call void @bar()5601; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit5602; PROLOG:       loop_latch.5:5603; PROLOG-NEXT:    call void @bar()5604; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit5605; PROLOG:       loop_latch.6:5606; PROLOG-NEXT:    call void @bar()5607; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit5608; PROLOG:       loop_latch.7:5609; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 85610; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip5611; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa5612; PROLOG:       exit1.loopexit:5613; PROLOG-NEXT:    br label %exit15614; PROLOG:       exit1.loopexit1:5615; PROLOG-NEXT:    br label %exit15616; PROLOG:       exit1:5617; PROLOG-NEXT:    ret void5618; PROLOG:       exit2.unr-lcssa:5619; PROLOG-NEXT:    br label %exit25620; PROLOG:       exit2:5621; PROLOG-NEXT:    ret void5622;5623; PROLOG-BLOCK-LABEL: @test11(5624; PROLOG-BLOCK-NEXT:  entry:5625; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip5626; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -15627; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15628; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05629; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5630; PROLOG-BLOCK:       loop_header.prol.preheader:5631; PROLOG-BLOCK-NEXT:    br label %loop_header.prol5632; PROLOG-BLOCK:       loop_header.prol:5633; PROLOG-BLOCK-NEXT:    call void @bar()5634; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit15635; PROLOG-BLOCK:       loop_latch.prol:5636; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit5637; PROLOG-BLOCK:       loop_header.prol.loopexit:5638; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]5639; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15640; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new5641; PROLOG-BLOCK:       entry.new:5642; PROLOG-BLOCK-NEXT:    br label %loop_header5643; PROLOG-BLOCK:       loop_header:5644; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5645; PROLOG-BLOCK-NEXT:    call void @bar()5646; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit5647; PROLOG-BLOCK:       loop_latch:5648; PROLOG-BLOCK-NEXT:    call void @bar()5649; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit5650; PROLOG-BLOCK:       loop_latch.1:5651; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25652; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip5653; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !175654; PROLOG-BLOCK:       exit1.loopexit:5655; PROLOG-BLOCK-NEXT:    br label %exit15656; PROLOG-BLOCK:       exit1:5657; PROLOG-BLOCK-NEXT:    ret void5658; PROLOG-BLOCK:       exit2.unr-lcssa:5659; PROLOG-BLOCK-NEXT:    br label %exit25660; PROLOG-BLOCK:       exit2:5661; PROLOG-BLOCK-NEXT:    ret void5662;5663entry:5664  br label %loop_header5665 5666loop_header:5667  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]5668  call void @bar()5669  br i1 %cond, label %loop_latch, label %exit15670 5671loop_latch:5672  %iv_next = add i64 %iv, 15673  %cmp = icmp ne i64 %iv_next, %trip5674  br i1 %cmp, label %loop_header, label %exit25675 5676exit1:5677  ret void5678 5679exit2:5680  ret void5681}5682 5683; Combine a computeable and invariant test to make sure5684; the interaction of both doesn't do anything weird5685define void @test12(i64 %trip, i64 %trip2, i1 %cond) {5686; EPILOG-LABEL: @test12(5687; EPILOG-NEXT:  entry:5688; EPILOG-NEXT:    %0 = freeze i64 %trip5689; EPILOG-NEXT:    %1 = add i64 %0, -15690; EPILOG-NEXT:    %xtraiter = and i64 %0, 75691; EPILOG-NEXT:    %2 = icmp ult i64 %1, 75692; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5693; EPILOG:       entry.new:5694; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5695; EPILOG-NEXT:    br label %loop_header5696; EPILOG:       loop_header:5697; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5698; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]5699; EPILOG-NEXT:    call void @bar()5700; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25701; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit5702; EPILOG:       loop_exiting_bb2:5703; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit5704; EPILOG:       loop_latch:5705; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 15706; EPILOG-NEXT:    call void @bar()5707; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25708; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit5709; EPILOG:       loop_exiting_bb2.1:5710; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit5711; EPILOG:       loop_latch.1:5712; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 25713; EPILOG-NEXT:    call void @bar()5714; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip25715; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit5716; EPILOG:       loop_exiting_bb2.2:5717; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit5718; EPILOG:       loop_latch.2:5719; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 35720; EPILOG-NEXT:    call void @bar()5721; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip25722; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit5723; EPILOG:       loop_exiting_bb2.3:5724; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit5725; EPILOG:       loop_latch.3:5726; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 45727; EPILOG-NEXT:    call void @bar()5728; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip25729; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit5730; EPILOG:       loop_exiting_bb2.4:5731; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit5732; EPILOG:       loop_latch.4:5733; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 55734; EPILOG-NEXT:    call void @bar()5735; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip25736; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit5737; EPILOG:       loop_exiting_bb2.5:5738; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit5739; EPILOG:       loop_latch.5:5740; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 65741; EPILOG-NEXT:    call void @bar()5742; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip25743; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit5744; EPILOG:       loop_exiting_bb2.6:5745; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit5746; EPILOG:       loop_latch.6:5747; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 75748; EPILOG-NEXT:    call void @bar()5749; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip25750; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit5751; EPILOG:       loop_exiting_bb2.7:5752; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit5753; EPILOG:       loop_latch.7:5754; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 85755; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 85756; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter5757; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa5758; EPILOG:       exit1.unr-lcssa:5759; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]5760; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05761; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit15762; EPILOG:       loop_header.epil.preheader:5763; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit1.unr-lcssa ]5764; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05765; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5766; EPILOG-NEXT:    br label %loop_header.epil5767; EPILOG:       loop_header.epil:5768; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]5769; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]5770; EPILOG-NEXT:    call void @bar()5771; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip25772; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit25773; EPILOG:       loop_exiting_bb2.epil:5774; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit25775; EPILOG:       loop_latch.epil:5776; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 15777; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip5778; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 15779; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter5780; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit2, !llvm.loop !165781; EPILOG:       exit1.epilog-lcssa.loopexit:5782; EPILOG-NEXT:    br label %exit1.epilog-lcssa5783; EPILOG:       exit1.epilog-lcssa.loopexit2:5784; EPILOG-NEXT:    br label %exit1.epilog-lcssa5785; EPILOG:       exit1.epilog-lcssa:5786; EPILOG-NEXT:    br label %exit15787; EPILOG:       exit1:5788; EPILOG-NEXT:    ret void5789;5790; EPILOG-BLOCK-LABEL: @test12(5791; EPILOG-BLOCK-NEXT:  entry:5792; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip5793; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -15794; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15795; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15796; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new5797; EPILOG-BLOCK:       entry.new:5798; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter5799; EPILOG-BLOCK-NEXT:    br label %loop_header5800; EPILOG-BLOCK:       loop_header:5801; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5802; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]5803; EPILOG-BLOCK-NEXT:    call void @bar()5804; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25805; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit5806; EPILOG-BLOCK:       loop_exiting_bb2:5807; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit5808; EPILOG-BLOCK:       loop_latch:5809; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 15810; EPILOG-BLOCK-NEXT:    call void @bar()5811; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25812; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit5813; EPILOG-BLOCK:       loop_exiting_bb2.1:5814; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit5815; EPILOG-BLOCK:       loop_latch.1:5816; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25817; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 25818; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter5819; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa, !llvm.loop !185820; EPILOG-BLOCK:       exit1.unr-lcssa:5821; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ %iv_next.1, %loop_latch.1 ]5822; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05823; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit15824; EPILOG-BLOCK:       loop_header.epil.preheader:5825; EPILOG-BLOCK-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit1.unr-lcssa ]5826; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 05827; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)5828; EPILOG-BLOCK-NEXT:    br label %loop_header.epil5829; EPILOG-BLOCK:       loop_header.epil:5830; EPILOG-BLOCK-NEXT:    call void @bar()5831; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil.init, %trip25832; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa5833; EPILOG-BLOCK:       loop_exiting_bb2.epil:5834; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa5835; EPILOG-BLOCK:       loop_latch.epil:5836; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa5837; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:5838; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa5839; EPILOG-BLOCK:       exit1.epilog-lcssa:5840; EPILOG-BLOCK-NEXT:    br label %exit15841; EPILOG-BLOCK:       exit1:5842; EPILOG-BLOCK-NEXT:    ret void5843;5844; PROLOG-LABEL: @test12(5845; PROLOG-NEXT:  entry:5846; PROLOG-NEXT:    %0 = freeze i64 %trip5847; PROLOG-NEXT:    %1 = add i64 %0, -15848; PROLOG-NEXT:    %xtraiter = and i64 %0, 75849; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05850; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5851; PROLOG:       loop_header.prol.preheader:5852; PROLOG-NEXT:    br label %loop_header.prol5853; PROLOG:       loop_header.prol:5854; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]5855; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]5856; PROLOG-NEXT:    call void @bar()5857; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip25858; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit15859; PROLOG:       loop_exiting_bb2.prol:5860; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit15861; PROLOG:       loop_latch.prol:5862; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 15863; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip5864; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 15865; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter5866; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !165867; PROLOG:       loop_header.prol.loopexit.unr-lcssa:5868; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]5869; PROLOG-NEXT:    br label %loop_header.prol.loopexit5870; PROLOG:       loop_header.prol.loopexit:5871; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]5872; PROLOG-NEXT:    %2 = icmp ult i64 %1, 75873; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new5874; PROLOG:       entry.new:5875; PROLOG-NEXT:    br label %loop_header5876; PROLOG:       loop_header:5877; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]5878; PROLOG-NEXT:    call void @bar()5879; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25880; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit5881; PROLOG:       loop_exiting_bb2:5882; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit5883; PROLOG:       loop_latch:5884; PROLOG-NEXT:    %iv_next = add i64 %iv, 15885; PROLOG-NEXT:    call void @bar()5886; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25887; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit5888; PROLOG:       loop_exiting_bb2.1:5889; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit5890; PROLOG:       loop_latch.1:5891; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 25892; PROLOG-NEXT:    call void @bar()5893; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip25894; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit5895; PROLOG:       loop_exiting_bb2.2:5896; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit5897; PROLOG:       loop_latch.2:5898; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 35899; PROLOG-NEXT:    call void @bar()5900; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip25901; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit5902; PROLOG:       loop_exiting_bb2.3:5903; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit5904; PROLOG:       loop_latch.3:5905; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 45906; PROLOG-NEXT:    call void @bar()5907; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip25908; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit5909; PROLOG:       loop_exiting_bb2.4:5910; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit5911; PROLOG:       loop_latch.4:5912; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 55913; PROLOG-NEXT:    call void @bar()5914; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip25915; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit5916; PROLOG:       loop_exiting_bb2.5:5917; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit5918; PROLOG:       loop_latch.5:5919; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 65920; PROLOG-NEXT:    call void @bar()5921; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip25922; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit5923; PROLOG:       loop_exiting_bb2.6:5924; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit5925; PROLOG:       loop_latch.6:5926; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 75927; PROLOG-NEXT:    call void @bar()5928; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip25929; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit5930; PROLOG:       loop_exiting_bb2.7:5931; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit5932; PROLOG:       loop_latch.7:5933; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 85934; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip5935; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit5936; PROLOG:       exit1.unr-lcssa.loopexit:5937; PROLOG-NEXT:    br label %exit1.unr-lcssa5938; PROLOG:       exit1.unr-lcssa.loopexit1:5939; PROLOG-NEXT:    br label %exit1.unr-lcssa5940; PROLOG:       exit1.unr-lcssa:5941; PROLOG-NEXT:    br label %exit15942; PROLOG:       exit1:5943; PROLOG-NEXT:    ret void5944;5945; PROLOG-BLOCK-LABEL: @test12(5946; PROLOG-BLOCK-NEXT:  entry:5947; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip5948; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -15949; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 15950; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 05951; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit5952; PROLOG-BLOCK:       loop_header.prol.preheader:5953; PROLOG-BLOCK-NEXT:    br label %loop_header.prol5954; PROLOG-BLOCK:       loop_header.prol:5955; PROLOG-BLOCK-NEXT:    call void @bar()5956; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip25957; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa5958; PROLOG-BLOCK:       loop_exiting_bb2.prol:5959; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa5960; PROLOG-BLOCK:       loop_latch.prol:5961; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit5962; PROLOG-BLOCK:       loop_header.prol.loopexit:5963; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]5964; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 15965; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new5966; PROLOG-BLOCK:       entry.new:5967; PROLOG-BLOCK-NEXT:    br label %loop_header5968; PROLOG-BLOCK:       loop_header:5969; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]5970; PROLOG-BLOCK-NEXT:    call void @bar()5971; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip25972; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit5973; PROLOG-BLOCK:       loop_exiting_bb2:5974; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit5975; PROLOG-BLOCK:       loop_latch:5976; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 15977; PROLOG-BLOCK-NEXT:    call void @bar()5978; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip25979; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit5980; PROLOG-BLOCK:       loop_exiting_bb2.1:5981; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit5982; PROLOG-BLOCK:       loop_latch.1:5983; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 25984; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip5985; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !185986; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:5987; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa5988; PROLOG-BLOCK:       exit1.unr-lcssa:5989; PROLOG-BLOCK-NEXT:    br label %exit15990; PROLOG-BLOCK:       exit1:5991; PROLOG-BLOCK-NEXT:    ret void5992;5993entry:5994  br label %loop_header5995 5996loop_header:5997  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]5998  call void @bar()5999  %cmp_early = icmp ne i64 %iv, %trip26000  br i1 %cmp_early, label %loop_exiting_bb2, label %exit16001 6002loop_exiting_bb2:6003  br i1 %cond, label %loop_latch, label %exit16004 6005loop_latch:6006  %iv_next = add i64 %iv, 16007  %cmp = icmp ne i64 %iv_next, %trip6008  br i1 %cmp, label %loop_header, label %exit16009 6010exit1:6011  ret void6012}6013 6014declare i1 @unknown_cond()6015 6016; Mix of computable and uncompatable exits6017define void @test13(i64 %trip, i64 %trip2) {6018; EPILOG-LABEL: @test13(6019; EPILOG-NEXT:  entry:6020; EPILOG-NEXT:    %0 = freeze i64 %trip6021; EPILOG-NEXT:    %1 = add i64 %0, -16022; EPILOG-NEXT:    %xtraiter = and i64 %0, 76023; EPILOG-NEXT:    %2 = icmp ult i64 %1, 76024; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new6025; EPILOG:       entry.new:6026; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter6027; EPILOG-NEXT:    br label %loop_header6028; EPILOG:       loop_header:6029; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]6030; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]6031; EPILOG-NEXT:    call void @bar()6032; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip26033; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit6034; EPILOG:       loop_exiting_bb2:6035; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()6036; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit6037; EPILOG:       loop_latch:6038; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 16039; EPILOG-NEXT:    call void @bar()6040; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip26041; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit6042; EPILOG:       loop_exiting_bb2.1:6043; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()6044; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit6045; EPILOG:       loop_latch.1:6046; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 26047; EPILOG-NEXT:    call void @bar()6048; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip26049; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit6050; EPILOG:       loop_exiting_bb2.2:6051; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()6052; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit6053; EPILOG:       loop_latch.2:6054; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 36055; EPILOG-NEXT:    call void @bar()6056; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip26057; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit6058; EPILOG:       loop_exiting_bb2.3:6059; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()6060; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit6061; EPILOG:       loop_latch.3:6062; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 46063; EPILOG-NEXT:    call void @bar()6064; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip26065; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit6066; EPILOG:       loop_exiting_bb2.4:6067; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()6068; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit6069; EPILOG:       loop_latch.4:6070; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 56071; EPILOG-NEXT:    call void @bar()6072; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip26073; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit6074; EPILOG:       loop_exiting_bb2.5:6075; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()6076; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit6077; EPILOG:       loop_latch.5:6078; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 66079; EPILOG-NEXT:    call void @bar()6080; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip26081; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit6082; EPILOG:       loop_exiting_bb2.6:6083; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()6084; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit6085; EPILOG:       loop_latch.6:6086; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 76087; EPILOG-NEXT:    call void @bar()6088; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip26089; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit6090; EPILOG:       loop_exiting_bb2.7:6091; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()6092; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit6093; EPILOG:       loop_latch.7:6094; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 86095; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 86096; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter6097; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa6098; EPILOG:       exit1.unr-lcssa:6099; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]6100; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06101; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit16102; EPILOG:       loop_header.epil.preheader:6103; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit1.unr-lcssa ]6104; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 06105; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)6106; EPILOG-NEXT:    br label %loop_header.epil6107; EPILOG:       loop_header.epil:6108; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]6109; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]6110; EPILOG-NEXT:    call void @bar()6111; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip26112; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit26113; EPILOG:       loop_exiting_bb2.epil:6114; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()6115; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit26116; EPILOG:       loop_latch.epil:6117; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 16118; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip6119; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 16120; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter6121; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit2, !llvm.loop !176122; EPILOG:       exit1.epilog-lcssa.loopexit:6123; EPILOG-NEXT:    br label %exit1.epilog-lcssa6124; EPILOG:       exit1.epilog-lcssa.loopexit2:6125; EPILOG-NEXT:    br label %exit1.epilog-lcssa6126; EPILOG:       exit1.epilog-lcssa:6127; EPILOG-NEXT:    br label %exit16128; EPILOG:       exit1:6129; EPILOG-NEXT:    ret void6130;6131; EPILOG-BLOCK-LABEL: @test13(6132; EPILOG-BLOCK-NEXT:  entry:6133; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip6134; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -16135; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 16136; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 16137; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new6138; EPILOG-BLOCK:       entry.new:6139; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter6140; EPILOG-BLOCK-NEXT:    br label %loop_header6141; EPILOG-BLOCK:       loop_header:6142; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]6143; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]6144; EPILOG-BLOCK-NEXT:    call void @bar()6145; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip26146; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit6147; EPILOG-BLOCK:       loop_exiting_bb2:6148; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()6149; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit6150; EPILOG-BLOCK:       loop_latch:6151; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 16152; EPILOG-BLOCK-NEXT:    call void @bar()6153; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip26154; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit6155; EPILOG-BLOCK:       loop_exiting_bb2.1:6156; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()6157; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit6158; EPILOG-BLOCK:       loop_latch.1:6159; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 26160; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 26161; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter6162; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa, !llvm.loop !196163; EPILOG-BLOCK:       exit1.unr-lcssa:6164; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ %iv_next.1, %loop_latch.1 ]6165; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06166; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit16167; EPILOG-BLOCK:       loop_header.epil.preheader:6168; EPILOG-BLOCK-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit1.unr-lcssa ]6169; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 06170; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)6171; EPILOG-BLOCK-NEXT:    br label %loop_header.epil6172; EPILOG-BLOCK:       loop_header.epil:6173; EPILOG-BLOCK-NEXT:    call void @bar()6174; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil.init, %trip26175; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa6176; EPILOG-BLOCK:       loop_exiting_bb2.epil:6177; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()6178; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa6179; EPILOG-BLOCK:       loop_latch.epil:6180; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa6181; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:6182; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa6183; EPILOG-BLOCK:       exit1.epilog-lcssa:6184; EPILOG-BLOCK-NEXT:    br label %exit16185; EPILOG-BLOCK:       exit1:6186; EPILOG-BLOCK-NEXT:    ret void6187;6188; PROLOG-LABEL: @test13(6189; PROLOG-NEXT:  entry:6190; PROLOG-NEXT:    %0 = freeze i64 %trip6191; PROLOG-NEXT:    %1 = add i64 %0, -16192; PROLOG-NEXT:    %xtraiter = and i64 %0, 76193; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06194; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit6195; PROLOG:       loop_header.prol.preheader:6196; PROLOG-NEXT:    br label %loop_header.prol6197; PROLOG:       loop_header.prol:6198; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]6199; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]6200; PROLOG-NEXT:    call void @bar()6201; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip26202; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit16203; PROLOG:       loop_exiting_bb2.prol:6204; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()6205; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit16206; PROLOG:       loop_latch.prol:6207; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 16208; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip6209; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 16210; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter6211; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !176212; PROLOG:       loop_header.prol.loopexit.unr-lcssa:6213; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]6214; PROLOG-NEXT:    br label %loop_header.prol.loopexit6215; PROLOG:       loop_header.prol.loopexit:6216; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]6217; PROLOG-NEXT:    %2 = icmp ult i64 %1, 76218; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new6219; PROLOG:       entry.new:6220; PROLOG-NEXT:    br label %loop_header6221; PROLOG:       loop_header:6222; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]6223; PROLOG-NEXT:    call void @bar()6224; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip26225; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit6226; PROLOG:       loop_exiting_bb2:6227; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()6228; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit6229; PROLOG:       loop_latch:6230; PROLOG-NEXT:    %iv_next = add i64 %iv, 16231; PROLOG-NEXT:    call void @bar()6232; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip26233; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit6234; PROLOG:       loop_exiting_bb2.1:6235; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()6236; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit6237; PROLOG:       loop_latch.1:6238; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 26239; PROLOG-NEXT:    call void @bar()6240; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip26241; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit6242; PROLOG:       loop_exiting_bb2.2:6243; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()6244; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit6245; PROLOG:       loop_latch.2:6246; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 36247; PROLOG-NEXT:    call void @bar()6248; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip26249; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit6250; PROLOG:       loop_exiting_bb2.3:6251; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()6252; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit6253; PROLOG:       loop_latch.3:6254; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 46255; PROLOG-NEXT:    call void @bar()6256; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip26257; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit6258; PROLOG:       loop_exiting_bb2.4:6259; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()6260; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit6261; PROLOG:       loop_latch.4:6262; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 56263; PROLOG-NEXT:    call void @bar()6264; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip26265; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit6266; PROLOG:       loop_exiting_bb2.5:6267; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()6268; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit6269; PROLOG:       loop_latch.5:6270; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 66271; PROLOG-NEXT:    call void @bar()6272; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip26273; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit6274; PROLOG:       loop_exiting_bb2.6:6275; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()6276; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit6277; PROLOG:       loop_latch.6:6278; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 76279; PROLOG-NEXT:    call void @bar()6280; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip26281; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit6282; PROLOG:       loop_exiting_bb2.7:6283; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()6284; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit6285; PROLOG:       loop_latch.7:6286; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 86287; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip6288; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit6289; PROLOG:       exit1.unr-lcssa.loopexit:6290; PROLOG-NEXT:    br label %exit1.unr-lcssa6291; PROLOG:       exit1.unr-lcssa.loopexit1:6292; PROLOG-NEXT:    br label %exit1.unr-lcssa6293; PROLOG:       exit1.unr-lcssa:6294; PROLOG-NEXT:    br label %exit16295; PROLOG:       exit1:6296; PROLOG-NEXT:    ret void6297;6298; PROLOG-BLOCK-LABEL: @test13(6299; PROLOG-BLOCK-NEXT:  entry:6300; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip6301; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -16302; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 16303; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06304; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit6305; PROLOG-BLOCK:       loop_header.prol.preheader:6306; PROLOG-BLOCK-NEXT:    br label %loop_header.prol6307; PROLOG-BLOCK:       loop_header.prol:6308; PROLOG-BLOCK-NEXT:    call void @bar()6309; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip26310; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa6311; PROLOG-BLOCK:       loop_exiting_bb2.prol:6312; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()6313; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa6314; PROLOG-BLOCK:       loop_latch.prol:6315; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit6316; PROLOG-BLOCK:       loop_header.prol.loopexit:6317; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]6318; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 16319; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new6320; PROLOG-BLOCK:       entry.new:6321; PROLOG-BLOCK-NEXT:    br label %loop_header6322; PROLOG-BLOCK:       loop_header:6323; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]6324; PROLOG-BLOCK-NEXT:    call void @bar()6325; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip26326; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit6327; PROLOG-BLOCK:       loop_exiting_bb2:6328; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()6329; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit6330; PROLOG-BLOCK:       loop_latch:6331; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 16332; PROLOG-BLOCK-NEXT:    call void @bar()6333; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip26334; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit6335; PROLOG-BLOCK:       loop_exiting_bb2.1:6336; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()6337; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit6338; PROLOG-BLOCK:       loop_latch.1:6339; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 26340; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip6341; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !196342; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:6343; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa6344; PROLOG-BLOCK:       exit1.unr-lcssa:6345; PROLOG-BLOCK-NEXT:    br label %exit16346; PROLOG-BLOCK:       exit1:6347; PROLOG-BLOCK-NEXT:    ret void6348;6349entry:6350  br label %loop_header6351 6352loop_header:6353  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]6354  call void @bar()6355  %cmp_early = icmp ne i64 %iv, %trip26356  br i1 %cmp_early, label %loop_exiting_bb2, label %exit16357 6358loop_exiting_bb2:6359  %unknown = call i1 @unknown_cond()6360  br i1 %unknown, label %loop_latch, label %exit16361 6362loop_latch:6363  %iv_next = add i64 %iv, 16364  %cmp = icmp ne i64 %iv_next, %trip6365  br i1 %cmp, label %loop_header, label %exit16366 6367exit1:6368  ret void6369}6370 6371; Mix of invariant and (even in theory) uncomputable exits6372define void @test14(i64 %trip, i1 %cond) {6373; EPILOG-LABEL: @test14(6374; EPILOG-NEXT:  entry:6375; EPILOG-NEXT:    %0 = freeze i64 %trip6376; EPILOG-NEXT:    %1 = add i64 %0, -16377; EPILOG-NEXT:    %xtraiter = and i64 %0, 76378; EPILOG-NEXT:    %2 = icmp ult i64 %1, 76379; EPILOG-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new6380; EPILOG:       entry.new:6381; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter6382; EPILOG-NEXT:    br label %loop_header6383; EPILOG:       loop_header:6384; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]6385; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]6386; EPILOG-NEXT:    call void @bar()6387; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit6388; EPILOG:       loop_exiting_bb2:6389; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()6390; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit6391; EPILOG:       loop_latch:6392; EPILOG-NEXT:    call void @bar()6393; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit6394; EPILOG:       loop_exiting_bb2.1:6395; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()6396; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit6397; EPILOG:       loop_latch.1:6398; EPILOG-NEXT:    call void @bar()6399; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit6400; EPILOG:       loop_exiting_bb2.2:6401; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()6402; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit6403; EPILOG:       loop_latch.2:6404; EPILOG-NEXT:    call void @bar()6405; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit6406; EPILOG:       loop_exiting_bb2.3:6407; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()6408; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit6409; EPILOG:       loop_latch.3:6410; EPILOG-NEXT:    call void @bar()6411; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit6412; EPILOG:       loop_exiting_bb2.4:6413; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()6414; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit6415; EPILOG:       loop_latch.4:6416; EPILOG-NEXT:    call void @bar()6417; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit6418; EPILOG:       loop_exiting_bb2.5:6419; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()6420; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit6421; EPILOG:       loop_latch.5:6422; EPILOG-NEXT:    call void @bar()6423; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit6424; EPILOG:       loop_exiting_bb2.6:6425; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()6426; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit6427; EPILOG:       loop_latch.6:6428; EPILOG-NEXT:    call void @bar()6429; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit6430; EPILOG:       loop_exiting_bb2.7:6431; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()6432; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit6433; EPILOG:       loop_latch.7:6434; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 86435; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 86436; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter6437; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa6438; EPILOG:       exit1.unr-lcssa:6439; EPILOG-NEXT:    %iv.unr = phi i64 [ %iv_next.7, %loop_latch.7 ]6440; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06441; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit16442; EPILOG:       loop_header.epil.preheader:6443; EPILOG-NEXT:    %iv.epil.init = phi i64 [ 0, %entry ], [ %iv.unr, %exit1.unr-lcssa ]6444; EPILOG-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 06445; EPILOG-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)6446; EPILOG-NEXT:    br label %loop_header.epil6447; EPILOG:       loop_header.epil:6448; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.epil.init, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]6449; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]6450; EPILOG-NEXT:    call void @bar()6451; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit26452; EPILOG:       loop_exiting_bb2.epil:6453; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()6454; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit26455; EPILOG:       loop_latch.epil:6456; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 16457; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip6458; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 16459; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter6460; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit2, !llvm.loop !186461; EPILOG:       exit1.epilog-lcssa.loopexit:6462; EPILOG-NEXT:    br label %exit1.epilog-lcssa6463; EPILOG:       exit1.epilog-lcssa.loopexit2:6464; EPILOG-NEXT:    br label %exit1.epilog-lcssa6465; EPILOG:       exit1.epilog-lcssa:6466; EPILOG-NEXT:    br label %exit16467; EPILOG:       exit1:6468; EPILOG-NEXT:    ret void6469;6470; EPILOG-BLOCK-LABEL: @test14(6471; EPILOG-BLOCK-NEXT:  entry:6472; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip6473; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -16474; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 16475; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 16476; EPILOG-BLOCK-NEXT:    br i1 %2, label %loop_header.epil.preheader, label %entry.new6477; EPILOG-BLOCK:       entry.new:6478; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter6479; EPILOG-BLOCK-NEXT:    br label %loop_header6480; EPILOG-BLOCK:       loop_header:6481; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]6482; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]6483; EPILOG-BLOCK-NEXT:    call void @bar()6484; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit6485; EPILOG-BLOCK:       loop_exiting_bb2:6486; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()6487; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit6488; EPILOG-BLOCK:       loop_latch:6489; EPILOG-BLOCK-NEXT:    call void @bar()6490; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit6491; EPILOG-BLOCK:       loop_exiting_bb2.1:6492; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()6493; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit6494; EPILOG-BLOCK:       loop_latch.1:6495; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 26496; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 26497; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter6498; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa, !llvm.loop !206499; EPILOG-BLOCK:       exit1.unr-lcssa:6500; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06501; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit16502; EPILOG-BLOCK:       loop_header.epil.preheader:6503; EPILOG-BLOCK-NEXT:    %lcmp.mod1 = icmp ne i64 %xtraiter, 06504; EPILOG-BLOCK-NEXT:    call void @llvm.assume(i1 %lcmp.mod1)6505; EPILOG-BLOCK-NEXT:    br label %loop_header.epil6506; EPILOG-BLOCK:       loop_header.epil:6507; EPILOG-BLOCK-NEXT:    call void @bar()6508; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa6509; EPILOG-BLOCK:       loop_exiting_bb2.epil:6510; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()6511; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa6512; EPILOG-BLOCK:       loop_latch.epil:6513; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa6514; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:6515; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa6516; EPILOG-BLOCK:       exit1.epilog-lcssa:6517; EPILOG-BLOCK-NEXT:    br label %exit16518; EPILOG-BLOCK:       exit1:6519; EPILOG-BLOCK-NEXT:    ret void6520;6521; PROLOG-LABEL: @test14(6522; PROLOG-NEXT:  entry:6523; PROLOG-NEXT:    %0 = freeze i64 %trip6524; PROLOG-NEXT:    %1 = add i64 %0, -16525; PROLOG-NEXT:    %xtraiter = and i64 %0, 76526; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06527; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit6528; PROLOG:       loop_header.prol.preheader:6529; PROLOG-NEXT:    br label %loop_header.prol6530; PROLOG:       loop_header.prol:6531; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]6532; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]6533; PROLOG-NEXT:    call void @bar()6534; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit16535; PROLOG:       loop_exiting_bb2.prol:6536; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()6537; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit16538; PROLOG:       loop_latch.prol:6539; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 16540; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip6541; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 16542; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter6543; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !186544; PROLOG:       loop_header.prol.loopexit.unr-lcssa:6545; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]6546; PROLOG-NEXT:    br label %loop_header.prol.loopexit6547; PROLOG:       loop_header.prol.loopexit:6548; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]6549; PROLOG-NEXT:    %2 = icmp ult i64 %1, 76550; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new6551; PROLOG:       entry.new:6552; PROLOG-NEXT:    br label %loop_header6553; PROLOG:       loop_header:6554; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]6555; PROLOG-NEXT:    call void @bar()6556; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit6557; PROLOG:       loop_exiting_bb2:6558; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()6559; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit6560; PROLOG:       loop_latch:6561; PROLOG-NEXT:    call void @bar()6562; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit6563; PROLOG:       loop_exiting_bb2.1:6564; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()6565; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit6566; PROLOG:       loop_latch.1:6567; PROLOG-NEXT:    call void @bar()6568; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit6569; PROLOG:       loop_exiting_bb2.2:6570; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()6571; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit6572; PROLOG:       loop_latch.2:6573; PROLOG-NEXT:    call void @bar()6574; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit6575; PROLOG:       loop_exiting_bb2.3:6576; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()6577; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit6578; PROLOG:       loop_latch.3:6579; PROLOG-NEXT:    call void @bar()6580; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit6581; PROLOG:       loop_exiting_bb2.4:6582; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()6583; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit6584; PROLOG:       loop_latch.4:6585; PROLOG-NEXT:    call void @bar()6586; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit6587; PROLOG:       loop_exiting_bb2.5:6588; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()6589; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit6590; PROLOG:       loop_latch.5:6591; PROLOG-NEXT:    call void @bar()6592; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit6593; PROLOG:       loop_exiting_bb2.6:6594; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()6595; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit6596; PROLOG:       loop_latch.6:6597; PROLOG-NEXT:    call void @bar()6598; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit6599; PROLOG:       loop_exiting_bb2.7:6600; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()6601; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit6602; PROLOG:       loop_latch.7:6603; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 86604; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip6605; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit6606; PROLOG:       exit1.unr-lcssa.loopexit:6607; PROLOG-NEXT:    br label %exit1.unr-lcssa6608; PROLOG:       exit1.unr-lcssa.loopexit1:6609; PROLOG-NEXT:    br label %exit1.unr-lcssa6610; PROLOG:       exit1.unr-lcssa:6611; PROLOG-NEXT:    br label %exit16612; PROLOG:       exit1:6613; PROLOG-NEXT:    ret void6614;6615; PROLOG-BLOCK-LABEL: @test14(6616; PROLOG-BLOCK-NEXT:  entry:6617; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip6618; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -16619; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 16620; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 06621; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit6622; PROLOG-BLOCK:       loop_header.prol.preheader:6623; PROLOG-BLOCK-NEXT:    br label %loop_header.prol6624; PROLOG-BLOCK:       loop_header.prol:6625; PROLOG-BLOCK-NEXT:    call void @bar()6626; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa6627; PROLOG-BLOCK:       loop_exiting_bb2.prol:6628; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()6629; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa6630; PROLOG-BLOCK:       loop_latch.prol:6631; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit6632; PROLOG-BLOCK:       loop_header.prol.loopexit:6633; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]6634; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 16635; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new6636; PROLOG-BLOCK:       entry.new:6637; PROLOG-BLOCK-NEXT:    br label %loop_header6638; PROLOG-BLOCK:       loop_header:6639; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]6640; PROLOG-BLOCK-NEXT:    call void @bar()6641; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit6642; PROLOG-BLOCK:       loop_exiting_bb2:6643; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()6644; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit6645; PROLOG-BLOCK:       loop_latch:6646; PROLOG-BLOCK-NEXT:    call void @bar()6647; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit6648; PROLOG-BLOCK:       loop_exiting_bb2.1:6649; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()6650; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit6651; PROLOG-BLOCK:       loop_latch.1:6652; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 26653; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip6654; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !206655; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:6656; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa6657; PROLOG-BLOCK:       exit1.unr-lcssa:6658; PROLOG-BLOCK-NEXT:    br label %exit16659; PROLOG-BLOCK:       exit1:6660; PROLOG-BLOCK-NEXT:    ret void6661;6662entry:6663  br label %loop_header6664 6665loop_header:6666  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]6667  call void @bar()6668  br i1 %cond, label %loop_exiting_bb2, label %exit16669 6670loop_exiting_bb2:6671  %unknown = call i1 @unknown_cond()6672  br i1 %unknown, label %loop_latch, label %exit16673 6674loop_latch:6675  %iv_next = add i64 %iv, 16676  %cmp = icmp ne i64 %iv_next, %trip6677  br i1 %cmp, label %loop_header, label %exit16678 6679exit1:6680  ret void6681}6682