1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p 2; RUN: opt < %s -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,EPILOG-NO-IC 3; RUN: opt < %s -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,EPILOG 4; RUN: opt < %s -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-BLOCK 5; RUN: opt < %s -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,PROLOG 6; RUN: opt < %s -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-BLOCK 7 8; REQUIRES: asserts 9 10; test with three exiting and three exit blocks. 11; none of the exit blocks have successors 12define void @test1(i64 %trip, i1 %cond) { 13; EPILOG-NO-IC-LABEL: @test1( 14; EPILOG-NO-IC-NEXT: entry: 15; EPILOG-NO-IC-NEXT: %0 = add i64 %trip, -1 16; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %trip, 7 17; EPILOG-NO-IC-NEXT: %1 = icmp ult i64 %0, 7 18; EPILOG-NO-IC-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 19; EPILOG-NO-IC: entry.new: 20; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 21; EPILOG-NO-IC-NEXT: br label %loop_header 22; EPILOG-NO-IC: loop_header: 23; EPILOG-NO-IC-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 24; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 25; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 26; EPILOG-NO-IC: loop_exiting_bb1: 27; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 28; EPILOG-NO-IC: loop_exiting_bb2: 29; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 30; EPILOG-NO-IC: exit3.loopexit: 31; EPILOG-NO-IC-NEXT: br label %exit3 32; EPILOG-NO-IC: exit3.loopexit2: 33; EPILOG-NO-IC-NEXT: br label %exit3 34; EPILOG-NO-IC: exit3: 35; EPILOG-NO-IC-NEXT: ret void 36; EPILOG-NO-IC: loop_latch: 37; EPILOG-NO-IC-NEXT: %iv_next = add nuw nsw i64 %iv, 1 38; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 39; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 40; EPILOG-NO-IC: exit1.loopexit: 41; EPILOG-NO-IC-NEXT: br label %exit1 42; EPILOG-NO-IC: exit1.loopexit1: 43; EPILOG-NO-IC-NEXT: br label %exit1 44; EPILOG-NO-IC: exit1: 45; EPILOG-NO-IC-NEXT: ret void 46; EPILOG-NO-IC: exit2.loopexit.unr-lcssa.loopexit: 47; EPILOG-NO-IC-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 48; EPILOG-NO-IC-NEXT: br label %exit2.loopexit.unr-lcssa 49; EPILOG-NO-IC: exit2.loopexit.unr-lcssa: 50; EPILOG-NO-IC-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 51; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 52; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 53; EPILOG-NO-IC: loop_header.epil.preheader: 54; EPILOG-NO-IC-NEXT: br label %loop_header.epil 55; EPILOG-NO-IC: loop_header.epil: 56; EPILOG-NO-IC-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 57; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 58; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 59; EPILOG-NO-IC: loop_exiting_bb1.epil: 60; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1 61; EPILOG-NO-IC: loop_exiting_bb2.epil: 62; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.epil, label %exit3.loopexit2 63; EPILOG-NO-IC: loop_latch.epil: 64; EPILOG-NO-IC-NEXT: %iv_next.epil = add i64 %iv.epil, 1 65; EPILOG-NO-IC-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 66; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 67; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 68; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0 69; EPILOG-NO-IC: exit2.loopexit.epilog-lcssa: 70; EPILOG-NO-IC-NEXT: br label %exit2.loopexit 71; EPILOG-NO-IC: exit2.loopexit: 72; EPILOG-NO-IC-NEXT: ret void 73; EPILOG-NO-IC: loop_exiting_bb1.1: 74; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 75; EPILOG-NO-IC: loop_exiting_bb2.1: 76; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 77; EPILOG-NO-IC: loop_latch.1: 78; EPILOG-NO-IC-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 79; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 80; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 81; EPILOG-NO-IC: loop_exiting_bb1.2: 82; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 83; EPILOG-NO-IC: loop_exiting_bb2.2: 84; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 85; EPILOG-NO-IC: loop_latch.2: 86; EPILOG-NO-IC-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 87; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 88; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 89; EPILOG-NO-IC: loop_exiting_bb1.3: 90; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 91; EPILOG-NO-IC: loop_exiting_bb2.3: 92; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 93; EPILOG-NO-IC: loop_latch.3: 94; EPILOG-NO-IC-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 95; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 96; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 97; EPILOG-NO-IC: loop_exiting_bb1.4: 98; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 99; EPILOG-NO-IC: loop_exiting_bb2.4: 100; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 101; EPILOG-NO-IC: loop_latch.4: 102; EPILOG-NO-IC-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 103; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 104; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 105; EPILOG-NO-IC: loop_exiting_bb1.5: 106; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 107; EPILOG-NO-IC: loop_exiting_bb2.5: 108; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 109; EPILOG-NO-IC: loop_latch.5: 110; EPILOG-NO-IC-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 111; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 112; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 113; EPILOG-NO-IC: loop_exiting_bb1.6: 114; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 115; EPILOG-NO-IC: loop_exiting_bb2.6: 116; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 117; EPILOG-NO-IC: loop_latch.6: 118; EPILOG-NO-IC-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 119; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 120; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 121; EPILOG-NO-IC: loop_exiting_bb1.7: 122; EPILOG-NO-IC-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 123; EPILOG-NO-IC: loop_exiting_bb2.7: 124; EPILOG-NO-IC-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 125; EPILOG-NO-IC: loop_latch.7: 126; EPILOG-NO-IC-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 127; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 128; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 129; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 130; 131; EPILOG-LABEL: @test1( 132; EPILOG-NEXT: entry: 133; EPILOG-NEXT: %0 = add i64 %trip, -1 134; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 135; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 136; EPILOG-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 137; EPILOG: entry.new: 138; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 139; EPILOG-NEXT: br label %loop_header 140; EPILOG: loop_header: 141; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 142; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 143; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 144; EPILOG: loop_exiting_bb1: 145; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 146; EPILOG: loop_exiting_bb2: 147; EPILOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 148; EPILOG: exit3.loopexit: 149; EPILOG-NEXT: br label %exit3 150; EPILOG: exit3.loopexit2: 151; EPILOG-NEXT: br label %exit3 152; EPILOG: exit3: 153; EPILOG-NEXT: ret void 154; EPILOG: loop_latch: 155; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 156; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 157; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 158; EPILOG: exit1.loopexit: 159; EPILOG-NEXT: br label %exit1 160; EPILOG: exit1.loopexit1: 161; EPILOG-NEXT: br label %exit1 162; EPILOG: exit1: 163; EPILOG-NEXT: ret void 164; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 165; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 166; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 167; EPILOG: exit2.loopexit.unr-lcssa: 168; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 169; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 170; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 171; EPILOG: loop_header.epil.preheader: 172; EPILOG-NEXT: br label %loop_header.epil 173; EPILOG: loop_header.epil: 174; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 175; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 176; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 177; EPILOG: loop_exiting_bb1.epil: 178; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1 179; EPILOG: loop_exiting_bb2.epil: 180; EPILOG-NEXT: br i1 false, label %loop_latch.epil, label %exit3.loopexit2 181; EPILOG: loop_latch.epil: 182; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 183; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 184; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 185; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 186; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0 187; EPILOG: exit2.loopexit.epilog-lcssa: 188; EPILOG-NEXT: br label %exit2.loopexit 189; EPILOG: exit2.loopexit: 190; EPILOG-NEXT: ret void 191; EPILOG: loop_exiting_bb1.1: 192; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 193; EPILOG: loop_exiting_bb2.1: 194; EPILOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 195; EPILOG: loop_latch.1: 196; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 197; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 198; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 199; EPILOG: loop_exiting_bb1.2: 200; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 201; EPILOG: loop_exiting_bb2.2: 202; EPILOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 203; EPILOG: loop_latch.2: 204; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 205; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 206; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 207; EPILOG: loop_exiting_bb1.3: 208; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 209; EPILOG: loop_exiting_bb2.3: 210; EPILOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 211; EPILOG: loop_latch.3: 212; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 213; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 214; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 215; EPILOG: loop_exiting_bb1.4: 216; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 217; EPILOG: loop_exiting_bb2.4: 218; EPILOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 219; EPILOG: loop_latch.4: 220; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 221; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 222; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 223; EPILOG: loop_exiting_bb1.5: 224; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 225; EPILOG: loop_exiting_bb2.5: 226; EPILOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 227; EPILOG: loop_latch.5: 228; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 229; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 230; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 231; EPILOG: loop_exiting_bb1.6: 232; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 233; EPILOG: loop_exiting_bb2.6: 234; EPILOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 235; EPILOG: loop_latch.6: 236; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 237; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 238; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 239; EPILOG: loop_exiting_bb1.7: 240; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 241; EPILOG: loop_exiting_bb2.7: 242; EPILOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 243; EPILOG: loop_latch.7: 244; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 245; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 246; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 247; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 248; 249; EPILOG-BLOCK-LABEL: @test1( 250; EPILOG-BLOCK-NEXT: entry: 251; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 252; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 253; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 254; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 255; EPILOG-BLOCK: entry.new: 256; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 257; EPILOG-BLOCK-NEXT: br label %loop_header 258; EPILOG-BLOCK: loop_header: 259; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 260; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ] 261; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 262; EPILOG-BLOCK: loop_exiting_bb1: 263; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 264; EPILOG-BLOCK: loop_exiting_bb2: 265; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 266; EPILOG-BLOCK: exit3.loopexit: 267; EPILOG-BLOCK-NEXT: br label %exit3 268; EPILOG-BLOCK: exit3: 269; EPILOG-BLOCK-NEXT: ret void 270; EPILOG-BLOCK: loop_latch: 271; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 272; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 273; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 274; EPILOG-BLOCK: exit1.loopexit: 275; EPILOG-BLOCK-NEXT: br label %exit1 276; EPILOG-BLOCK: exit1: 277; EPILOG-BLOCK-NEXT: ret void 278; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 279; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 280; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 281; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 282; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 283; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 284; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 285; EPILOG-BLOCK: loop_header.epil.preheader: 286; EPILOG-BLOCK-NEXT: br label %loop_header.epil 287; EPILOG-BLOCK: loop_header.epil: 288; EPILOG-BLOCK-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ] 289; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 290; EPILOG-BLOCK: loop_exiting_bb1.epil: 291; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1 292; EPILOG-BLOCK: loop_exiting_bb2.epil: 293; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.epil, label %exit3 294; EPILOG-BLOCK: loop_latch.epil: 295; EPILOG-BLOCK-NEXT: %iv_next.epil = add i64 %iv.epil, 1 296; EPILOG-BLOCK-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 297; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.epilog-lcssa 298; EPILOG-BLOCK: exit2.loopexit.epilog-lcssa: 299; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 300; EPILOG-BLOCK: exit2.loopexit: 301; EPILOG-BLOCK-NEXT: ret void 302; EPILOG-BLOCK: loop_exiting_bb1.1: 303; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 304; EPILOG-BLOCK: loop_exiting_bb2.1: 305; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 306; EPILOG-BLOCK: loop_latch.1: 307; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 308; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 309; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 310; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0 311; 312; PROLOG-LABEL: @test1( 313; PROLOG-NEXT: entry: 314; PROLOG-NEXT: %0 = add i64 %trip, -1 315; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 316; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 317; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 318; PROLOG: loop_header.prol.preheader: 319; PROLOG-NEXT: br label %loop_header.prol 320; PROLOG: loop_header.prol: 321; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 322; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ] 323; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 324; PROLOG: loop_exiting_bb1.prol: 325; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1 326; PROLOG: loop_exiting_bb2.prol: 327; PROLOG-NEXT: br i1 false, label %loop_latch.prol, label %exit3.loopexit2 328; PROLOG: loop_latch.prol: 329; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 330; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 331; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 332; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 333; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0 334; PROLOG: loop_header.prol.loopexit.unr-lcssa: 335; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 336; PROLOG-NEXT: br label %loop_header.prol.loopexit 337; PROLOG: loop_header.prol.loopexit: 338; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 339; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 340; PROLOG-NEXT: br i1 %1, label %exit2.loopexit, label %entry.new 341; PROLOG: entry.new: 342; PROLOG-NEXT: br label %loop_header 343; PROLOG: loop_header: 344; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 345; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 346; PROLOG: loop_exiting_bb1: 347; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 348; PROLOG: loop_exiting_bb2: 349; PROLOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 350; PROLOG: exit3.loopexit: 351; PROLOG-NEXT: br label %exit3 352; PROLOG: exit3.loopexit2: 353; PROLOG-NEXT: br label %exit3 354; PROLOG: exit3: 355; PROLOG-NEXT: ret void 356; PROLOG: loop_latch: 357; PROLOG-NEXT: %iv_next = add i64 %iv, 1 358; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 359; PROLOG: exit1.loopexit: 360; PROLOG-NEXT: br label %exit1 361; PROLOG: exit1.loopexit1: 362; PROLOG-NEXT: br label %exit1 363; PROLOG: exit1: 364; PROLOG-NEXT: ret void 365; PROLOG: exit2.loopexit.unr-lcssa: 366; PROLOG-NEXT: br label %exit2.loopexit 367; PROLOG: exit2.loopexit: 368; PROLOG-NEXT: ret void 369; PROLOG: loop_exiting_bb1.1: 370; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 371; PROLOG: loop_exiting_bb2.1: 372; PROLOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 373; PROLOG: loop_latch.1: 374; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 375; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 376; PROLOG: loop_exiting_bb1.2: 377; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 378; PROLOG: loop_exiting_bb2.2: 379; PROLOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 380; PROLOG: loop_latch.2: 381; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 382; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 383; PROLOG: loop_exiting_bb1.3: 384; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 385; PROLOG: loop_exiting_bb2.3: 386; PROLOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 387; PROLOG: loop_latch.3: 388; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 389; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 390; PROLOG: loop_exiting_bb1.4: 391; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 392; PROLOG: loop_exiting_bb2.4: 393; PROLOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 394; PROLOG: loop_latch.4: 395; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 396; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 397; PROLOG: loop_exiting_bb1.5: 398; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 399; PROLOG: loop_exiting_bb2.5: 400; PROLOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 401; PROLOG: loop_latch.5: 402; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 403; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 404; PROLOG: loop_exiting_bb1.6: 405; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 406; PROLOG: loop_exiting_bb2.6: 407; PROLOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 408; PROLOG: loop_latch.6: 409; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 410; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 411; PROLOG: loop_exiting_bb1.7: 412; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 413; PROLOG: loop_exiting_bb2.7: 414; PROLOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 415; PROLOG: loop_latch.7: 416; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 417; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 418; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 419; 420; PROLOG-BLOCK-LABEL: @test1( 421; PROLOG-BLOCK-NEXT: entry: 422; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 423; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 424; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 425; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 426; PROLOG-BLOCK: loop_header.prol.preheader: 427; PROLOG-BLOCK-NEXT: br label %loop_header.prol 428; PROLOG-BLOCK: loop_header.prol: 429; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 430; PROLOG-BLOCK: loop_exiting_bb1.prol: 431; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1 432; PROLOG-BLOCK: loop_exiting_bb2.prol: 433; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.prol, label %exit3 434; PROLOG-BLOCK: loop_latch.prol: 435; PROLOG-BLOCK-NEXT: %iv_next.prol = add i64 0, 1 436; PROLOG-BLOCK-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 437; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 438; PROLOG-BLOCK: loop_header.prol.loopexit: 439; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ] 440; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 441; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2.loopexit, label %entry.new 442; PROLOG-BLOCK: entry.new: 443; PROLOG-BLOCK-NEXT: br label %loop_header 444; PROLOG-BLOCK: loop_header: 445; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 446; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 447; PROLOG-BLOCK: loop_exiting_bb1: 448; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 449; PROLOG-BLOCK: loop_exiting_bb2: 450; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 451; PROLOG-BLOCK: exit3.loopexit: 452; PROLOG-BLOCK-NEXT: br label %exit3 453; PROLOG-BLOCK: exit3: 454; PROLOG-BLOCK-NEXT: ret void 455; PROLOG-BLOCK: loop_latch: 456; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 457; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 458; PROLOG-BLOCK: exit1.loopexit: 459; PROLOG-BLOCK-NEXT: br label %exit1 460; PROLOG-BLOCK: exit1: 461; PROLOG-BLOCK-NEXT: ret void 462; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 463; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 464; PROLOG-BLOCK: exit2.loopexit: 465; PROLOG-BLOCK-NEXT: ret void 466; PROLOG-BLOCK: loop_exiting_bb1.1: 467; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 468; PROLOG-BLOCK: loop_exiting_bb2.1: 469; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 470; PROLOG-BLOCK: loop_latch.1: 471; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 472; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 473; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0 474; 475 476entry: 477 br label %loop_header 478 479loop_header: 480 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 481 br i1 %cond, label %loop_latch, label %loop_exiting_bb1 482 483loop_exiting_bb1: 484 br i1 false, label %loop_exiting_bb2, label %exit1 485 486loop_exiting_bb2: 487 br i1 false, label %loop_latch, label %exit3 488 489exit3: 490 ret void 491 492loop_latch: 493 %iv_next = add i64 %iv, 1 494 %cmp = icmp ne i64 %iv_next, %trip 495 br i1 %cmp, label %loop_header, label %exit2.loopexit 496 497exit1: 498 ret void 499 500exit2.loopexit: 501 ret void 502} 503 504 505; test with three exiting and two exit blocks. 506; The non-latch exit block has 2 unique predecessors. 507; There are 2 values passed to the exit blocks that are calculated at every iteration. 508; %sum.02 and %add. Both of these are incoming values for phi from every exiting 509; unrolled block. 510define i32 @test2(i32* nocapture %a, i64 %n) { 511; EPILOG-NO-IC-LABEL: @test2( 512; EPILOG-NO-IC-NEXT: entry: 513; EPILOG-NO-IC-NEXT: %0 = add i64 %n, -1 514; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %n, 7 515; EPILOG-NO-IC-NEXT: %1 = icmp ult i64 %0, 7 516; EPILOG-NO-IC-NEXT: br i1 %1, label %for.end.unr-lcssa, label %entry.new 517; EPILOG-NO-IC: entry.new: 518; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %n, %xtraiter 519; EPILOG-NO-IC-NEXT: br label %header 520; EPILOG-NO-IC: header: 521; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 522; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ] 523; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %for.body.7 ] 524; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 525; EPILOG-NO-IC: for.exiting_block: 526; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 527; EPILOG-NO-IC-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 528; EPILOG-NO-IC: for.body: 529; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 530; EPILOG-NO-IC-NEXT: %2 = load i32, i32* %arrayidx, align 4 531; EPILOG-NO-IC-NEXT: %add = add nsw i32 %2, %sum.02 532; EPILOG-NO-IC-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 533; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 534; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 535; EPILOG-NO-IC: for.end.unr-lcssa.loopexit: 536; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ] 537; EPILOG-NO-IC-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ] 538; EPILOG-NO-IC-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ] 539; EPILOG-NO-IC-NEXT: br label %for.end.unr-lcssa 540; EPILOG-NO-IC: for.end.unr-lcssa: 541; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 542; EPILOG-NO-IC-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 543; EPILOG-NO-IC-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 544; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 545; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 546; EPILOG-NO-IC: header.epil.preheader: 547; EPILOG-NO-IC-NEXT: br label %header.epil 548; EPILOG-NO-IC: header.epil: 549; EPILOG-NO-IC-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 550; EPILOG-NO-IC-NEXT: %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ] 551; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ] 552; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 553; EPILOG-NO-IC: for.exiting_block.epil: 554; EPILOG-NO-IC-NEXT: %cmp.epil = icmp eq i64 %n, 42 555; EPILOG-NO-IC-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil 556; EPILOG-NO-IC: for.body.epil: 557; EPILOG-NO-IC-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 558; EPILOG-NO-IC-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 559; EPILOG-NO-IC-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 560; EPILOG-NO-IC-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 561; EPILOG-NO-IC-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 562; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 563; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 564; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2 565; EPILOG-NO-IC: for.end.epilog-lcssa: 566; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ] 567; EPILOG-NO-IC-NEXT: br label %for.end 568; EPILOG-NO-IC: for.end: 569; EPILOG-NO-IC-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ] 570; EPILOG-NO-IC-NEXT: ret i32 %sum.0.lcssa 571; EPILOG-NO-IC: for.exit2.loopexit: 572; EPILOG-NO-IC-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 ] 573; EPILOG-NO-IC-NEXT: br label %for.exit2 574; EPILOG-NO-IC: for.exit2.loopexit2: 575; EPILOG-NO-IC-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 576; EPILOG-NO-IC-NEXT: br label %for.exit2 577; EPILOG-NO-IC: for.exit2: 578; EPILOG-NO-IC-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 579; EPILOG-NO-IC-NEXT: ret i32 %retval 580; EPILOG-NO-IC: for.exiting_block.1: 581; EPILOG-NO-IC-NEXT: %cmp.1 = icmp eq i64 %n, 42 582; EPILOG-NO-IC-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 583; EPILOG-NO-IC: for.body.1: 584; EPILOG-NO-IC-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 585; EPILOG-NO-IC-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 586; EPILOG-NO-IC-NEXT: %add.1 = add nsw i32 %4, %add 587; EPILOG-NO-IC-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 588; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 589; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 590; EPILOG-NO-IC: for.exiting_block.2: 591; EPILOG-NO-IC-NEXT: %cmp.2 = icmp eq i64 %n, 42 592; EPILOG-NO-IC-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 593; EPILOG-NO-IC: for.body.2: 594; EPILOG-NO-IC-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 595; EPILOG-NO-IC-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 596; EPILOG-NO-IC-NEXT: %add.2 = add nsw i32 %5, %add.1 597; EPILOG-NO-IC-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 598; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 599; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 600; EPILOG-NO-IC: for.exiting_block.3: 601; EPILOG-NO-IC-NEXT: %cmp.3 = icmp eq i64 %n, 42 602; EPILOG-NO-IC-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 603; EPILOG-NO-IC: for.body.3: 604; EPILOG-NO-IC-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 605; EPILOG-NO-IC-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 606; EPILOG-NO-IC-NEXT: %add.3 = add nsw i32 %6, %add.2 607; EPILOG-NO-IC-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 608; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 609; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 610; EPILOG-NO-IC: for.exiting_block.4: 611; EPILOG-NO-IC-NEXT: %cmp.4 = icmp eq i64 %n, 42 612; EPILOG-NO-IC-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 613; EPILOG-NO-IC: for.body.4: 614; EPILOG-NO-IC-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 615; EPILOG-NO-IC-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 616; EPILOG-NO-IC-NEXT: %add.4 = add nsw i32 %7, %add.3 617; EPILOG-NO-IC-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 618; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 619; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 620; EPILOG-NO-IC: for.exiting_block.5: 621; EPILOG-NO-IC-NEXT: %cmp.5 = icmp eq i64 %n, 42 622; EPILOG-NO-IC-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 623; EPILOG-NO-IC: for.body.5: 624; EPILOG-NO-IC-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 625; EPILOG-NO-IC-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 626; EPILOG-NO-IC-NEXT: %add.5 = add nsw i32 %8, %add.4 627; EPILOG-NO-IC-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 628; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 629; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 630; EPILOG-NO-IC: for.exiting_block.6: 631; EPILOG-NO-IC-NEXT: %cmp.6 = icmp eq i64 %n, 42 632; EPILOG-NO-IC-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 633; EPILOG-NO-IC: for.body.6: 634; EPILOG-NO-IC-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 635; EPILOG-NO-IC-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 636; EPILOG-NO-IC-NEXT: %add.6 = add nsw i32 %9, %add.5 637; EPILOG-NO-IC-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 638; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 639; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 640; EPILOG-NO-IC: for.exiting_block.7: 641; EPILOG-NO-IC-NEXT: %cmp.7 = icmp eq i64 %n, 42 642; EPILOG-NO-IC-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 643; EPILOG-NO-IC: for.body.7: 644; EPILOG-NO-IC-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 645; EPILOG-NO-IC-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 646; EPILOG-NO-IC-NEXT: %add.7 = add nsw i32 %10, %add.6 647; EPILOG-NO-IC-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 648; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 649; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 650; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header 651; 652; EPILOG-LABEL: @test2( 653; EPILOG-NEXT: entry: 654; EPILOG-NEXT: %0 = add i64 %n, -1 655; EPILOG-NEXT: %xtraiter = and i64 %n, 7 656; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 657; EPILOG-NEXT: br i1 %1, label %for.end.unr-lcssa, label %entry.new 658; EPILOG: entry.new: 659; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 660; EPILOG-NEXT: br label %header 661; EPILOG: header: 662; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 663; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ] 664; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %for.body.7 ] 665; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 666; EPILOG: for.exiting_block: 667; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 668; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 669; EPILOG: for.body: 670; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 671; EPILOG-NEXT: %2 = load i32, i32* %arrayidx, align 4 672; EPILOG-NEXT: %add = add nsw i32 %2, %sum.02 673; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 674; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 675; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 676; EPILOG: for.end.unr-lcssa.loopexit: 677; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ] 678; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ] 679; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ] 680; EPILOG-NEXT: br label %for.end.unr-lcssa 681; EPILOG: for.end.unr-lcssa: 682; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 683; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 684; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 685; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 686; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 687; EPILOG: header.epil.preheader: 688; EPILOG-NEXT: br label %header.epil 689; EPILOG: header.epil: 690; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 691; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ] 692; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ] 693; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 694; EPILOG: for.exiting_block.epil: 695; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 696; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil 697; EPILOG: for.body.epil: 698; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 699; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 700; EPILOG-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 701; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 702; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 703; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 704; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 705; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2 706; EPILOG: for.end.epilog-lcssa: 707; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ] 708; EPILOG-NEXT: br label %for.end 709; EPILOG: for.end: 710; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ] 711; EPILOG-NEXT: ret i32 %sum.0.lcssa 712; EPILOG: for.exit2.loopexit: 713; 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 ] 714; EPILOG-NEXT: br label %for.exit2 715; EPILOG: for.exit2.loopexit2: 716; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 717; EPILOG-NEXT: br label %for.exit2 718; EPILOG: for.exit2: 719; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 720; EPILOG-NEXT: ret i32 %retval 721; EPILOG: for.exiting_block.1: 722; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 723; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 724; EPILOG: for.body.1: 725; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 726; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 727; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 728; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 729; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 730; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 731; EPILOG: for.exiting_block.2: 732; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 733; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 734; EPILOG: for.body.2: 735; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 736; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 737; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 738; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 739; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 740; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 741; EPILOG: for.exiting_block.3: 742; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 743; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 744; EPILOG: for.body.3: 745; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 746; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 747; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 748; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 749; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 750; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 751; EPILOG: for.exiting_block.4: 752; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 753; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 754; EPILOG: for.body.4: 755; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 756; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 757; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 758; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 759; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 760; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 761; EPILOG: for.exiting_block.5: 762; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 763; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 764; EPILOG: for.body.5: 765; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 766; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 767; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 768; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 769; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 770; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 771; EPILOG: for.exiting_block.6: 772; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 773; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 774; EPILOG: for.body.6: 775; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 776; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 777; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 778; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 779; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 780; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 781; EPILOG: for.exiting_block.7: 782; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 783; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 784; EPILOG: for.body.7: 785; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 786; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 787; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 788; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 789; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 790; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 791; EPILOG-NEXT: br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header 792; 793; EPILOG-BLOCK-LABEL: @test2( 794; EPILOG-BLOCK-NEXT: entry: 795; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 796; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 797; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 798; EPILOG-BLOCK-NEXT: br i1 %1, label %for.end.unr-lcssa, label %entry.new 799; EPILOG-BLOCK: entry.new: 800; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 801; EPILOG-BLOCK-NEXT: br label %header 802; EPILOG-BLOCK: header: 803; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 804; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ] 805; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %for.body.1 ] 806; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 807; EPILOG-BLOCK: for.exiting_block: 808; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 809; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 810; EPILOG-BLOCK: for.body: 811; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 812; EPILOG-BLOCK-NEXT: %2 = load i32, i32* %arrayidx, align 4 813; EPILOG-BLOCK-NEXT: %add = add nsw i32 %2, %sum.02 814; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 815; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 816; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 817; EPILOG-BLOCK: for.end.unr-lcssa.loopexit: 818; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ] 819; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ] 820; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ] 821; EPILOG-BLOCK-NEXT: br label %for.end.unr-lcssa 822; EPILOG-BLOCK: for.end.unr-lcssa: 823; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 824; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 825; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 826; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 827; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 828; EPILOG-BLOCK: header.epil.preheader: 829; EPILOG-BLOCK-NEXT: br label %header.epil 830; EPILOG-BLOCK: header.epil: 831; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 832; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 833; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 834; EPILOG-BLOCK: for.exiting_block.epil: 835; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 836; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %for.body.epil 837; EPILOG-BLOCK: for.body.epil: 838; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 839; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 840; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 841; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 842; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 843; EPILOG-BLOCK-NEXT: br label %for.end.epilog-lcssa 844; EPILOG-BLOCK: for.end.epilog-lcssa: 845; EPILOG-BLOCK-NEXT: br label %for.end 846; EPILOG-BLOCK: for.end: 847; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.end.epilog-lcssa ] 848; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 849; EPILOG-BLOCK: for.exit2.loopexit: 850; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 851; EPILOG-BLOCK-NEXT: br label %for.exit2 852; EPILOG-BLOCK: for.exit2: 853; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 854; EPILOG-BLOCK-NEXT: ret i32 %retval 855; EPILOG-BLOCK: for.exiting_block.1: 856; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 857; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 858; EPILOG-BLOCK: for.body.1: 859; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 860; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 861; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 862; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 863; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 864; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 865; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2 866; 867; PROLOG-LABEL: @test2( 868; PROLOG-NEXT: entry: 869; PROLOG-NEXT: %0 = add i64 %n, -1 870; PROLOG-NEXT: %xtraiter = and i64 %n, 7 871; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 872; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 873; PROLOG: header.prol.preheader: 874; PROLOG-NEXT: br label %header.prol 875; PROLOG: header.prol: 876; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 877; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 878; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %for.body.prol ] 879; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 880; PROLOG: for.exiting_block.prol: 881; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 882; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol 883; PROLOG: for.body.prol: 884; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 885; PROLOG-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 886; PROLOG-NEXT: %add.prol = add nsw i32 %1, %sum.02.prol 887; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 888; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 889; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 890; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 891; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2 892; PROLOG: header.prol.loopexit.unr-lcssa: 893; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 894; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ] 895; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 896; PROLOG-NEXT: br label %header.prol.loopexit 897; PROLOG: header.prol.loopexit: 898; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 899; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 900; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 901; PROLOG-NEXT: %2 = icmp ult i64 %0, 7 902; PROLOG-NEXT: br i1 %2, label %for.end, label %entry.new 903; PROLOG: entry.new: 904; PROLOG-NEXT: br label %header 905; PROLOG: header: 906; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 907; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ] 908; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 909; PROLOG: for.exiting_block: 910; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 911; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 912; PROLOG: for.body: 913; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 914; PROLOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 915; PROLOG-NEXT: %add = add nsw i32 %3, %sum.02 916; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 917; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 918; PROLOG: for.end.unr-lcssa: 919; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ] 920; PROLOG-NEXT: br label %for.end 921; PROLOG: for.end: 922; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 923; PROLOG-NEXT: ret i32 %sum.0.lcssa 924; PROLOG: for.exit2.loopexit: 925; 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 ] 926; PROLOG-NEXT: br label %for.exit2 927; PROLOG: for.exit2.loopexit1: 928; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 929; PROLOG-NEXT: br label %for.exit2 930; PROLOG: for.exit2: 931; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 932; PROLOG-NEXT: ret i32 %retval 933; PROLOG: for.exiting_block.1: 934; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 935; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 936; PROLOG: for.body.1: 937; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 938; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 939; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 940; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 941; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 942; PROLOG: for.exiting_block.2: 943; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 944; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 945; PROLOG: for.body.2: 946; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 947; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 948; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 949; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 950; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 951; PROLOG: for.exiting_block.3: 952; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 953; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 954; PROLOG: for.body.3: 955; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 956; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 957; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 958; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 959; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 960; PROLOG: for.exiting_block.4: 961; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 962; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 963; PROLOG: for.body.4: 964; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 965; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 966; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 967; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 968; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 969; PROLOG: for.exiting_block.5: 970; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 971; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 972; PROLOG: for.body.5: 973; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 974; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 975; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 976; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 977; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 978; PROLOG: for.exiting_block.6: 979; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 980; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 981; PROLOG: for.body.6: 982; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 983; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 984; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 985; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 986; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 987; PROLOG: for.exiting_block.7: 988; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 989; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 990; PROLOG: for.body.7: 991; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 992; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 993; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 994; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 995; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 996; PROLOG-NEXT: br i1 %exitcond.7, label %for.end.unr-lcssa, label %header 997; 998; PROLOG-BLOCK-LABEL: @test2( 999; PROLOG-BLOCK-NEXT: entry: 1000; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 1001; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 1002; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1003; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1004; PROLOG-BLOCK: header.prol.preheader: 1005; PROLOG-BLOCK-NEXT: br label %header.prol 1006; PROLOG-BLOCK: header.prol: 1007; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 1008; PROLOG-BLOCK: for.exiting_block.prol: 1009; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 1010; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %for.body.prol 1011; PROLOG-BLOCK: for.body.prol: 1012; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 1013; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 1014; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %1, 0 1015; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 1016; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1017; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 1018; PROLOG-BLOCK: header.prol.loopexit: 1019; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %for.body.prol ] 1020; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %for.body.prol ] 1021; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %for.body.prol ] 1022; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 1023; PROLOG-BLOCK-NEXT: br i1 %2, label %for.end, label %entry.new 1024; PROLOG-BLOCK: entry.new: 1025; PROLOG-BLOCK-NEXT: br label %header 1026; PROLOG-BLOCK: header: 1027; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 1028; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ] 1029; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 1030; PROLOG-BLOCK: for.exiting_block: 1031; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1032; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 1033; PROLOG-BLOCK: for.body: 1034; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1035; PROLOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 1036; PROLOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1037; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1038; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 1039; PROLOG-BLOCK: for.end.unr-lcssa: 1040; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ] 1041; PROLOG-BLOCK-NEXT: br label %for.end 1042; PROLOG-BLOCK: for.end: 1043; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 1044; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 1045; PROLOG-BLOCK: for.exit2.loopexit: 1046; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 1047; PROLOG-BLOCK-NEXT: br label %for.exit2 1048; PROLOG-BLOCK: for.exit2: 1049; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 1050; PROLOG-BLOCK-NEXT: ret i32 %retval 1051; PROLOG-BLOCK: for.exiting_block.1: 1052; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1053; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 1054; PROLOG-BLOCK: for.body.1: 1055; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1056; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1057; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1058; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1059; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1060; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2 1061; 1062 1063 1064entry: 1065 br label %header 1066 1067header: 1068 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 1069 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] 1070 br i1 false, label %for.exit2, label %for.exiting_block 1071 1072for.exiting_block: 1073 %cmp = icmp eq i64 %n, 42 1074 br i1 %cmp, label %for.exit2, label %for.body 1075 1076for.body: 1077 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1078 %0 = load i32, i32* %arrayidx, align 4 1079 %add = add nsw i32 %0, %sum.02 1080 %indvars.iv.next = add i64 %indvars.iv, 1 1081 %exitcond = icmp eq i64 %indvars.iv.next, %n 1082 br i1 %exitcond, label %for.end, label %header 1083 1084for.end: ; preds = %for.body 1085 %sum.0.lcssa = phi i32 [ %add, %for.body ] 1086 ret i32 %sum.0.lcssa 1087 1088for.exit2: 1089 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 1090 ret i32 %retval 1091} 1092 1093; test with two exiting and three exit blocks. 1094; the non-latch exiting block has a switch. 1095define void @test3(i64 %trip, i64 %add) { 1096; EPILOG-NO-IC-LABEL: @test3( 1097; EPILOG-NO-IC-NEXT: entry: 1098; EPILOG-NO-IC-NEXT: %0 = add i64 %trip, -1 1099; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %trip, 7 1100; EPILOG-NO-IC-NEXT: %1 = icmp ult i64 %0, 7 1101; EPILOG-NO-IC-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 1102; EPILOG-NO-IC: entry.new: 1103; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 1104; EPILOG-NO-IC-NEXT: br label %loop_header 1105; EPILOG-NO-IC: loop_header: 1106; EPILOG-NO-IC-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 1107; EPILOG-NO-IC-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 1108; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 1109; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1110; EPILOG-NO-IC: loop_exiting_bb1: 1111; EPILOG-NO-IC-NEXT: switch i64 %sum, label %loop_latch [ 1112; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1113; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1114; EPILOG-NO-IC-NEXT: ] 1115; EPILOG-NO-IC: exit3.loopexit: 1116; EPILOG-NO-IC-NEXT: br label %exit3 1117; EPILOG-NO-IC: exit3.loopexit2: 1118; EPILOG-NO-IC-NEXT: br label %exit3 1119; EPILOG-NO-IC: exit3: 1120; EPILOG-NO-IC-NEXT: ret void 1121; EPILOG-NO-IC: loop_latch: 1122; EPILOG-NO-IC-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1123; EPILOG-NO-IC-NEXT: %sum.next = add i64 %sum, %add 1124; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 1125; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1126; EPILOG-NO-IC: exit1.loopexit: 1127; EPILOG-NO-IC-NEXT: br label %exit1 1128; EPILOG-NO-IC: exit1.loopexit1: 1129; EPILOG-NO-IC-NEXT: br label %exit1 1130; EPILOG-NO-IC: exit1: 1131; EPILOG-NO-IC-NEXT: ret void 1132; EPILOG-NO-IC: exit2.loopexit.unr-lcssa.loopexit: 1133; EPILOG-NO-IC-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 1134; EPILOG-NO-IC-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 1135; EPILOG-NO-IC-NEXT: br label %exit2.loopexit.unr-lcssa 1136; EPILOG-NO-IC: exit2.loopexit.unr-lcssa: 1137; EPILOG-NO-IC-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1138; EPILOG-NO-IC-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1139; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1140; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 1141; EPILOG-NO-IC: loop_header.epil.preheader: 1142; EPILOG-NO-IC-NEXT: br label %loop_header.epil 1143; EPILOG-NO-IC: loop_header.epil: 1144; EPILOG-NO-IC-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 1145; EPILOG-NO-IC-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 1146; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 1147; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 1148; EPILOG-NO-IC: loop_exiting_bb1.epil: 1149; EPILOG-NO-IC-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 1150; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit1 1151; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit2 1152; EPILOG-NO-IC-NEXT: ] 1153; EPILOG-NO-IC: loop_latch.epil: 1154; EPILOG-NO-IC-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 1155; EPILOG-NO-IC-NEXT: %sum.next.epil = add i64 %sum.epil, %add 1156; EPILOG-NO-IC-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 1157; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 1158; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 1159; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3 1160; EPILOG-NO-IC: exit2.loopexit.epilog-lcssa: 1161; EPILOG-NO-IC-NEXT: br label %exit2.loopexit 1162; EPILOG-NO-IC: exit2.loopexit: 1163; EPILOG-NO-IC-NEXT: ret void 1164; EPILOG-NO-IC: loop_exiting_bb1.1: 1165; EPILOG-NO-IC-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1166; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1167; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1168; EPILOG-NO-IC-NEXT: ] 1169; EPILOG-NO-IC: loop_latch.1: 1170; EPILOG-NO-IC-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1171; EPILOG-NO-IC-NEXT: %sum.next.1 = add i64 %sum.next, %add 1172; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 1173; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 1174; EPILOG-NO-IC: loop_exiting_bb1.2: 1175; EPILOG-NO-IC-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1176; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1177; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1178; EPILOG-NO-IC-NEXT: ] 1179; EPILOG-NO-IC: loop_latch.2: 1180; EPILOG-NO-IC-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 1181; EPILOG-NO-IC-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1182; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 1183; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 1184; EPILOG-NO-IC: loop_exiting_bb1.3: 1185; EPILOG-NO-IC-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1186; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1187; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1188; EPILOG-NO-IC-NEXT: ] 1189; EPILOG-NO-IC: loop_latch.3: 1190; EPILOG-NO-IC-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 1191; EPILOG-NO-IC-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1192; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 1193; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 1194; EPILOG-NO-IC: loop_exiting_bb1.4: 1195; EPILOG-NO-IC-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1196; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1197; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1198; EPILOG-NO-IC-NEXT: ] 1199; EPILOG-NO-IC: loop_latch.4: 1200; EPILOG-NO-IC-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 1201; EPILOG-NO-IC-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1202; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 1203; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 1204; EPILOG-NO-IC: loop_exiting_bb1.5: 1205; EPILOG-NO-IC-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1206; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1207; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1208; EPILOG-NO-IC-NEXT: ] 1209; EPILOG-NO-IC: loop_latch.5: 1210; EPILOG-NO-IC-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 1211; EPILOG-NO-IC-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1212; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 1213; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 1214; EPILOG-NO-IC: loop_exiting_bb1.6: 1215; EPILOG-NO-IC-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1216; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1217; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1218; EPILOG-NO-IC-NEXT: ] 1219; EPILOG-NO-IC: loop_latch.6: 1220; EPILOG-NO-IC-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 1221; EPILOG-NO-IC-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1222; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 1223; EPILOG-NO-IC-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 1224; EPILOG-NO-IC: loop_exiting_bb1.7: 1225; EPILOG-NO-IC-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1226; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 1227; EPILOG-NO-IC-NEXT: i64 42, label %exit3.loopexit 1228; EPILOG-NO-IC-NEXT: ] 1229; EPILOG-NO-IC: loop_latch.7: 1230; EPILOG-NO-IC-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 1231; EPILOG-NO-IC-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1232; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 1233; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 1234; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 1235; 1236; EPILOG-LABEL: @test3( 1237; EPILOG-NEXT: entry: 1238; EPILOG-NEXT: %0 = add i64 %trip, -1 1239; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 1240; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 1241; EPILOG-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 1242; EPILOG: entry.new: 1243; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 1244; EPILOG-NEXT: br label %loop_header 1245; EPILOG: loop_header: 1246; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 1247; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 1248; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 1249; EPILOG-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1250; EPILOG: loop_exiting_bb1: 1251; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 1252; EPILOG-NEXT: i64 24, label %exit1.loopexit 1253; EPILOG-NEXT: i64 42, label %exit3.loopexit 1254; EPILOG-NEXT: ] 1255; EPILOG: exit3.loopexit: 1256; EPILOG-NEXT: br label %exit3 1257; EPILOG: exit3.loopexit2: 1258; EPILOG-NEXT: br label %exit3 1259; EPILOG: exit3: 1260; EPILOG-NEXT: ret void 1261; EPILOG: loop_latch: 1262; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1263; EPILOG-NEXT: %sum.next = add i64 %sum, %add 1264; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 1265; EPILOG-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1266; EPILOG: exit1.loopexit: 1267; EPILOG-NEXT: br label %exit1 1268; EPILOG: exit1.loopexit1: 1269; EPILOG-NEXT: br label %exit1 1270; EPILOG: exit1: 1271; EPILOG-NEXT: ret void 1272; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 1273; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 1274; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 1275; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 1276; EPILOG: exit2.loopexit.unr-lcssa: 1277; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1278; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1279; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1280; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 1281; EPILOG: loop_header.epil.preheader: 1282; EPILOG-NEXT: br label %loop_header.epil 1283; EPILOG: loop_header.epil: 1284; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 1285; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 1286; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 1287; EPILOG-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 1288; EPILOG: loop_exiting_bb1.epil: 1289; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 1290; EPILOG-NEXT: i64 24, label %exit1.loopexit1 1291; EPILOG-NEXT: i64 42, label %exit3.loopexit2 1292; EPILOG-NEXT: ] 1293; EPILOG: loop_latch.epil: 1294; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 1295; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 1296; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 1297; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 1298; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 1299; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3 1300; EPILOG: exit2.loopexit.epilog-lcssa: 1301; EPILOG-NEXT: br label %exit2.loopexit 1302; EPILOG: exit2.loopexit: 1303; EPILOG-NEXT: ret void 1304; EPILOG: loop_exiting_bb1.1: 1305; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1306; EPILOG-NEXT: i64 24, label %exit1.loopexit 1307; EPILOG-NEXT: i64 42, label %exit3.loopexit 1308; EPILOG-NEXT: ] 1309; EPILOG: loop_latch.1: 1310; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1311; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 1312; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 1313; EPILOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 1314; EPILOG: loop_exiting_bb1.2: 1315; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1316; EPILOG-NEXT: i64 24, label %exit1.loopexit 1317; EPILOG-NEXT: i64 42, label %exit3.loopexit 1318; EPILOG-NEXT: ] 1319; EPILOG: loop_latch.2: 1320; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 1321; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1322; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 1323; EPILOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 1324; EPILOG: loop_exiting_bb1.3: 1325; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1326; EPILOG-NEXT: i64 24, label %exit1.loopexit 1327; EPILOG-NEXT: i64 42, label %exit3.loopexit 1328; EPILOG-NEXT: ] 1329; EPILOG: loop_latch.3: 1330; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 1331; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1332; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 1333; EPILOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 1334; EPILOG: loop_exiting_bb1.4: 1335; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1336; EPILOG-NEXT: i64 24, label %exit1.loopexit 1337; EPILOG-NEXT: i64 42, label %exit3.loopexit 1338; EPILOG-NEXT: ] 1339; EPILOG: loop_latch.4: 1340; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 1341; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1342; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 1343; EPILOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 1344; EPILOG: loop_exiting_bb1.5: 1345; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1346; EPILOG-NEXT: i64 24, label %exit1.loopexit 1347; EPILOG-NEXT: i64 42, label %exit3.loopexit 1348; EPILOG-NEXT: ] 1349; EPILOG: loop_latch.5: 1350; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 1351; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1352; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 1353; EPILOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 1354; EPILOG: loop_exiting_bb1.6: 1355; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1356; EPILOG-NEXT: i64 24, label %exit1.loopexit 1357; EPILOG-NEXT: i64 42, label %exit3.loopexit 1358; EPILOG-NEXT: ] 1359; EPILOG: loop_latch.6: 1360; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 1361; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1362; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 1363; EPILOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 1364; EPILOG: loop_exiting_bb1.7: 1365; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1366; EPILOG-NEXT: i64 24, label %exit1.loopexit 1367; EPILOG-NEXT: i64 42, label %exit3.loopexit 1368; EPILOG-NEXT: ] 1369; EPILOG: loop_latch.7: 1370; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 1371; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1372; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 1373; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 1374; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 1375; 1376; EPILOG-BLOCK-LABEL: @test3( 1377; EPILOG-BLOCK-NEXT: entry: 1378; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 1379; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 1380; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 1381; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new 1382; EPILOG-BLOCK: entry.new: 1383; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 1384; EPILOG-BLOCK-NEXT: br label %loop_header 1385; EPILOG-BLOCK: loop_header: 1386; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 1387; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 1388; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ] 1389; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1390; EPILOG-BLOCK: loop_exiting_bb1: 1391; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 1392; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1393; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1394; EPILOG-BLOCK-NEXT: ] 1395; EPILOG-BLOCK: exit3.loopexit: 1396; EPILOG-BLOCK-NEXT: br label %exit3 1397; EPILOG-BLOCK: exit3: 1398; EPILOG-BLOCK-NEXT: ret void 1399; EPILOG-BLOCK: loop_latch: 1400; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1401; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 1402; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 1403; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1404; EPILOG-BLOCK: exit1.loopexit: 1405; EPILOG-BLOCK-NEXT: br label %exit1 1406; EPILOG-BLOCK: exit1: 1407; EPILOG-BLOCK-NEXT: ret void 1408; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 1409; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 1410; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 1411; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 1412; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 1413; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1414; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1415; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1416; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 1417; EPILOG-BLOCK: loop_header.epil.preheader: 1418; EPILOG-BLOCK-NEXT: br label %loop_header.epil 1419; EPILOG-BLOCK: loop_header.epil: 1420; EPILOG-BLOCK-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ] 1421; EPILOG-BLOCK-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ] 1422; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 1423; EPILOG-BLOCK: loop_exiting_bb1.epil: 1424; EPILOG-BLOCK-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 1425; EPILOG-BLOCK-NEXT: i64 24, label %exit1 1426; EPILOG-BLOCK-NEXT: i64 42, label %exit3 1427; EPILOG-BLOCK-NEXT: ] 1428; EPILOG-BLOCK: loop_latch.epil: 1429; EPILOG-BLOCK-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 1430; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.epil, %add 1431; EPILOG-BLOCK-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 1432; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.epilog-lcssa 1433; EPILOG-BLOCK: exit2.loopexit.epilog-lcssa: 1434; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 1435; EPILOG-BLOCK: exit2.loopexit: 1436; EPILOG-BLOCK-NEXT: ret void 1437; EPILOG-BLOCK: loop_exiting_bb1.1: 1438; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1439; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1440; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1441; EPILOG-BLOCK-NEXT: ] 1442; EPILOG-BLOCK: loop_latch.1: 1443; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1444; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 1445; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 1446; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 1447; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3 1448; 1449; PROLOG-LABEL: @test3( 1450; PROLOG-NEXT: entry: 1451; PROLOG-NEXT: %0 = add i64 %trip, -1 1452; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 1453; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1454; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 1455; PROLOG: loop_header.prol.preheader: 1456; PROLOG-NEXT: br label %loop_header.prol 1457; PROLOG: loop_header.prol: 1458; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 1459; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 1460; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ] 1461; PROLOG-NEXT: br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol 1462; PROLOG: loop_exiting_bb1.prol: 1463; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 1464; PROLOG-NEXT: i64 24, label %exit1.loopexit1 1465; PROLOG-NEXT: i64 42, label %exit3.loopexit2 1466; PROLOG-NEXT: ] 1467; PROLOG: loop_latch.prol: 1468; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 1469; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 1470; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 1471; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 1472; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 1473; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3 1474; PROLOG: loop_header.prol.loopexit.unr-lcssa: 1475; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 1476; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 1477; PROLOG-NEXT: br label %loop_header.prol.loopexit 1478; PROLOG: loop_header.prol.loopexit: 1479; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1480; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1481; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 1482; PROLOG-NEXT: br i1 %1, label %exit2.loopexit, label %entry.new 1483; PROLOG: entry.new: 1484; PROLOG-NEXT: br label %loop_header 1485; PROLOG: loop_header: 1486; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 1487; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 1488; PROLOG-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1489; PROLOG: loop_exiting_bb1: 1490; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 1491; PROLOG-NEXT: i64 24, label %exit1.loopexit 1492; PROLOG-NEXT: i64 42, label %exit3.loopexit 1493; PROLOG-NEXT: ] 1494; PROLOG: exit3.loopexit: 1495; PROLOG-NEXT: br label %exit3 1496; PROLOG: exit3.loopexit2: 1497; PROLOG-NEXT: br label %exit3 1498; PROLOG: exit3: 1499; PROLOG-NEXT: ret void 1500; PROLOG: loop_latch: 1501; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1502; PROLOG-NEXT: %sum.next = add i64 %sum, %add 1503; PROLOG-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1504; PROLOG: exit1.loopexit: 1505; PROLOG-NEXT: br label %exit1 1506; PROLOG: exit1.loopexit1: 1507; PROLOG-NEXT: br label %exit1 1508; PROLOG: exit1: 1509; PROLOG-NEXT: ret void 1510; PROLOG: exit2.loopexit.unr-lcssa: 1511; PROLOG-NEXT: br label %exit2.loopexit 1512; PROLOG: exit2.loopexit: 1513; PROLOG-NEXT: ret void 1514; PROLOG: loop_exiting_bb1.1: 1515; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1516; PROLOG-NEXT: i64 24, label %exit1.loopexit 1517; PROLOG-NEXT: i64 42, label %exit3.loopexit 1518; PROLOG-NEXT: ] 1519; PROLOG: loop_latch.1: 1520; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1521; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 1522; PROLOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 1523; PROLOG: loop_exiting_bb1.2: 1524; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1525; PROLOG-NEXT: i64 24, label %exit1.loopexit 1526; PROLOG-NEXT: i64 42, label %exit3.loopexit 1527; PROLOG-NEXT: ] 1528; PROLOG: loop_latch.2: 1529; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 1530; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1531; PROLOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 1532; PROLOG: loop_exiting_bb1.3: 1533; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1534; PROLOG-NEXT: i64 24, label %exit1.loopexit 1535; PROLOG-NEXT: i64 42, label %exit3.loopexit 1536; PROLOG-NEXT: ] 1537; PROLOG: loop_latch.3: 1538; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 1539; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1540; PROLOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 1541; PROLOG: loop_exiting_bb1.4: 1542; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1543; PROLOG-NEXT: i64 24, label %exit1.loopexit 1544; PROLOG-NEXT: i64 42, label %exit3.loopexit 1545; PROLOG-NEXT: ] 1546; PROLOG: loop_latch.4: 1547; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 1548; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1549; PROLOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 1550; PROLOG: loop_exiting_bb1.5: 1551; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1552; PROLOG-NEXT: i64 24, label %exit1.loopexit 1553; PROLOG-NEXT: i64 42, label %exit3.loopexit 1554; PROLOG-NEXT: ] 1555; PROLOG: loop_latch.5: 1556; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 1557; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1558; PROLOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 1559; PROLOG: loop_exiting_bb1.6: 1560; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1561; PROLOG-NEXT: i64 24, label %exit1.loopexit 1562; PROLOG-NEXT: i64 42, label %exit3.loopexit 1563; PROLOG-NEXT: ] 1564; PROLOG: loop_latch.6: 1565; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 1566; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1567; PROLOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 1568; PROLOG: loop_exiting_bb1.7: 1569; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1570; PROLOG-NEXT: i64 24, label %exit1.loopexit 1571; PROLOG-NEXT: i64 42, label %exit3.loopexit 1572; PROLOG-NEXT: ] 1573; PROLOG: loop_latch.7: 1574; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 1575; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1576; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 1577; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 1578; 1579; PROLOG-BLOCK-LABEL: @test3( 1580; PROLOG-BLOCK-NEXT: entry: 1581; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 1582; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 1583; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1584; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 1585; PROLOG-BLOCK: loop_header.prol.preheader: 1586; PROLOG-BLOCK-NEXT: br label %loop_header.prol 1587; PROLOG-BLOCK: loop_header.prol: 1588; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol 1589; PROLOG-BLOCK: loop_exiting_bb1.prol: 1590; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 1591; PROLOG-BLOCK-NEXT: i64 24, label %exit1 1592; PROLOG-BLOCK-NEXT: i64 42, label %exit3 1593; PROLOG-BLOCK-NEXT: ] 1594; PROLOG-BLOCK: loop_latch.prol: 1595; PROLOG-BLOCK-NEXT: %iv_next.prol = add nuw nsw i64 0, 1 1596; PROLOG-BLOCK-NEXT: %sum.next.prol = add i64 0, %add 1597; PROLOG-BLOCK-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 1598; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 1599; PROLOG-BLOCK: loop_header.prol.loopexit: 1600; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ] 1601; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ] 1602; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 1603; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2.loopexit, label %entry.new 1604; PROLOG-BLOCK: entry.new: 1605; PROLOG-BLOCK-NEXT: br label %loop_header 1606; PROLOG-BLOCK: loop_header: 1607; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 1608; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 1609; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1610; PROLOG-BLOCK: loop_exiting_bb1: 1611; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 1612; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1613; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1614; PROLOG-BLOCK-NEXT: ] 1615; PROLOG-BLOCK: exit3.loopexit: 1616; PROLOG-BLOCK-NEXT: br label %exit3 1617; PROLOG-BLOCK: exit3: 1618; PROLOG-BLOCK-NEXT: ret void 1619; PROLOG-BLOCK: loop_latch: 1620; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1621; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 1622; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1623; PROLOG-BLOCK: exit1.loopexit: 1624; PROLOG-BLOCK-NEXT: br label %exit1 1625; PROLOG-BLOCK: exit1: 1626; PROLOG-BLOCK-NEXT: ret void 1627; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 1628; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 1629; PROLOG-BLOCK: exit2.loopexit: 1630; PROLOG-BLOCK-NEXT: ret void 1631; PROLOG-BLOCK: loop_exiting_bb1.1: 1632; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1633; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1634; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1635; PROLOG-BLOCK-NEXT: ] 1636; PROLOG-BLOCK: loop_latch.1: 1637; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1638; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 1639; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 1640; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3 1641; 1642 1643entry: 1644 br label %loop_header 1645 1646loop_header: 1647 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 1648 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 1649 br i1 undef, label %loop_latch, label %loop_exiting_bb1 1650 1651loop_exiting_bb1: 1652 switch i64 %sum, label %loop_latch [ 1653 i64 24, label %exit1 1654 i64 42, label %exit3 1655 ] 1656 1657exit3: 1658 ret void 1659 1660loop_latch: 1661 %iv_next = add nuw nsw i64 %iv, 1 1662 %sum.next = add i64 %sum, %add 1663 %cmp = icmp ne i64 %iv_next, %trip 1664 br i1 %cmp, label %loop_header, label %exit2.loopexit 1665 1666exit1: 1667 ret void 1668 1669exit2.loopexit: 1670 ret void 1671} 1672 1673; FIXME: Support multiple exiting blocks to the same latch exit block. 1674; Three exiting blocks where header and latch exit to same LatchExit. 1675define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { 1676; EPILOG-NO-IC-LABEL: @hdr_latch_same_exit( 1677; EPILOG-NO-IC-NEXT: entry: 1678; EPILOG-NO-IC-NEXT: br label %header 1679; EPILOG-NO-IC: header: 1680; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1681; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1682; EPILOG-NO-IC-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block 1683; EPILOG-NO-IC: for.exiting_block: 1684; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 1685; EPILOG-NO-IC-NEXT: br i1 %cmp, label %for.exit2, label %latch 1686; EPILOG-NO-IC: latch: 1687; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1688; EPILOG-NO-IC-NEXT: %0 = load i32, i32* %arrayidx, align 4 1689; EPILOG-NO-IC-NEXT: %add = add nsw i32 %0, %sum.02 1690; EPILOG-NO-IC-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1691; EPILOG-NO-IC-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1692; EPILOG-NO-IC-NEXT: br i1 %exitcond, label %latchExit, label %header 1693; EPILOG-NO-IC: latchExit: 1694; EPILOG-NO-IC-NEXT: %result = phi i32 [ 0, %header ], [ %add, %latch ] 1695; EPILOG-NO-IC-NEXT: ret i32 %result 1696; EPILOG-NO-IC: for.exit2: 1697; EPILOG-NO-IC-NEXT: ret i32 42 1698; 1699; EPILOG-LABEL: @hdr_latch_same_exit( 1700; EPILOG-NEXT: entry: 1701; EPILOG-NEXT: br label %header 1702; EPILOG: header: 1703; EPILOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1704; EPILOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1705; EPILOG-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block 1706; EPILOG: for.exiting_block: 1707; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 1708; EPILOG-NEXT: br i1 %cmp, label %for.exit2, label %latch 1709; EPILOG: latch: 1710; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1711; EPILOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 1712; EPILOG-NEXT: %add = add nsw i32 %0, %sum.02 1713; EPILOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1714; EPILOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1715; EPILOG-NEXT: br i1 %exitcond, label %latchExit, label %header 1716; EPILOG: latchExit: 1717; EPILOG-NEXT: %result = phi i32 [ 0, %header ], [ %add, %latch ] 1718; EPILOG-NEXT: ret i32 %result 1719; EPILOG: for.exit2: 1720; EPILOG-NEXT: ret i32 42 1721; 1722; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit( 1723; EPILOG-BLOCK-NEXT: entry: 1724; EPILOG-BLOCK-NEXT: br label %header 1725; EPILOG-BLOCK: header: 1726; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 1727; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 1728; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block 1729; EPILOG-BLOCK: for.exiting_block: 1730; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1731; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2, label %latch 1732; EPILOG-BLOCK: latch: 1733; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1734; EPILOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 1735; EPILOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 1736; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1737; EPILOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1738; EPILOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 1739; EPILOG-BLOCK: latchExit: 1740; EPILOG-BLOCK-NEXT: %result = phi i32 [ 0, %header ], [ %add, %latch ], [ 0, %header.1 ], [ %add.1, %latch.1 ] 1741; EPILOG-BLOCK-NEXT: ret i32 %result 1742; EPILOG-BLOCK: for.exit2: 1743; EPILOG-BLOCK-NEXT: ret i32 42 1744; EPILOG-BLOCK: header.1: 1745; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block.1 1746; EPILOG-BLOCK: for.exiting_block.1: 1747; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1748; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2, label %latch.1 1749; EPILOG-BLOCK: latch.1: 1750; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1751; EPILOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 1752; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 1753; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1754; EPILOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1755; EPILOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !4 1756; 1757; PROLOG-LABEL: @hdr_latch_same_exit( 1758; PROLOG-NEXT: entry: 1759; PROLOG-NEXT: br label %header 1760; PROLOG: header: 1761; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1762; PROLOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1763; PROLOG-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block 1764; PROLOG: for.exiting_block: 1765; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1766; PROLOG-NEXT: br i1 %cmp, label %for.exit2, label %latch 1767; PROLOG: latch: 1768; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1769; PROLOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 1770; PROLOG-NEXT: %add = add nsw i32 %0, %sum.02 1771; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1772; PROLOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1773; PROLOG-NEXT: br i1 %exitcond, label %latchExit, label %header 1774; PROLOG: latchExit: 1775; PROLOG-NEXT: %result = phi i32 [ 0, %header ], [ %add, %latch ] 1776; PROLOG-NEXT: ret i32 %result 1777; PROLOG: for.exit2: 1778; PROLOG-NEXT: ret i32 42 1779; 1780; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit( 1781; PROLOG-BLOCK-NEXT: entry: 1782; PROLOG-BLOCK-NEXT: br label %header 1783; PROLOG-BLOCK: header: 1784; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 1785; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 1786; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block 1787; PROLOG-BLOCK: for.exiting_block: 1788; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1789; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2, label %latch 1790; PROLOG-BLOCK: latch: 1791; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1792; PROLOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 1793; PROLOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 1794; PROLOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1795; PROLOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1796; PROLOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 1797; PROLOG-BLOCK: latchExit: 1798; PROLOG-BLOCK-NEXT: %result = phi i32 [ 0, %header ], [ %add, %latch ], [ 0, %header.1 ], [ %add.1, %latch.1 ] 1799; PROLOG-BLOCK-NEXT: ret i32 %result 1800; PROLOG-BLOCK: for.exit2: 1801; PROLOG-BLOCK-NEXT: ret i32 42 1802; PROLOG-BLOCK: header.1: 1803; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit, label %for.exiting_block.1 1804; PROLOG-BLOCK: for.exiting_block.1: 1805; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1806; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2, label %latch.1 1807; PROLOG-BLOCK: latch.1: 1808; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1809; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 1810; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 1811; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1812; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1813; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !4 1814; 1815 1816entry: 1817 br label %header 1818 1819header: 1820 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1821 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1822 br i1 %cond, label %latchExit, label %for.exiting_block 1823 1824for.exiting_block: 1825 %cmp = icmp eq i64 %n, 42 1826 br i1 %cmp, label %for.exit2, label %latch 1827 1828latch: ; preds = %latch, %entry 1829 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1830 %0 = load i32, i32* %arrayidx, align 4 1831 %add = add nsw i32 %0, %sum.02 1832 %indvars.iv.next = add i64 %indvars.iv, 1 1833 %exitcond = icmp eq i64 %indvars.iv.next, %n 1834 br i1 %exitcond, label %latchExit, label %header 1835 1836latchExit: ; preds = %latch, %entry 1837 %result = phi i32 [ 0, %header ], [ %add, %latch ] 1838 ret i32 %result 1839 1840for.exit2: 1841 ret i32 42 1842} 1843 1844; Two exiting blocks to latch where the exiting blocks are Latch and a 1845; non-header 1846; FIXME: We should unroll this loop. 1847define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { 1848; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit( 1849; EPILOG-NO-IC-NEXT: entry: 1850; EPILOG-NO-IC-NEXT: br label %header 1851; EPILOG-NO-IC: header: 1852; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1853; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1854; EPILOG-NO-IC-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 1855; EPILOG-NO-IC: for.exiting_block: 1856; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 1857; EPILOG-NO-IC-NEXT: br i1 %cmp, label %latchExit, label %latch 1858; EPILOG-NO-IC: latch: 1859; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1860; EPILOG-NO-IC-NEXT: %0 = load i32, i32* %arrayidx, align 4 1861; EPILOG-NO-IC-NEXT: %add = add nsw i32 %0, %sum.02 1862; EPILOG-NO-IC-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1863; EPILOG-NO-IC-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1864; EPILOG-NO-IC-NEXT: br i1 %exitcond, label %latchExit, label %header 1865; EPILOG-NO-IC: latchExit: 1866; EPILOG-NO-IC-NEXT: %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 1867; EPILOG-NO-IC-NEXT: ret i32 %result 1868; EPILOG-NO-IC: for.exit2: 1869; EPILOG-NO-IC-NEXT: ret i32 42 1870; 1871; EPILOG-LABEL: @otherblock_latch_same_exit( 1872; EPILOG-NEXT: entry: 1873; EPILOG-NEXT: br label %header 1874; EPILOG: header: 1875; EPILOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1876; EPILOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1877; EPILOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 1878; EPILOG: for.exiting_block: 1879; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 1880; EPILOG-NEXT: br i1 %cmp, label %latchExit, label %latch 1881; EPILOG: latch: 1882; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1883; EPILOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 1884; EPILOG-NEXT: %add = add nsw i32 %0, %sum.02 1885; EPILOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1886; EPILOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1887; EPILOG-NEXT: br i1 %exitcond, label %latchExit, label %header 1888; EPILOG: latchExit: 1889; EPILOG-NEXT: %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 1890; EPILOG-NEXT: ret i32 %result 1891; EPILOG: for.exit2: 1892; EPILOG-NEXT: ret i32 42 1893; 1894; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1895; EPILOG-BLOCK-NEXT: entry: 1896; EPILOG-BLOCK-NEXT: br label %header 1897; EPILOG-BLOCK: header: 1898; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 1899; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 1900; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 1901; EPILOG-BLOCK: for.exiting_block: 1902; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1903; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 1904; EPILOG-BLOCK: latch: 1905; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1906; EPILOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 1907; EPILOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 1908; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1909; EPILOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1910; EPILOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 1911; EPILOG-BLOCK: latchExit: 1912; EPILOG-BLOCK-NEXT: %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 1913; EPILOG-BLOCK-NEXT: ret i32 %result 1914; EPILOG-BLOCK: for.exit2: 1915; EPILOG-BLOCK-NEXT: ret i32 42 1916; EPILOG-BLOCK: header.1: 1917; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 1918; EPILOG-BLOCK: for.exiting_block.1: 1919; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1920; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 1921; EPILOG-BLOCK: latch.1: 1922; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1923; EPILOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 1924; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 1925; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1926; EPILOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1927; EPILOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !5 1928; 1929; PROLOG-LABEL: @otherblock_latch_same_exit( 1930; PROLOG-NEXT: entry: 1931; PROLOG-NEXT: br label %header 1932; PROLOG: header: 1933; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1934; PROLOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1935; PROLOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 1936; PROLOG: for.exiting_block: 1937; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1938; PROLOG-NEXT: br i1 %cmp, label %latchExit, label %latch 1939; PROLOG: latch: 1940; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1941; PROLOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 1942; PROLOG-NEXT: %add = add nsw i32 %0, %sum.02 1943; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1944; PROLOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1945; PROLOG-NEXT: br i1 %exitcond, label %latchExit, label %header 1946; PROLOG: latchExit: 1947; PROLOG-NEXT: %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 1948; PROLOG-NEXT: ret i32 %result 1949; PROLOG: for.exit2: 1950; PROLOG-NEXT: ret i32 42 1951; 1952; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1953; PROLOG-BLOCK-NEXT: entry: 1954; PROLOG-BLOCK-NEXT: br label %header 1955; PROLOG-BLOCK: header: 1956; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 1957; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 1958; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 1959; PROLOG-BLOCK: for.exiting_block: 1960; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1961; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 1962; PROLOG-BLOCK: latch: 1963; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1964; PROLOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 1965; PROLOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 1966; PROLOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1967; PROLOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 1968; PROLOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 1969; PROLOG-BLOCK: latchExit: 1970; PROLOG-BLOCK-NEXT: %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 1971; PROLOG-BLOCK-NEXT: ret i32 %result 1972; PROLOG-BLOCK: for.exit2: 1973; PROLOG-BLOCK-NEXT: ret i32 42 1974; PROLOG-BLOCK: header.1: 1975; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 1976; PROLOG-BLOCK: for.exiting_block.1: 1977; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1978; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 1979; PROLOG-BLOCK: latch.1: 1980; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1981; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 1982; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 1983; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1984; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1985; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !5 1986; 1987 1988entry: 1989 br label %header 1990 1991header: 1992 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1993 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1994 br i1 %cond, label %for.exit2, label %for.exiting_block 1995 1996for.exiting_block: 1997 %cmp = icmp eq i64 %n, 42 1998 br i1 %cmp, label %latchExit, label %latch 1999 2000latch: ; preds = %latch, %entry 2001 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2002 %0 = load i32, i32* %arrayidx, align 4 2003 %add = add nsw i32 %0, %sum.02 2004 %indvars.iv.next = add i64 %indvars.iv, 1 2005 %exitcond = icmp eq i64 %indvars.iv.next, %n 2006 br i1 %exitcond, label %latchExit, label %header 2007 2008latchExit: ; preds = %latch, %entry 2009 %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 2010 ret i32 %result 2011 2012for.exit2: 2013 ret i32 42 2014} 2015 2016; Two exiting blocks to latch where the exiting blocks are Latch and a 2017; non-header 2018; Same as above test except the incoming value for latch Phi is from the header 2019; FIXME: We should be able to runtime unroll. 2020define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { 2021; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit2( 2022; EPILOG-NO-IC-NEXT: entry: 2023; EPILOG-NO-IC-NEXT: br label %header 2024; EPILOG-NO-IC: header: 2025; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2026; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2027; EPILOG-NO-IC-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2028; EPILOG-NO-IC: for.exiting_block: 2029; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 2030; EPILOG-NO-IC-NEXT: br i1 %cmp, label %latchExit, label %latch 2031; EPILOG-NO-IC: latch: 2032; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2033; EPILOG-NO-IC-NEXT: %0 = load i32, i32* %arrayidx, align 4 2034; EPILOG-NO-IC-NEXT: %add = add nsw i32 %0, %sum.02 2035; EPILOG-NO-IC-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2036; EPILOG-NO-IC-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2037; EPILOG-NO-IC-NEXT: br i1 %exitcond, label %latchExit, label %header 2038; EPILOG-NO-IC: latchExit: 2039; EPILOG-NO-IC-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2040; EPILOG-NO-IC-NEXT: ret i32 %result 2041; EPILOG-NO-IC: for.exit2: 2042; EPILOG-NO-IC-NEXT: ret i32 42 2043; 2044; EPILOG-LABEL: @otherblock_latch_same_exit2( 2045; EPILOG-NEXT: entry: 2046; EPILOG-NEXT: br label %header 2047; EPILOG: header: 2048; EPILOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2049; EPILOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2050; EPILOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2051; EPILOG: for.exiting_block: 2052; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2053; EPILOG-NEXT: br i1 %cmp, label %latchExit, label %latch 2054; EPILOG: latch: 2055; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2056; EPILOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 2057; EPILOG-NEXT: %add = add nsw i32 %0, %sum.02 2058; EPILOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2059; EPILOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2060; EPILOG-NEXT: br i1 %exitcond, label %latchExit, label %header 2061; EPILOG: latchExit: 2062; EPILOG-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2063; EPILOG-NEXT: ret i32 %result 2064; EPILOG: for.exit2: 2065; EPILOG-NEXT: ret i32 42 2066; 2067; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2068; EPILOG-BLOCK-NEXT: entry: 2069; EPILOG-BLOCK-NEXT: br label %header 2070; EPILOG-BLOCK: header: 2071; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 2072; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 2073; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2074; EPILOG-BLOCK: for.exiting_block: 2075; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2076; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 2077; EPILOG-BLOCK: latch: 2078; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2079; EPILOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 2080; EPILOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 2081; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2082; EPILOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2083; EPILOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 2084; EPILOG-BLOCK: latchExit: 2085; EPILOG-BLOCK-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2086; EPILOG-BLOCK-NEXT: ret i32 %result 2087; EPILOG-BLOCK: for.exit2: 2088; EPILOG-BLOCK-NEXT: ret i32 42 2089; EPILOG-BLOCK: header.1: 2090; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 2091; EPILOG-BLOCK: for.exiting_block.1: 2092; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2093; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 2094; EPILOG-BLOCK: latch.1: 2095; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2096; EPILOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 2097; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 2098; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2099; EPILOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2100; EPILOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !6 2101; 2102; PROLOG-LABEL: @otherblock_latch_same_exit2( 2103; PROLOG-NEXT: entry: 2104; PROLOG-NEXT: br label %header 2105; PROLOG: header: 2106; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2107; PROLOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2108; PROLOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2109; PROLOG: for.exiting_block: 2110; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2111; PROLOG-NEXT: br i1 %cmp, label %latchExit, label %latch 2112; PROLOG: latch: 2113; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2114; PROLOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 2115; PROLOG-NEXT: %add = add nsw i32 %0, %sum.02 2116; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2117; PROLOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2118; PROLOG-NEXT: br i1 %exitcond, label %latchExit, label %header 2119; PROLOG: latchExit: 2120; PROLOG-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2121; PROLOG-NEXT: ret i32 %result 2122; PROLOG: for.exit2: 2123; PROLOG-NEXT: ret i32 42 2124; 2125; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2126; PROLOG-BLOCK-NEXT: entry: 2127; PROLOG-BLOCK-NEXT: br label %header 2128; PROLOG-BLOCK: header: 2129; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 2130; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 2131; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2132; PROLOG-BLOCK: for.exiting_block: 2133; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2134; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 2135; PROLOG-BLOCK: latch: 2136; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2137; PROLOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 2138; PROLOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 2139; PROLOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2140; PROLOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2141; PROLOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 2142; PROLOG-BLOCK: latchExit: 2143; PROLOG-BLOCK-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2144; PROLOG-BLOCK-NEXT: ret i32 %result 2145; PROLOG-BLOCK: for.exit2: 2146; PROLOG-BLOCK-NEXT: ret i32 42 2147; PROLOG-BLOCK: header.1: 2148; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 2149; PROLOG-BLOCK: for.exiting_block.1: 2150; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2151; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 2152; PROLOG-BLOCK: latch.1: 2153; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2154; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 2155; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 2156; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2157; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2158; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !6 2159; 2160 2161entry: 2162 br label %header 2163 2164header: 2165 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2166 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2167 br i1 %cond, label %for.exit2, label %for.exiting_block 2168 2169for.exiting_block: 2170 %cmp = icmp eq i64 %n, 42 2171 br i1 %cmp, label %latchExit, label %latch 2172 2173latch: ; preds = %latch, %entry 2174 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2175 %0 = load i32, i32* %arrayidx, align 4 2176 %add = add nsw i32 %0, %sum.02 2177 %indvars.iv.next = add i64 %indvars.iv, 1 2178 %exitcond = icmp eq i64 %indvars.iv.next, %n 2179 br i1 %exitcond, label %latchExit, label %header 2180 2181latchExit: ; preds = %latch, %entry 2182 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2183 ret i32 %result 2184 2185for.exit2: 2186 ret i32 42 2187} 2188 2189; Two exiting blocks to latch where the exiting blocks are Latch and a 2190; non-header 2191; Same as above test except the incoming value for cloned latch Phi is from the 2192; for.exiting_block. 2193; FIXME: We should be able to runtime unroll. 2194define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { 2195; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit3( 2196; EPILOG-NO-IC-NEXT: entry: 2197; EPILOG-NO-IC-NEXT: br label %header 2198; EPILOG-NO-IC: header: 2199; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2200; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2201; EPILOG-NO-IC-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2202; EPILOG-NO-IC: for.exiting_block: 2203; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2204; EPILOG-NO-IC-NEXT: %0 = load i32, i32* %arrayidx, align 4 2205; EPILOG-NO-IC-NEXT: %add = add nsw i32 %0, %sum.02 2206; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 2207; EPILOG-NO-IC-NEXT: br i1 %cmp, label %latchExit, label %latch 2208; EPILOG-NO-IC: latch: 2209; EPILOG-NO-IC-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2210; EPILOG-NO-IC-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2211; EPILOG-NO-IC-NEXT: br i1 %exitcond, label %latchExit, label %header 2212; EPILOG-NO-IC: latchExit: 2213; EPILOG-NO-IC-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2214; EPILOG-NO-IC-NEXT: ret i32 %result 2215; EPILOG-NO-IC: for.exit2: 2216; EPILOG-NO-IC-NEXT: ret i32 42 2217; 2218; EPILOG-LABEL: @otherblock_latch_same_exit3( 2219; EPILOG-NEXT: entry: 2220; EPILOG-NEXT: br label %header 2221; EPILOG: header: 2222; EPILOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2223; EPILOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2224; EPILOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2225; EPILOG: for.exiting_block: 2226; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2227; EPILOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 2228; EPILOG-NEXT: %add = add nsw i32 %0, %sum.02 2229; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2230; EPILOG-NEXT: br i1 %cmp, label %latchExit, label %latch 2231; EPILOG: latch: 2232; EPILOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2233; EPILOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2234; EPILOG-NEXT: br i1 %exitcond, label %latchExit, label %header 2235; EPILOG: latchExit: 2236; EPILOG-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2237; EPILOG-NEXT: ret i32 %result 2238; EPILOG: for.exit2: 2239; EPILOG-NEXT: ret i32 42 2240; 2241; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2242; EPILOG-BLOCK-NEXT: entry: 2243; EPILOG-BLOCK-NEXT: br label %header 2244; EPILOG-BLOCK: header: 2245; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 2246; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 2247; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2248; EPILOG-BLOCK: for.exiting_block: 2249; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2250; EPILOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 2251; EPILOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 2252; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2253; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 2254; EPILOG-BLOCK: latch: 2255; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2256; EPILOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2257; EPILOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 2258; EPILOG-BLOCK: latchExit: 2259; EPILOG-BLOCK-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2260; EPILOG-BLOCK-NEXT: ret i32 %result 2261; EPILOG-BLOCK: for.exit2: 2262; EPILOG-BLOCK-NEXT: ret i32 42 2263; EPILOG-BLOCK: header.1: 2264; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 2265; EPILOG-BLOCK: for.exiting_block.1: 2266; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2267; EPILOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 2268; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 2269; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2270; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 2271; EPILOG-BLOCK: latch.1: 2272; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2273; EPILOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2274; EPILOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !7 2275; 2276; PROLOG-LABEL: @otherblock_latch_same_exit3( 2277; PROLOG-NEXT: entry: 2278; PROLOG-NEXT: br label %header 2279; PROLOG: header: 2280; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2281; PROLOG-NEXT: %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2282; PROLOG-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2283; PROLOG: for.exiting_block: 2284; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2285; PROLOG-NEXT: %0 = load i32, i32* %arrayidx, align 4 2286; PROLOG-NEXT: %add = add nsw i32 %0, %sum.02 2287; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2288; PROLOG-NEXT: br i1 %cmp, label %latchExit, label %latch 2289; PROLOG: latch: 2290; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2291; PROLOG-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2292; PROLOG-NEXT: br i1 %exitcond, label %latchExit, label %header 2293; PROLOG: latchExit: 2294; PROLOG-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2295; PROLOG-NEXT: ret i32 %result 2296; PROLOG: for.exit2: 2297; PROLOG-NEXT: ret i32 42 2298; 2299; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2300; PROLOG-BLOCK-NEXT: entry: 2301; PROLOG-BLOCK-NEXT: br label %header 2302; PROLOG-BLOCK: header: 2303; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ] 2304; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ] 2305; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block 2306; PROLOG-BLOCK: for.exiting_block: 2307; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2308; PROLOG-BLOCK-NEXT: %0 = load i32, i32* %arrayidx, align 4 2309; PROLOG-BLOCK-NEXT: %add = add nsw i32 %0, %sum.02 2310; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2311; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit, label %latch 2312; PROLOG-BLOCK: latch: 2313; PROLOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2314; PROLOG-BLOCK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, %n 2315; PROLOG-BLOCK-NEXT: br i1 %exitcond, label %latchExit, label %header.1 2316; PROLOG-BLOCK: latchExit: 2317; PROLOG-BLOCK-NEXT: %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2318; PROLOG-BLOCK-NEXT: ret i32 %result 2319; PROLOG-BLOCK: for.exit2: 2320; PROLOG-BLOCK-NEXT: ret i32 42 2321; PROLOG-BLOCK: header.1: 2322; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.1 2323; PROLOG-BLOCK: for.exiting_block.1: 2324; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2325; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.1, align 4 2326; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %1, %add 2327; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2328; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit, label %latch.1 2329; PROLOG-BLOCK: latch.1: 2330; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2331; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2332; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !7 2333; 2334 2335entry: 2336 br label %header 2337 2338header: 2339 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2340 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2341 br i1 %cond, label %for.exit2, label %for.exiting_block 2342 2343for.exiting_block: 2344 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2345 %0 = load i32, i32* %arrayidx, align 4 2346 %add = add nsw i32 %0, %sum.02 2347 %cmp = icmp eq i64 %n, 42 2348 br i1 %cmp, label %latchExit, label %latch 2349 2350latch: ; preds = %latch, %entry 2351 %indvars.iv.next = add i64 %indvars.iv, 1 2352 %exitcond = icmp eq i64 %indvars.iv.next, %n 2353 br i1 %exitcond, label %latchExit, label %header 2354 2355latchExit: ; preds = %latch, %entry 2356 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2357 ret i32 %result 2358 2359for.exit2: 2360 ret i32 42 2361} 2362 2363; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit). 2364; Only 2 blocks in loop: header and latch where both exit to same LatchExit. 2365define void @unique_exit(i32 %arg) { 2366; CHECK-LABEL: @unique_exit( 2367; CHECK-NEXT: entry: 2368; CHECK-NEXT: %i = icmp sgt i32 undef, %arg 2369; CHECK-NEXT: br i1 %i, label %preheader, label %returnblock 2370; CHECK: preheader: 2371; CHECK-NEXT: br label %header 2372; CHECK: header: 2373; CHECK-NEXT: br i1 true, label %latchExit, label %latch 2374; CHECK: latch: 2375; CHECK-NEXT: br label %latchExit 2376; CHECK: latchExit: 2377; CHECK-NEXT: %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ] 2378; CHECK-NEXT: br label %returnblock 2379; CHECK: returnblock: 2380; CHECK-NEXT: %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 2381; CHECK-NEXT: ret void 2382; 2383 2384entry: 2385 %i = icmp sgt i32 undef, %arg 2386 br i1 %i, label %preheader, label %returnblock 2387 2388preheader: ; preds = %entry 2389 br label %header 2390 2391header: ; preds = %preheader, %latch 2392 %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] 2393 %inc = add nsw i32 %i4, 1 2394 br i1 true, label %latchExit, label %latch 2395 2396latch: ; preds = %header 2397 %cmp = icmp slt i32 %inc, undef 2398 br i1 %cmp, label %header, label %latchExit 2399 2400latchExit: ; preds = %header, %latch 2401 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 2402 br label %returnblock 2403 2404returnblock: ; preds = %latchExit, %entry 2405 %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 2406 ret void 2407} 2408 2409; two exiting and two exit blocks. 2410; the non-latch exiting block has duplicate edges to the non-latch exit block. 2411define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 2412; EPILOG-NO-IC-LABEL: @test5( 2413; EPILOG-NO-IC-NEXT: entry: 2414; EPILOG-NO-IC-NEXT: %0 = add i64 %trip, -1 2415; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %trip, 7 2416; EPILOG-NO-IC-NEXT: %1 = icmp ult i64 %0, 7 2417; EPILOG-NO-IC-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 2418; EPILOG-NO-IC: entry.new: 2419; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 2420; EPILOG-NO-IC-NEXT: br label %loop_header 2421; EPILOG-NO-IC: loop_header: 2422; EPILOG-NO-IC-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 2423; EPILOG-NO-IC-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 2424; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 2425; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 2426; EPILOG-NO-IC: loop_exiting: 2427; EPILOG-NO-IC-NEXT: %ivy = add i64 %iv, %add 2428; EPILOG-NO-IC-NEXT: switch i64 %sum, label %loop_latch [ 2429; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2430; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2431; EPILOG-NO-IC-NEXT: ] 2432; EPILOG-NO-IC: loop_latch: 2433; EPILOG-NO-IC-NEXT: %iv_next = add nuw nsw i64 %iv, 1 2434; EPILOG-NO-IC-NEXT: %sum.next = add i64 %sum, %add 2435; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 2436; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 2437; EPILOG-NO-IC: exit1.loopexit: 2438; EPILOG-NO-IC-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 ] 2439; EPILOG-NO-IC-NEXT: br label %exit1 2440; EPILOG-NO-IC: exit1.loopexit2: 2441; EPILOG-NO-IC-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 2442; EPILOG-NO-IC-NEXT: br label %exit1 2443; EPILOG-NO-IC: exit1: 2444; EPILOG-NO-IC-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 2445; EPILOG-NO-IC-NEXT: ret i64 %result 2446; EPILOG-NO-IC: latchexit.unr-lcssa.loopexit: 2447; EPILOG-NO-IC-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 2448; EPILOG-NO-IC-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 2449; EPILOG-NO-IC-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 2450; EPILOG-NO-IC-NEXT: br label %latchexit.unr-lcssa 2451; EPILOG-NO-IC: latchexit.unr-lcssa: 2452; EPILOG-NO-IC-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 2453; EPILOG-NO-IC-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 2454; EPILOG-NO-IC-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 2455; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2456; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 2457; EPILOG-NO-IC: loop_header.epil.preheader: 2458; EPILOG-NO-IC-NEXT: br label %loop_header.epil 2459; EPILOG-NO-IC: loop_header.epil: 2460; EPILOG-NO-IC-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 2461; EPILOG-NO-IC-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 2462; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 2463; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 2464; EPILOG-NO-IC: loop_exiting.epil: 2465; EPILOG-NO-IC-NEXT: %ivy.epil = add i64 %iv.epil, %add 2466; EPILOG-NO-IC-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 2467; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit2 2468; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit2 2469; EPILOG-NO-IC-NEXT: ] 2470; EPILOG-NO-IC: loop_latch.epil: 2471; EPILOG-NO-IC-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 2472; EPILOG-NO-IC-NEXT: %sum.next.epil = add i64 %sum.epil, %add 2473; EPILOG-NO-IC-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 2474; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 2475; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 2476; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !4 2477; EPILOG-NO-IC: latchexit.epilog-lcssa: 2478; EPILOG-NO-IC-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 2479; EPILOG-NO-IC-NEXT: br label %latchexit 2480; EPILOG-NO-IC: latchexit: 2481; EPILOG-NO-IC-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 2482; EPILOG-NO-IC-NEXT: ret i64 %sum.next.lcssa 2483; EPILOG-NO-IC: loop_exiting.1: 2484; EPILOG-NO-IC-NEXT: %ivy.1 = add i64 %iv_next, %add 2485; EPILOG-NO-IC-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 2486; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2487; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2488; EPILOG-NO-IC-NEXT: ] 2489; EPILOG-NO-IC: loop_latch.1: 2490; EPILOG-NO-IC-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 2491; EPILOG-NO-IC-NEXT: %sum.next.1 = add i64 %sum.next, %add 2492; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2493; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 2494; EPILOG-NO-IC: loop_exiting.2: 2495; EPILOG-NO-IC-NEXT: %ivy.2 = add i64 %iv_next.1, %add 2496; EPILOG-NO-IC-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 2497; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2498; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2499; EPILOG-NO-IC-NEXT: ] 2500; EPILOG-NO-IC: loop_latch.2: 2501; EPILOG-NO-IC-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 2502; EPILOG-NO-IC-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 2503; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 2504; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 2505; EPILOG-NO-IC: loop_exiting.3: 2506; EPILOG-NO-IC-NEXT: %ivy.3 = add i64 %iv_next.2, %add 2507; EPILOG-NO-IC-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 2508; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2509; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2510; EPILOG-NO-IC-NEXT: ] 2511; EPILOG-NO-IC: loop_latch.3: 2512; EPILOG-NO-IC-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 2513; EPILOG-NO-IC-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 2514; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 2515; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 2516; EPILOG-NO-IC: loop_exiting.4: 2517; EPILOG-NO-IC-NEXT: %ivy.4 = add i64 %iv_next.3, %add 2518; EPILOG-NO-IC-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 2519; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2520; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2521; EPILOG-NO-IC-NEXT: ] 2522; EPILOG-NO-IC: loop_latch.4: 2523; EPILOG-NO-IC-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 2524; EPILOG-NO-IC-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 2525; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 2526; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 2527; EPILOG-NO-IC: loop_exiting.5: 2528; EPILOG-NO-IC-NEXT: %ivy.5 = add i64 %iv_next.4, %add 2529; EPILOG-NO-IC-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 2530; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2531; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2532; EPILOG-NO-IC-NEXT: ] 2533; EPILOG-NO-IC: loop_latch.5: 2534; EPILOG-NO-IC-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 2535; EPILOG-NO-IC-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 2536; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 2537; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 2538; EPILOG-NO-IC: loop_exiting.6: 2539; EPILOG-NO-IC-NEXT: %ivy.6 = add i64 %iv_next.5, %add 2540; EPILOG-NO-IC-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 2541; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2542; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2543; EPILOG-NO-IC-NEXT: ] 2544; EPILOG-NO-IC: loop_latch.6: 2545; EPILOG-NO-IC-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 2546; EPILOG-NO-IC-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 2547; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 2548; EPILOG-NO-IC-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 2549; EPILOG-NO-IC: loop_exiting.7: 2550; EPILOG-NO-IC-NEXT: %ivy.7 = add i64 %iv_next.6, %add 2551; EPILOG-NO-IC-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 2552; EPILOG-NO-IC-NEXT: i64 24, label %exit1.loopexit 2553; EPILOG-NO-IC-NEXT: i64 42, label %exit1.loopexit 2554; EPILOG-NO-IC-NEXT: ] 2555; EPILOG-NO-IC: loop_latch.7: 2556; EPILOG-NO-IC-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 2557; EPILOG-NO-IC-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 2558; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 2559; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 2560; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 2561; 2562; EPILOG-LABEL: @test5( 2563; EPILOG-NEXT: entry: 2564; EPILOG-NEXT: %0 = add i64 %trip, -1 2565; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 2566; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 2567; EPILOG-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 2568; EPILOG: entry.new: 2569; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 2570; EPILOG-NEXT: br label %loop_header 2571; EPILOG: loop_header: 2572; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 2573; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 2574; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 2575; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 2576; EPILOG: loop_exiting: 2577; EPILOG-NEXT: %ivy = add i64 %iv, %add 2578; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 2579; EPILOG-NEXT: i64 24, label %exit1.loopexit 2580; EPILOG-NEXT: i64 42, label %exit1.loopexit 2581; EPILOG-NEXT: ] 2582; EPILOG: loop_latch: 2583; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 2584; EPILOG-NEXT: %sum.next = add i64 %sum, %add 2585; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 2586; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 2587; EPILOG: exit1.loopexit: 2588; 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 ] 2589; EPILOG-NEXT: br label %exit1 2590; EPILOG: exit1.loopexit2: 2591; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 2592; EPILOG-NEXT: br label %exit1 2593; EPILOG: exit1: 2594; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 2595; EPILOG-NEXT: ret i64 %result 2596; EPILOG: latchexit.unr-lcssa.loopexit: 2597; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 2598; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 2599; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 2600; EPILOG-NEXT: br label %latchexit.unr-lcssa 2601; EPILOG: latchexit.unr-lcssa: 2602; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 2603; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 2604; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 2605; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2606; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 2607; EPILOG: loop_header.epil.preheader: 2608; EPILOG-NEXT: br label %loop_header.epil 2609; EPILOG: loop_header.epil: 2610; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 2611; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 2612; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 2613; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 2614; EPILOG: loop_exiting.epil: 2615; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 2616; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 2617; EPILOG-NEXT: i64 24, label %exit1.loopexit2 2618; EPILOG-NEXT: i64 42, label %exit1.loopexit2 2619; EPILOG-NEXT: ] 2620; EPILOG: loop_latch.epil: 2621; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 2622; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 2623; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 2624; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 2625; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 2626; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !4 2627; EPILOG: latchexit.epilog-lcssa: 2628; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 2629; EPILOG-NEXT: br label %latchexit 2630; EPILOG: latchexit: 2631; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 2632; EPILOG-NEXT: ret i64 %sum.next.lcssa 2633; EPILOG: loop_exiting.1: 2634; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 2635; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 2636; EPILOG-NEXT: i64 24, label %exit1.loopexit 2637; EPILOG-NEXT: i64 42, label %exit1.loopexit 2638; EPILOG-NEXT: ] 2639; EPILOG: loop_latch.1: 2640; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 2641; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 2642; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2643; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 2644; EPILOG: loop_exiting.2: 2645; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 2646; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 2647; EPILOG-NEXT: i64 24, label %exit1.loopexit 2648; EPILOG-NEXT: i64 42, label %exit1.loopexit 2649; EPILOG-NEXT: ] 2650; EPILOG: loop_latch.2: 2651; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 2652; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 2653; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 2654; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 2655; EPILOG: loop_exiting.3: 2656; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 2657; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 2658; EPILOG-NEXT: i64 24, label %exit1.loopexit 2659; EPILOG-NEXT: i64 42, label %exit1.loopexit 2660; EPILOG-NEXT: ] 2661; EPILOG: loop_latch.3: 2662; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 2663; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 2664; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 2665; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 2666; EPILOG: loop_exiting.4: 2667; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 2668; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 2669; EPILOG-NEXT: i64 24, label %exit1.loopexit 2670; EPILOG-NEXT: i64 42, label %exit1.loopexit 2671; EPILOG-NEXT: ] 2672; EPILOG: loop_latch.4: 2673; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 2674; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 2675; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 2676; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 2677; EPILOG: loop_exiting.5: 2678; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 2679; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 2680; EPILOG-NEXT: i64 24, label %exit1.loopexit 2681; EPILOG-NEXT: i64 42, label %exit1.loopexit 2682; EPILOG-NEXT: ] 2683; EPILOG: loop_latch.5: 2684; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 2685; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 2686; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 2687; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 2688; EPILOG: loop_exiting.6: 2689; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 2690; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 2691; EPILOG-NEXT: i64 24, label %exit1.loopexit 2692; EPILOG-NEXT: i64 42, label %exit1.loopexit 2693; EPILOG-NEXT: ] 2694; EPILOG: loop_latch.6: 2695; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 2696; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 2697; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 2698; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 2699; EPILOG: loop_exiting.7: 2700; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 2701; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 2702; EPILOG-NEXT: i64 24, label %exit1.loopexit 2703; EPILOG-NEXT: i64 42, label %exit1.loopexit 2704; EPILOG-NEXT: ] 2705; EPILOG: loop_latch.7: 2706; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 2707; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 2708; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 2709; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 2710; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 2711; 2712; EPILOG-BLOCK-LABEL: @test5( 2713; EPILOG-BLOCK-NEXT: entry: 2714; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 2715; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 2716; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 2717; EPILOG-BLOCK-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 2718; EPILOG-BLOCK: entry.new: 2719; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 2720; EPILOG-BLOCK-NEXT: br label %loop_header 2721; EPILOG-BLOCK: loop_header: 2722; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 2723; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 2724; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ] 2725; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 2726; EPILOG-BLOCK: loop_exiting: 2727; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 2728; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 2729; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 2730; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 2731; EPILOG-BLOCK-NEXT: ] 2732; EPILOG-BLOCK: loop_latch: 2733; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 2734; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 2735; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 2736; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 2737; EPILOG-BLOCK: exit1.loopexit: 2738; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 2739; EPILOG-BLOCK-NEXT: br label %exit1 2740; EPILOG-BLOCK: exit1: 2741; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 2742; EPILOG-BLOCK-NEXT: ret i64 %result 2743; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 2744; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 2745; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 2746; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 2747; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 2748; EPILOG-BLOCK: latchexit.unr-lcssa: 2749; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 2750; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 2751; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 2752; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2753; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 2754; EPILOG-BLOCK: loop_header.epil.preheader: 2755; EPILOG-BLOCK-NEXT: br label %loop_header.epil 2756; EPILOG-BLOCK: loop_header.epil: 2757; EPILOG-BLOCK-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ] 2758; EPILOG-BLOCK-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ] 2759; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 2760; EPILOG-BLOCK: loop_exiting.epil: 2761; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.epil, %add 2762; EPILOG-BLOCK-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 2763; EPILOG-BLOCK-NEXT: i64 24, label %exit1 2764; EPILOG-BLOCK-NEXT: i64 42, label %exit1 2765; EPILOG-BLOCK-NEXT: ] 2766; EPILOG-BLOCK: loop_latch.epil: 2767; EPILOG-BLOCK-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 2768; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.epil, %add 2769; EPILOG-BLOCK-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 2770; EPILOG-BLOCK-NEXT: br label %latchexit.epilog-lcssa 2771; EPILOG-BLOCK: latchexit.epilog-lcssa: 2772; EPILOG-BLOCK-NEXT: br label %latchexit 2773; EPILOG-BLOCK: latchexit: 2774; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %latchexit.epilog-lcssa ] 2775; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 2776; EPILOG-BLOCK: loop_exiting.1: 2777; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 2778; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 2779; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 2780; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 2781; EPILOG-BLOCK-NEXT: ] 2782; EPILOG-BLOCK: loop_latch.1: 2783; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 2784; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 2785; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2786; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 2787; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8 2788; 2789; PROLOG-LABEL: @test5( 2790; PROLOG-NEXT: entry: 2791; PROLOG-NEXT: %0 = add i64 %trip, -1 2792; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 2793; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2794; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 2795; PROLOG: loop_header.prol.preheader: 2796; PROLOG-NEXT: br label %loop_header.prol 2797; PROLOG: loop_header.prol: 2798; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 2799; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 2800; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ] 2801; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 2802; PROLOG: loop_exiting.prol: 2803; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 2804; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 2805; PROLOG-NEXT: i64 24, label %exit1.loopexit1 2806; PROLOG-NEXT: i64 42, label %exit1.loopexit1 2807; PROLOG-NEXT: ] 2808; PROLOG: loop_latch.prol: 2809; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 2810; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 2811; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 2812; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 2813; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 2814; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !4 2815; PROLOG: loop_header.prol.loopexit.unr-lcssa: 2816; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 2817; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 2818; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 2819; PROLOG-NEXT: br label %loop_header.prol.loopexit 2820; PROLOG: loop_header.prol.loopexit: 2821; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 2822; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 2823; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 2824; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 2825; PROLOG-NEXT: br i1 %1, label %latchexit, label %entry.new 2826; PROLOG: entry.new: 2827; PROLOG-NEXT: br label %loop_header 2828; PROLOG: loop_header: 2829; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 2830; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 2831; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 2832; PROLOG: loop_exiting: 2833; PROLOG-NEXT: %ivy = add i64 %iv, %add 2834; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 2835; PROLOG-NEXT: i64 24, label %exit1.loopexit 2836; PROLOG-NEXT: i64 42, label %exit1.loopexit 2837; PROLOG-NEXT: ] 2838; PROLOG: loop_latch: 2839; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 2840; PROLOG-NEXT: %sum.next = add i64 %sum, %add 2841; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 2842; PROLOG: exit1.loopexit: 2843; 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 ] 2844; PROLOG-NEXT: br label %exit1 2845; PROLOG: exit1.loopexit1: 2846; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 2847; PROLOG-NEXT: br label %exit1 2848; PROLOG: exit1: 2849; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 2850; PROLOG-NEXT: ret i64 %result 2851; PROLOG: latchexit.unr-lcssa: 2852; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 2853; PROLOG-NEXT: br label %latchexit 2854; PROLOG: latchexit: 2855; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 2856; PROLOG-NEXT: ret i64 %sum.next.lcssa 2857; PROLOG: loop_exiting.1: 2858; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 2859; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 2860; PROLOG-NEXT: i64 24, label %exit1.loopexit 2861; PROLOG-NEXT: i64 42, label %exit1.loopexit 2862; PROLOG-NEXT: ] 2863; PROLOG: loop_latch.1: 2864; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 2865; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 2866; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 2867; PROLOG: loop_exiting.2: 2868; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 2869; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 2870; PROLOG-NEXT: i64 24, label %exit1.loopexit 2871; PROLOG-NEXT: i64 42, label %exit1.loopexit 2872; PROLOG-NEXT: ] 2873; PROLOG: loop_latch.2: 2874; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 2875; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 2876; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 2877; PROLOG: loop_exiting.3: 2878; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 2879; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 2880; PROLOG-NEXT: i64 24, label %exit1.loopexit 2881; PROLOG-NEXT: i64 42, label %exit1.loopexit 2882; PROLOG-NEXT: ] 2883; PROLOG: loop_latch.3: 2884; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 2885; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 2886; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 2887; PROLOG: loop_exiting.4: 2888; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 2889; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 2890; PROLOG-NEXT: i64 24, label %exit1.loopexit 2891; PROLOG-NEXT: i64 42, label %exit1.loopexit 2892; PROLOG-NEXT: ] 2893; PROLOG: loop_latch.4: 2894; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 2895; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 2896; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 2897; PROLOG: loop_exiting.5: 2898; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 2899; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 2900; PROLOG-NEXT: i64 24, label %exit1.loopexit 2901; PROLOG-NEXT: i64 42, label %exit1.loopexit 2902; PROLOG-NEXT: ] 2903; PROLOG: loop_latch.5: 2904; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 2905; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 2906; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 2907; PROLOG: loop_exiting.6: 2908; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 2909; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 2910; PROLOG-NEXT: i64 24, label %exit1.loopexit 2911; PROLOG-NEXT: i64 42, label %exit1.loopexit 2912; PROLOG-NEXT: ] 2913; PROLOG: loop_latch.6: 2914; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 2915; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 2916; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 2917; PROLOG: loop_exiting.7: 2918; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 2919; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 2920; PROLOG-NEXT: i64 24, label %exit1.loopexit 2921; PROLOG-NEXT: i64 42, label %exit1.loopexit 2922; PROLOG-NEXT: ] 2923; PROLOG: loop_latch.7: 2924; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 2925; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 2926; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 2927; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 2928; 2929; PROLOG-BLOCK-LABEL: @test5( 2930; PROLOG-BLOCK-NEXT: entry: 2931; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 2932; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 2933; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2934; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 2935; PROLOG-BLOCK: loop_header.prol.preheader: 2936; PROLOG-BLOCK-NEXT: br label %loop_header.prol 2937; PROLOG-BLOCK: loop_header.prol: 2938; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 2939; PROLOG-BLOCK: loop_exiting.prol: 2940; PROLOG-BLOCK-NEXT: %ivy.prol = add i64 0, %add 2941; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 2942; PROLOG-BLOCK-NEXT: i64 24, label %exit1 2943; PROLOG-BLOCK-NEXT: i64 42, label %exit1 2944; PROLOG-BLOCK-NEXT: ] 2945; PROLOG-BLOCK: loop_latch.prol: 2946; PROLOG-BLOCK-NEXT: %iv_next.prol = add nuw nsw i64 0, 1 2947; PROLOG-BLOCK-NEXT: %sum.next.prol = add i64 0, %add 2948; PROLOG-BLOCK-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 2949; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 2950; PROLOG-BLOCK: loop_header.prol.loopexit: 2951; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ] 2952; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ] 2953; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.prol, %loop_latch.prol ] 2954; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 2955; PROLOG-BLOCK-NEXT: br i1 %1, label %latchexit, label %entry.new 2956; PROLOG-BLOCK: entry.new: 2957; PROLOG-BLOCK-NEXT: br label %loop_header 2958; PROLOG-BLOCK: loop_header: 2959; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 2960; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 2961; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 2962; PROLOG-BLOCK: loop_exiting: 2963; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 2964; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 2965; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 2966; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 2967; PROLOG-BLOCK-NEXT: ] 2968; PROLOG-BLOCK: loop_latch: 2969; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 2970; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 2971; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 2972; PROLOG-BLOCK: exit1.loopexit: 2973; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 2974; PROLOG-BLOCK-NEXT: br label %exit1 2975; PROLOG-BLOCK: exit1: 2976; PROLOG-BLOCK-NEXT: %result = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 2977; PROLOG-BLOCK-NEXT: ret i64 %result 2978; PROLOG-BLOCK: latchexit.unr-lcssa: 2979; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 2980; PROLOG-BLOCK-NEXT: br label %latchexit 2981; PROLOG-BLOCK: latchexit: 2982; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 2983; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 2984; PROLOG-BLOCK: loop_exiting.1: 2985; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 2986; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 2987; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 2988; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 2989; PROLOG-BLOCK-NEXT: ] 2990; PROLOG-BLOCK: loop_latch.1: 2991; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 2992; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 2993; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 2994; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8 2995; 2996 2997entry: 2998 br label %loop_header 2999 3000loop_header: 3001 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3002 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3003 br i1 %cond, label %loop_latch, label %loop_exiting 3004 3005loop_exiting: 3006 %ivy = add i64 %iv, %add 3007 switch i64 %sum, label %loop_latch [ 3008 i64 24, label %exit1 3009 i64 42, label %exit1 3010 ] 3011 3012loop_latch: 3013 %iv_next = add nuw nsw i64 %iv, 1 3014 %sum.next = add i64 %sum, %add 3015 %cmp = icmp ne i64 %iv_next, %trip 3016 br i1 %cmp, label %loop_header, label %latchexit 3017 3018exit1: 3019 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3020 ret i64 %result 3021 3022latchexit: 3023 ret i64 %sum.next 3024} 3025 3026; test when exit blocks have successors. 3027define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 3028; EPILOG-NO-IC-LABEL: @test6( 3029; EPILOG-NO-IC-NEXT: entry: 3030; EPILOG-NO-IC-NEXT: %0 = add i64 %n, -1 3031; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %n, 7 3032; EPILOG-NO-IC-NEXT: %1 = icmp ult i64 %0, 7 3033; EPILOG-NO-IC-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3034; EPILOG-NO-IC: entry.new: 3035; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3036; EPILOG-NO-IC-NEXT: br label %header 3037; EPILOG-NO-IC: header: 3038; EPILOG-NO-IC-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3039; EPILOG-NO-IC-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3040; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 3041; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3042; EPILOG-NO-IC: for.exiting_block: 3043; EPILOG-NO-IC-NEXT: %cmp = icmp eq i64 %n, 42 3044; EPILOG-NO-IC-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3045; EPILOG-NO-IC: latch: 3046; EPILOG-NO-IC-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3047; EPILOG-NO-IC-NEXT: %load = load i32, i32* %arrayidx, align 4 3048; EPILOG-NO-IC-NEXT: %add = add nsw i32 %load, %sum.02 3049; EPILOG-NO-IC-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3050; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 3051; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3052; EPILOG-NO-IC: latch_exit.unr-lcssa.loopexit: 3053; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3054; EPILOG-NO-IC-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3055; EPILOG-NO-IC-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3056; EPILOG-NO-IC-NEXT: br label %latch_exit.unr-lcssa 3057; EPILOG-NO-IC: latch_exit.unr-lcssa: 3058; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3059; EPILOG-NO-IC-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3060; EPILOG-NO-IC-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3061; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3062; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3063; EPILOG-NO-IC: header.epil.preheader: 3064; EPILOG-NO-IC-NEXT: br label %header.epil 3065; EPILOG-NO-IC: header.epil: 3066; EPILOG-NO-IC-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3067; EPILOG-NO-IC-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3068; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 3069; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3070; EPILOG-NO-IC: for.exiting_block.epil: 3071; EPILOG-NO-IC-NEXT: %cmp.epil = icmp eq i64 %n, 42 3072; EPILOG-NO-IC-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3073; EPILOG-NO-IC: latch.epil: 3074; EPILOG-NO-IC-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3075; EPILOG-NO-IC-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3076; EPILOG-NO-IC-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3077; EPILOG-NO-IC-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3078; EPILOG-NO-IC-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3079; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3080; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3081; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !5 3082; EPILOG-NO-IC: latch_exit.epilog-lcssa: 3083; EPILOG-NO-IC-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3084; EPILOG-NO-IC-NEXT: br label %latch_exit 3085; EPILOG-NO-IC: latch_exit: 3086; EPILOG-NO-IC-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3087; EPILOG-NO-IC-NEXT: ret i32 %sum.0.lcssa 3088; EPILOG-NO-IC: for.exit2.loopexit: 3089; EPILOG-NO-IC-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 ] 3090; EPILOG-NO-IC-NEXT: br label %for.exit2 3091; EPILOG-NO-IC: for.exit2.loopexit2: 3092; EPILOG-NO-IC-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3093; EPILOG-NO-IC-NEXT: br label %for.exit2 3094; EPILOG-NO-IC: for.exit2: 3095; EPILOG-NO-IC-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3096; EPILOG-NO-IC-NEXT: %addx = add i32 %retval, %x 3097; EPILOG-NO-IC-NEXT: br i1 %cond, label %exit_true, label %exit_false 3098; EPILOG-NO-IC: exit_true: 3099; EPILOG-NO-IC-NEXT: ret i32 %retval 3100; EPILOG-NO-IC: exit_false: 3101; EPILOG-NO-IC-NEXT: ret i32 %addx 3102; EPILOG-NO-IC: for.exiting_block.1: 3103; EPILOG-NO-IC-NEXT: %cmp.1 = icmp eq i64 %n, 42 3104; EPILOG-NO-IC-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3105; EPILOG-NO-IC: latch.1: 3106; EPILOG-NO-IC-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3107; EPILOG-NO-IC-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3108; EPILOG-NO-IC-NEXT: %add.1 = add nsw i32 %load.1, %add 3109; EPILOG-NO-IC-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 3110; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3111; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3112; EPILOG-NO-IC: for.exiting_block.2: 3113; EPILOG-NO-IC-NEXT: %cmp.2 = icmp eq i64 %n, 42 3114; EPILOG-NO-IC-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3115; EPILOG-NO-IC: latch.2: 3116; EPILOG-NO-IC-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3117; EPILOG-NO-IC-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3118; EPILOG-NO-IC-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3119; EPILOG-NO-IC-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 3120; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3121; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3122; EPILOG-NO-IC: for.exiting_block.3: 3123; EPILOG-NO-IC-NEXT: %cmp.3 = icmp eq i64 %n, 42 3124; EPILOG-NO-IC-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3125; EPILOG-NO-IC: latch.3: 3126; EPILOG-NO-IC-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3127; EPILOG-NO-IC-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3128; EPILOG-NO-IC-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3129; EPILOG-NO-IC-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 3130; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3131; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3132; EPILOG-NO-IC: for.exiting_block.4: 3133; EPILOG-NO-IC-NEXT: %cmp.4 = icmp eq i64 %n, 42 3134; EPILOG-NO-IC-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3135; EPILOG-NO-IC: latch.4: 3136; EPILOG-NO-IC-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3137; EPILOG-NO-IC-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3138; EPILOG-NO-IC-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3139; EPILOG-NO-IC-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 3140; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3141; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3142; EPILOG-NO-IC: for.exiting_block.5: 3143; EPILOG-NO-IC-NEXT: %cmp.5 = icmp eq i64 %n, 42 3144; EPILOG-NO-IC-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3145; EPILOG-NO-IC: latch.5: 3146; EPILOG-NO-IC-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3147; EPILOG-NO-IC-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3148; EPILOG-NO-IC-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3149; EPILOG-NO-IC-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 3150; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3151; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3152; EPILOG-NO-IC: for.exiting_block.6: 3153; EPILOG-NO-IC-NEXT: %cmp.6 = icmp eq i64 %n, 42 3154; EPILOG-NO-IC-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3155; EPILOG-NO-IC: latch.6: 3156; EPILOG-NO-IC-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3157; EPILOG-NO-IC-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3158; EPILOG-NO-IC-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3159; EPILOG-NO-IC-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 3160; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3161; EPILOG-NO-IC-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3162; EPILOG-NO-IC: for.exiting_block.7: 3163; EPILOG-NO-IC-NEXT: %cmp.7 = icmp eq i64 %n, 42 3164; EPILOG-NO-IC-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3165; EPILOG-NO-IC: latch.7: 3166; EPILOG-NO-IC-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3167; EPILOG-NO-IC-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3168; EPILOG-NO-IC-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3169; EPILOG-NO-IC-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3170; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3171; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 3172; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3173; 3174; EPILOG-LABEL: @test6( 3175; EPILOG-NEXT: entry: 3176; EPILOG-NEXT: %0 = add i64 %n, -1 3177; EPILOG-NEXT: %xtraiter = and i64 %n, 7 3178; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3179; EPILOG-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3180; EPILOG: entry.new: 3181; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3182; EPILOG-NEXT: br label %header 3183; EPILOG: header: 3184; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3185; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3186; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 3187; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3188; EPILOG: for.exiting_block: 3189; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3190; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3191; EPILOG: latch: 3192; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3193; EPILOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3194; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3195; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3196; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 3197; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3198; EPILOG: latch_exit.unr-lcssa.loopexit: 3199; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3200; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3201; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3202; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3203; EPILOG: latch_exit.unr-lcssa: 3204; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3205; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3206; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3207; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3208; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3209; EPILOG: header.epil.preheader: 3210; EPILOG-NEXT: br label %header.epil 3211; EPILOG: header.epil: 3212; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3213; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3214; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 3215; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3216; EPILOG: for.exiting_block.epil: 3217; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3218; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3219; EPILOG: latch.epil: 3220; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3221; EPILOG-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3222; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3223; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3224; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3225; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3226; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3227; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !5 3228; EPILOG: latch_exit.epilog-lcssa: 3229; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3230; EPILOG-NEXT: br label %latch_exit 3231; EPILOG: latch_exit: 3232; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3233; EPILOG-NEXT: ret i32 %sum.0.lcssa 3234; EPILOG: for.exit2.loopexit: 3235; 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 ] 3236; EPILOG-NEXT: br label %for.exit2 3237; EPILOG: for.exit2.loopexit2: 3238; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3239; EPILOG-NEXT: br label %for.exit2 3240; EPILOG: for.exit2: 3241; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3242; EPILOG-NEXT: %addx = add i32 %retval, %x 3243; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3244; EPILOG: exit_true: 3245; EPILOG-NEXT: ret i32 %retval 3246; EPILOG: exit_false: 3247; EPILOG-NEXT: ret i32 %addx 3248; EPILOG: for.exiting_block.1: 3249; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3250; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3251; EPILOG: latch.1: 3252; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3253; EPILOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3254; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3255; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 3256; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3257; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3258; EPILOG: for.exiting_block.2: 3259; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3260; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3261; EPILOG: latch.2: 3262; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3263; EPILOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3264; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3265; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 3266; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3267; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3268; EPILOG: for.exiting_block.3: 3269; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3270; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3271; EPILOG: latch.3: 3272; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3273; EPILOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3274; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3275; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 3276; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3277; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3278; EPILOG: for.exiting_block.4: 3279; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3280; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3281; EPILOG: latch.4: 3282; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3283; EPILOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3284; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3285; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 3286; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3287; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3288; EPILOG: for.exiting_block.5: 3289; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3290; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3291; EPILOG: latch.5: 3292; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3293; EPILOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3294; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3295; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 3296; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3297; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3298; EPILOG: for.exiting_block.6: 3299; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3300; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3301; EPILOG: latch.6: 3302; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3303; EPILOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3304; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3305; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 3306; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3307; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3308; EPILOG: for.exiting_block.7: 3309; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3310; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3311; EPILOG: latch.7: 3312; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3313; EPILOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3314; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3315; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3316; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3317; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 3318; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3319; 3320; EPILOG-BLOCK-LABEL: @test6( 3321; EPILOG-BLOCK-NEXT: entry: 3322; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 3323; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3324; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3325; EPILOG-BLOCK-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3326; EPILOG-BLOCK: entry.new: 3327; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3328; EPILOG-BLOCK-NEXT: br label %header 3329; EPILOG-BLOCK: header: 3330; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3331; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 3332; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ] 3333; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3334; EPILOG-BLOCK: for.exiting_block: 3335; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3336; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3337; EPILOG-BLOCK: latch: 3338; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3339; EPILOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3340; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3341; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3342; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 3343; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3344; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 3345; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 3346; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 3347; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 3348; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 3349; EPILOG-BLOCK: latch_exit.unr-lcssa: 3350; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3351; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3352; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3353; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3354; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3355; EPILOG-BLOCK: header.epil.preheader: 3356; EPILOG-BLOCK-NEXT: br label %header.epil 3357; EPILOG-BLOCK: header.epil: 3358; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 3359; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 3360; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 3361; EPILOG-BLOCK: for.exiting_block.epil: 3362; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 3363; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 3364; EPILOG-BLOCK: latch.epil: 3365; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3366; EPILOG-BLOCK-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3367; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3368; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3369; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3370; EPILOG-BLOCK-NEXT: br label %latch_exit.epilog-lcssa 3371; EPILOG-BLOCK: latch_exit.epilog-lcssa: 3372; EPILOG-BLOCK-NEXT: br label %latch_exit 3373; EPILOG-BLOCK: latch_exit: 3374; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch_exit.epilog-lcssa ] 3375; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 3376; EPILOG-BLOCK: for.exit2.loopexit: 3377; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 3378; EPILOG-BLOCK-NEXT: br label %for.exit2 3379; EPILOG-BLOCK: for.exit2: 3380; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 3381; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 3382; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 3383; EPILOG-BLOCK: exit_true: 3384; EPILOG-BLOCK-NEXT: ret i32 %retval 3385; EPILOG-BLOCK: exit_false: 3386; EPILOG-BLOCK-NEXT: ret i32 %addx 3387; EPILOG-BLOCK: for.exiting_block.1: 3388; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3389; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3390; EPILOG-BLOCK: latch.1: 3391; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3392; EPILOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3393; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3394; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3395; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3396; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 3397; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9 3398; 3399; PROLOG-LABEL: @test6( 3400; PROLOG-NEXT: entry: 3401; PROLOG-NEXT: %0 = add i64 %n, -1 3402; PROLOG-NEXT: %xtraiter = and i64 %n, 7 3403; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3404; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3405; PROLOG: header.prol.preheader: 3406; PROLOG-NEXT: br label %header.prol 3407; PROLOG: header.prol: 3408; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3409; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3410; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 3411; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 3412; PROLOG: for.exiting_block.prol: 3413; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 3414; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 3415; PROLOG: latch.prol: 3416; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 3417; PROLOG-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 3418; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 3419; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 3420; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3421; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 3422; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 3423; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5 3424; PROLOG: header.prol.loopexit.unr-lcssa: 3425; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3426; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 3427; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3428; PROLOG-NEXT: br label %header.prol.loopexit 3429; PROLOG: header.prol.loopexit: 3430; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 3431; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 3432; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 3433; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 3434; PROLOG-NEXT: br i1 %1, label %latch_exit, label %entry.new 3435; PROLOG: entry.new: 3436; PROLOG-NEXT: br label %header 3437; PROLOG: header: 3438; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3439; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 3440; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3441; PROLOG: for.exiting_block: 3442; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 3443; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3444; PROLOG: latch: 3445; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3446; PROLOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3447; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 3448; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 3449; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3450; PROLOG: latch_exit.unr-lcssa: 3451; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 3452; PROLOG-NEXT: br label %latch_exit 3453; PROLOG: latch_exit: 3454; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 3455; PROLOG-NEXT: ret i32 %sum.0.lcssa 3456; PROLOG: for.exit2.loopexit: 3457; 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 ] 3458; PROLOG-NEXT: br label %for.exit2 3459; PROLOG: for.exit2.loopexit1: 3460; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 3461; PROLOG-NEXT: br label %for.exit2 3462; PROLOG: for.exit2: 3463; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 3464; PROLOG-NEXT: %addx = add i32 %retval, %x 3465; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3466; PROLOG: exit_true: 3467; PROLOG-NEXT: ret i32 %retval 3468; PROLOG: exit_false: 3469; PROLOG-NEXT: ret i32 %addx 3470; PROLOG: for.exiting_block.1: 3471; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3472; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3473; PROLOG: latch.1: 3474; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3475; PROLOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3476; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3477; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3478; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3479; PROLOG: for.exiting_block.2: 3480; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3481; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3482; PROLOG: latch.2: 3483; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3484; PROLOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3485; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3486; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 3487; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3488; PROLOG: for.exiting_block.3: 3489; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3490; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3491; PROLOG: latch.3: 3492; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3493; PROLOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3494; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3495; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 3496; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3497; PROLOG: for.exiting_block.4: 3498; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3499; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3500; PROLOG: latch.4: 3501; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3502; PROLOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3503; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3504; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 3505; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3506; PROLOG: for.exiting_block.5: 3507; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3508; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3509; PROLOG: latch.5: 3510; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3511; PROLOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3512; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3513; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 3514; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3515; PROLOG: for.exiting_block.6: 3516; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3517; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3518; PROLOG: latch.6: 3519; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3520; PROLOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3521; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3522; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 3523; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3524; PROLOG: for.exiting_block.7: 3525; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3526; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3527; PROLOG: latch.7: 3528; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3529; PROLOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3530; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3531; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3532; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 3533; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 3534; 3535; PROLOG-BLOCK-LABEL: @test6( 3536; PROLOG-BLOCK-NEXT: entry: 3537; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 3538; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3539; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3540; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3541; PROLOG-BLOCK: header.prol.preheader: 3542; PROLOG-BLOCK-NEXT: br label %header.prol 3543; PROLOG-BLOCK: header.prol: 3544; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 3545; PROLOG-BLOCK: for.exiting_block.prol: 3546; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 3547; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 3548; PROLOG-BLOCK: latch.prol: 3549; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 3550; PROLOG-BLOCK-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 3551; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %load.prol, 0 3552; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 3553; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3554; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3555; PROLOG-BLOCK: header.prol.loopexit: 3556; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 3557; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 3558; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 3559; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3560; PROLOG-BLOCK-NEXT: br i1 %1, label %latch_exit, label %entry.new 3561; PROLOG-BLOCK: entry.new: 3562; PROLOG-BLOCK-NEXT: br label %header 3563; PROLOG-BLOCK: header: 3564; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3565; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 3566; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3567; PROLOG-BLOCK: for.exiting_block: 3568; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3569; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3570; PROLOG-BLOCK: latch: 3571; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3572; PROLOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3573; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3574; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 3575; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3576; PROLOG-BLOCK: latch_exit.unr-lcssa: 3577; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 3578; PROLOG-BLOCK-NEXT: br label %latch_exit 3579; PROLOG-BLOCK: latch_exit: 3580; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 3581; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 3582; PROLOG-BLOCK: for.exit2.loopexit: 3583; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 3584; PROLOG-BLOCK-NEXT: br label %for.exit2 3585; PROLOG-BLOCK: for.exit2: 3586; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 3587; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 3588; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 3589; PROLOG-BLOCK: exit_true: 3590; PROLOG-BLOCK-NEXT: ret i32 %retval 3591; PROLOG-BLOCK: exit_false: 3592; PROLOG-BLOCK-NEXT: ret i32 %addx 3593; PROLOG-BLOCK: for.exiting_block.1: 3594; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3595; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3596; PROLOG-BLOCK: latch.1: 3597; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3598; PROLOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3599; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3600; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3601; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 3602; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9 3603; 3604 3605entry: 3606 br label %header 3607 3608header: 3609 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 3610 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 3611 br i1 false, label %for.exit2, label %for.exiting_block 3612 3613for.exiting_block: 3614 %cmp = icmp eq i64 %n, 42 3615 br i1 %cmp, label %for.exit2, label %latch 3616 3617latch: 3618 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3619 %load = load i32, i32* %arrayidx, align 4 3620 %add = add nsw i32 %load, %sum.02 3621 %indvars.iv.next = add i64 %indvars.iv, 1 3622 %exitcond = icmp eq i64 %indvars.iv.next, %n 3623 br i1 %exitcond, label %latch_exit, label %header 3624 3625latch_exit: 3626 %sum.0.lcssa = phi i32 [ %add, %latch ] 3627 ret i32 %sum.0.lcssa 3628 3629for.exit2: 3630 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 3631 %addx = add i32 %retval, %x 3632 br i1 %cond, label %exit_true, label %exit_false 3633 3634exit_true: 3635 ret i32 %retval 3636 3637exit_false: 3638 ret i32 %addx 3639} 3640 3641; test when value in exit block does not have VMap. 3642define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 3643; EPILOG-NO-IC-LABEL: @test7( 3644; EPILOG-NO-IC-NEXT: bb: 3645; EPILOG-NO-IC-NEXT: %i = icmp slt i32 undef, 2 3646; EPILOG-NO-IC-NEXT: %sext = sext i32 undef to i64 3647; EPILOG-NO-IC-NEXT: %shft = ashr exact i32 %arg, 16 3648; EPILOG-NO-IC-NEXT: br i1 %i, label %loopexit2, label %preheader 3649; EPILOG-NO-IC: preheader: 3650; EPILOG-NO-IC-NEXT: %0 = add nsw i64 %sext, -1 3651; EPILOG-NO-IC-NEXT: %1 = add nsw i64 %sext, -2 3652; EPILOG-NO-IC-NEXT: %xtraiter = and i64 %0, 7 3653; EPILOG-NO-IC-NEXT: %2 = icmp ult i64 %1, 7 3654; EPILOG-NO-IC-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 3655; EPILOG-NO-IC: preheader.new: 3656; EPILOG-NO-IC-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3657; EPILOG-NO-IC-NEXT: br label %header 3658; EPILOG-NO-IC: header: 3659; EPILOG-NO-IC-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 3660; EPILOG-NO-IC-NEXT: %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ] 3661; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 3662; EPILOG-NO-IC: latch: 3663; EPILOG-NO-IC-NEXT: %add = add nuw nsw i64 %i6, 1 3664; EPILOG-NO-IC-NEXT: %niter.nsub = sub i64 %niter, 1 3665; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 3666; EPILOG-NO-IC: latchexit.unr-lcssa.loopexit: 3667; EPILOG-NO-IC-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 3668; EPILOG-NO-IC-NEXT: br label %latchexit.unr-lcssa 3669; EPILOG-NO-IC: latchexit.unr-lcssa: 3670; EPILOG-NO-IC-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 3671; EPILOG-NO-IC-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3672; EPILOG-NO-IC-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 3673; EPILOG-NO-IC: header.epil.preheader: 3674; EPILOG-NO-IC-NEXT: br label %header.epil 3675; EPILOG-NO-IC: header.epil: 3676; EPILOG-NO-IC-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 3677; EPILOG-NO-IC-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 3678; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 3679; EPILOG-NO-IC: latch.epil: 3680; EPILOG-NO-IC-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 3681; EPILOG-NO-IC-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 3682; EPILOG-NO-IC-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3683; EPILOG-NO-IC-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3684; EPILOG-NO-IC-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !6 3685; EPILOG-NO-IC: latchexit.epilog-lcssa: 3686; EPILOG-NO-IC-NEXT: br label %latchexit 3687; EPILOG-NO-IC: latchexit: 3688; EPILOG-NO-IC-NEXT: unreachable 3689; EPILOG-NO-IC: loopexit2: 3690; EPILOG-NO-IC-NEXT: ret i32 %shft 3691; EPILOG-NO-IC: loopexit1.loopexit: 3692; EPILOG-NO-IC-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 ] 3693; EPILOG-NO-IC-NEXT: br label %loopexit1 3694; EPILOG-NO-IC: loopexit1.loopexit1: 3695; EPILOG-NO-IC-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 3696; EPILOG-NO-IC-NEXT: br label %loopexit1 3697; EPILOG-NO-IC: loopexit1: 3698; EPILOG-NO-IC-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 3699; EPILOG-NO-IC-NEXT: ret i32 %sext3 3700; EPILOG-NO-IC: latch.1: 3701; EPILOG-NO-IC-NEXT: %add.1 = add nuw nsw i64 %add, 1 3702; EPILOG-NO-IC-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3703; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 3704; EPILOG-NO-IC: latch.2: 3705; EPILOG-NO-IC-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 3706; EPILOG-NO-IC-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3707; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 3708; EPILOG-NO-IC: latch.3: 3709; EPILOG-NO-IC-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 3710; EPILOG-NO-IC-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3711; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 3712; EPILOG-NO-IC: latch.4: 3713; EPILOG-NO-IC-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 3714; EPILOG-NO-IC-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3715; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 3716; EPILOG-NO-IC: latch.5: 3717; EPILOG-NO-IC-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 3718; EPILOG-NO-IC-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3719; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 3720; EPILOG-NO-IC: latch.6: 3721; EPILOG-NO-IC-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 3722; EPILOG-NO-IC-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3723; EPILOG-NO-IC-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 3724; EPILOG-NO-IC: latch.7: 3725; EPILOG-NO-IC-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 3726; EPILOG-NO-IC-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3727; EPILOG-NO-IC-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 3728; EPILOG-NO-IC-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 3729; 3730; EPILOG-LABEL: @test7( 3731; EPILOG-NEXT: bb: 3732; EPILOG-NEXT: %i = icmp slt i32 undef, 2 3733; EPILOG-NEXT: %sext = sext i32 undef to i64 3734; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 3735; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 3736; EPILOG: preheader: 3737; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 3738; EPILOG-NEXT: %1 = add nsw i64 %sext, -2 3739; EPILOG-NEXT: %xtraiter = and i64 %0, 7 3740; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 3741; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 3742; EPILOG: preheader.new: 3743; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3744; EPILOG-NEXT: br label %header 3745; EPILOG: header: 3746; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 3747; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ] 3748; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 3749; EPILOG: latch: 3750; EPILOG-NEXT: %add = add nuw nsw i64 %i6, 1 3751; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 3752; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 3753; EPILOG: latchexit.unr-lcssa.loopexit: 3754; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 3755; EPILOG-NEXT: br label %latchexit.unr-lcssa 3756; EPILOG: latchexit.unr-lcssa: 3757; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 3758; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3759; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 3760; EPILOG: header.epil.preheader: 3761; EPILOG-NEXT: br label %header.epil 3762; EPILOG: header.epil: 3763; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 3764; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 3765; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 3766; EPILOG: latch.epil: 3767; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 3768; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 3769; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3770; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3771; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !6 3772; EPILOG: latchexit.epilog-lcssa: 3773; EPILOG-NEXT: br label %latchexit 3774; EPILOG: latchexit: 3775; EPILOG-NEXT: unreachable 3776; EPILOG: loopexit2: 3777; EPILOG-NEXT: ret i32 %shft 3778; EPILOG: loopexit1.loopexit: 3779; 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 ] 3780; EPILOG-NEXT: br label %loopexit1 3781; EPILOG: loopexit1.loopexit1: 3782; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 3783; EPILOG-NEXT: br label %loopexit1 3784; EPILOG: loopexit1: 3785; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 3786; EPILOG-NEXT: ret i32 %sext3 3787; EPILOG: latch.1: 3788; EPILOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 3789; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3790; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 3791; EPILOG: latch.2: 3792; EPILOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 3793; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3794; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 3795; EPILOG: latch.3: 3796; EPILOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 3797; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3798; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 3799; EPILOG: latch.4: 3800; EPILOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 3801; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3802; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 3803; EPILOG: latch.5: 3804; EPILOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 3805; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3806; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 3807; EPILOG: latch.6: 3808; EPILOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 3809; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3810; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 3811; EPILOG: latch.7: 3812; EPILOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 3813; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3814; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 3815; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 3816; 3817; EPILOG-BLOCK-LABEL: @test7( 3818; EPILOG-BLOCK-NEXT: bb: 3819; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 3820; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 3821; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 3822; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 3823; EPILOG-BLOCK: preheader: 3824; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 3825; EPILOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 3826; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3827; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3828; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 3829; EPILOG-BLOCK: preheader.new: 3830; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3831; EPILOG-BLOCK-NEXT: br label %header 3832; EPILOG-BLOCK: header: 3833; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 3834; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.1, %latch.1 ] 3835; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 3836; EPILOG-BLOCK: latch: 3837; EPILOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 3838; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 3839; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 3840; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3841; EPILOG-BLOCK-NEXT: %i6.unr.ph = phi i64 [ %add.1, %latch.1 ] 3842; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3843; EPILOG-BLOCK: latchexit.unr-lcssa: 3844; EPILOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 3845; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3846; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 3847; EPILOG-BLOCK: header.epil.preheader: 3848; EPILOG-BLOCK-NEXT: br label %header.epil 3849; EPILOG-BLOCK: header.epil: 3850; EPILOG-BLOCK-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ] 3851; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 3852; EPILOG-BLOCK: latch.epil: 3853; EPILOG-BLOCK-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 3854; EPILOG-BLOCK-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 3855; EPILOG-BLOCK-NEXT: br label %latchexit.epilog-lcssa 3856; EPILOG-BLOCK: latchexit.epilog-lcssa: 3857; EPILOG-BLOCK-NEXT: br label %latchexit 3858; EPILOG-BLOCK: latchexit: 3859; EPILOG-BLOCK-NEXT: unreachable 3860; EPILOG-BLOCK: loopexit2: 3861; EPILOG-BLOCK-NEXT: ret i32 %shft 3862; EPILOG-BLOCK: loopexit1.loopexit: 3863; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 3864; EPILOG-BLOCK-NEXT: br label %loopexit1 3865; EPILOG-BLOCK: loopexit1: 3866; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 3867; EPILOG-BLOCK-NEXT: ret i32 %sext3 3868; EPILOG-BLOCK: latch.1: 3869; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 3870; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3871; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 3872; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10 3873; 3874; PROLOG-LABEL: @test7( 3875; PROLOG-NEXT: bb: 3876; PROLOG-NEXT: %i = icmp slt i32 undef, 2 3877; PROLOG-NEXT: %sext = sext i32 undef to i64 3878; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 3879; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 3880; PROLOG: preheader: 3881; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 3882; PROLOG-NEXT: %1 = add nsw i64 %sext, -2 3883; PROLOG-NEXT: %xtraiter = and i64 %0, 7 3884; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3885; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3886; PROLOG: header.prol.preheader: 3887; PROLOG-NEXT: br label %header.prol 3888; PROLOG: header.prol: 3889; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 3890; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 3891; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 3892; PROLOG: latch.prol: 3893; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 3894; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 3895; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 3896; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 3897; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6 3898; PROLOG: header.prol.loopexit.unr-lcssa: 3899; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 3900; PROLOG-NEXT: br label %header.prol.loopexit 3901; PROLOG: header.prol.loopexit: 3902; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 3903; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 3904; PROLOG-NEXT: br i1 %2, label %latchexit, label %preheader.new 3905; PROLOG: preheader.new: 3906; PROLOG-NEXT: br label %header 3907; PROLOG: header: 3908; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 3909; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 3910; PROLOG: latch: 3911; PROLOG-NEXT: %add = add nuw nsw i64 %i6, 1 3912; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 3913; PROLOG: latchexit.unr-lcssa: 3914; PROLOG-NEXT: br label %latchexit 3915; PROLOG: latchexit: 3916; PROLOG-NEXT: unreachable 3917; PROLOG: loopexit2: 3918; PROLOG-NEXT: ret i32 %shft 3919; PROLOG: loopexit1.loopexit: 3920; 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 ] 3921; PROLOG-NEXT: br label %loopexit1 3922; PROLOG: loopexit1.loopexit1: 3923; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 3924; PROLOG-NEXT: br label %loopexit1 3925; PROLOG: loopexit1: 3926; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 3927; PROLOG-NEXT: ret i32 %sext3 3928; PROLOG: latch.1: 3929; PROLOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 3930; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 3931; PROLOG: latch.2: 3932; PROLOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 3933; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 3934; PROLOG: latch.3: 3935; PROLOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 3936; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 3937; PROLOG: latch.4: 3938; PROLOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 3939; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 3940; PROLOG: latch.5: 3941; PROLOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 3942; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 3943; PROLOG: latch.6: 3944; PROLOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 3945; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 3946; PROLOG: latch.7: 3947; PROLOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 3948; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 3949; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 3950; 3951; PROLOG-BLOCK-LABEL: @test7( 3952; PROLOG-BLOCK-NEXT: bb: 3953; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 3954; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 3955; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 3956; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 3957; PROLOG-BLOCK: preheader: 3958; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 3959; PROLOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 3960; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3961; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3962; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3963; PROLOG-BLOCK: header.prol.preheader: 3964; PROLOG-BLOCK-NEXT: br label %header.prol 3965; PROLOG-BLOCK: header.prol: 3966; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 3967; PROLOG-BLOCK: latch.prol: 3968; PROLOG-BLOCK-NEXT: %add.prol = add nuw nsw i64 1, 1 3969; PROLOG-BLOCK-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 3970; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3971; PROLOG-BLOCK: header.prol.loopexit: 3972; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %add.prol, %latch.prol ] 3973; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3974; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %preheader.new 3975; PROLOG-BLOCK: preheader.new: 3976; PROLOG-BLOCK-NEXT: br label %header 3977; PROLOG-BLOCK: header: 3978; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 3979; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 3980; PROLOG-BLOCK: latch: 3981; PROLOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 3982; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 3983; PROLOG-BLOCK: latchexit.unr-lcssa: 3984; PROLOG-BLOCK-NEXT: br label %latchexit 3985; PROLOG-BLOCK: latchexit: 3986; PROLOG-BLOCK-NEXT: unreachable 3987; PROLOG-BLOCK: loopexit2: 3988; PROLOG-BLOCK-NEXT: ret i32 %shft 3989; PROLOG-BLOCK: loopexit1.loopexit: 3990; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 3991; PROLOG-BLOCK-NEXT: br label %loopexit1 3992; PROLOG-BLOCK: loopexit1: 3993; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 3994; PROLOG-BLOCK-NEXT: ret i32 %sext3 3995; PROLOG-BLOCK: latch.1: 3996; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 3997; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 3998; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10 3999; 4000bb: 4001 %i = icmp slt i32 undef, 2 4002 %sext = sext i32 undef to i64 4003 %shft = ashr exact i32 %arg, 16 4004 br i1 %i, label %loopexit2, label %preheader 4005 4006preheader: ; preds = %bb2 4007 br label %header 4008 4009header: ; preds = %latch, %preheader 4010 %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4011 br i1 false, label %loopexit1, label %latch 4012 4013latch: ; preds = %header 4014 %add = add nuw nsw i64 %i6, 1 4015 %i9 = icmp slt i64 %add, %sext 4016 br i1 %i9, label %header, label %latchexit 4017 4018latchexit: ; preds = %latch 4019 unreachable 4020 4021loopexit2: ; preds = %bb2 4022 ret i32 %shft 4023 4024loopexit1: ; preds = %header 4025 %sext3 = phi i32 [ %shft, %header ] 4026 ret i32 %sext3 4027} 4028 4029; Nested loop and inner loop is unrolled 4030; FIXME: we cannot unroll with epilog remainder currently, because 4031; the outer loop does not contain the epilog preheader and epilog exit (while 4032; infact it should). This causes us to choke up on LCSSA form being incorrect in 4033; outer loop. However, the exit block where LCSSA fails, is infact still within 4034; the outer loop. For now, we just bail out in presence of outer loop and epilog 4035; loop is generated. 4036; The outer loop header is the preheader for the inner loop and the inner header 4037; branches back to the outer loop. 4038define void @test8() { 4039; EPILOG-NO-IC-LABEL: @test8( 4040; EPILOG-NO-IC-NEXT: bb: 4041; EPILOG-NO-IC-NEXT: br label %outerloop 4042; EPILOG-NO-IC: outerloop.loopexit: 4043; EPILOG-NO-IC-NEXT: br label %outerloop 4044; EPILOG-NO-IC: outerloop: 4045; EPILOG-NO-IC-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4046; EPILOG-NO-IC-NEXT: br label %innerH 4047; EPILOG-NO-IC: innerH: 4048; EPILOG-NO-IC-NEXT: %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4049; EPILOG-NO-IC-NEXT: %i4 = add nuw nsw i64 %i3, 1 4050; EPILOG-NO-IC-NEXT: br i1 false, label %outerloop.loopexit, label %latch 4051; EPILOG-NO-IC: latch: 4052; EPILOG-NO-IC-NEXT: %i6 = icmp ult i64 %i4, 100 4053; EPILOG-NO-IC-NEXT: br i1 %i6, label %innerH, label %exit 4054; EPILOG-NO-IC: exit: 4055; EPILOG-NO-IC-NEXT: ret void 4056; 4057; EPILOG-LABEL: @test8( 4058; EPILOG-NEXT: bb: 4059; EPILOG-NEXT: br label %outerloop 4060; EPILOG: outerloop.loopexit: 4061; EPILOG-NEXT: br label %outerloop 4062; EPILOG: outerloop: 4063; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4064; EPILOG-NEXT: br label %innerH 4065; EPILOG: innerH: 4066; EPILOG-NEXT: %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4067; EPILOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4068; EPILOG-NEXT: br i1 false, label %outerloop.loopexit, label %latch 4069; EPILOG: latch: 4070; EPILOG-NEXT: %i6 = icmp ult i64 %i4, 100 4071; EPILOG-NEXT: br i1 %i6, label %innerH, label %exit 4072; EPILOG: exit: 4073; EPILOG-NEXT: ret void 4074; 4075; EPILOG-BLOCK-LABEL: @test8( 4076; EPILOG-BLOCK-NEXT: bb: 4077; EPILOG-BLOCK-NEXT: br label %outerloop 4078; EPILOG-BLOCK: outerloop.loopexit: 4079; EPILOG-BLOCK-NEXT: br label %innerH.12 4080; EPILOG-BLOCK: outerloop: 4081; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4082; EPILOG-BLOCK-NEXT: br label %innerH 4083; EPILOG-BLOCK: innerH: 4084; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop ], [ %i4.1, %latch.1 ] 4085; EPILOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4086; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch 4087; EPILOG-BLOCK: latch: 4088; EPILOG-BLOCK-NEXT: %i6 = icmp ult i64 %i4, 100 4089; EPILOG-BLOCK-NEXT: br i1 %i6, label %innerH.1, label %exit.loopexit 4090; EPILOG-BLOCK: exit.loopexit: 4091; EPILOG-BLOCK-NEXT: br label %exit 4092; EPILOG-BLOCK: exit.loopexit5: 4093; EPILOG-BLOCK-NEXT: br label %exit 4094; EPILOG-BLOCK: exit: 4095; EPILOG-BLOCK-NEXT: ret void 4096; EPILOG-BLOCK: innerH.1: 4097; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4098; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.1 4099; EPILOG-BLOCK: latch.1: 4100; EPILOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4101; EPILOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.loopexit, !llvm.loop !11 4102; EPILOG-BLOCK: innerH.12: 4103; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.loopexit ], [ %i4.1.1, %latch.1.1 ] 4104; EPILOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4105; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.14 4106; EPILOG-BLOCK: latch.14: 4107; EPILOG-BLOCK-NEXT: %i6.13 = icmp ult i64 %i4.11, 100 4108; EPILOG-BLOCK-NEXT: br i1 %i6.13, label %innerH.1.1, label %exit.loopexit5 4109; EPILOG-BLOCK: innerH.1.1: 4110; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4111; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.1.1 4112; EPILOG-BLOCK: latch.1.1: 4113; EPILOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4114; EPILOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.12, label %exit.loopexit5, !llvm.loop !11 4115; EPILOG-BLOCK: outerloop.loopexit.1: 4116; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !12 4117; 4118; PROLOG-LABEL: @test8( 4119; PROLOG-NEXT: bb: 4120; PROLOG-NEXT: br label %outerloop 4121; PROLOG: outerloop.loopexit.loopexit: 4122; PROLOG-NEXT: br label %outerloop.loopexit 4123; PROLOG: outerloop.loopexit.loopexit1: 4124; PROLOG-NEXT: br label %outerloop.loopexit 4125; PROLOG: outerloop.loopexit: 4126; PROLOG-NEXT: br label %outerloop 4127; PROLOG: outerloop: 4128; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4129; PROLOG-NEXT: %0 = sub i64 100, %i 4130; PROLOG-NEXT: %1 = sub i64 99, %i 4131; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4132; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4133; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4134; PROLOG: innerH.prol.preheader: 4135; PROLOG-NEXT: br label %innerH.prol 4136; PROLOG: innerH.prol: 4137; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 4138; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 4139; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4140; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4141; PROLOG: latch.prol: 4142; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 4143; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 4144; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 4145; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !7 4146; PROLOG: innerH.prol.loopexit.unr-lcssa: 4147; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4148; PROLOG-NEXT: br label %innerH.prol.loopexit 4149; PROLOG: innerH.prol.loopexit: 4150; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4151; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4152; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4153; PROLOG: outerloop.new: 4154; PROLOG-NEXT: br label %innerH 4155; PROLOG: innerH: 4156; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4157; PROLOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4158; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4159; PROLOG: latch: 4160; PROLOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4161; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4162; PROLOG: exit.unr-lcssa: 4163; PROLOG-NEXT: br label %exit 4164; PROLOG: exit.loopexit: 4165; PROLOG-NEXT: br label %exit 4166; PROLOG: exit: 4167; PROLOG-NEXT: ret void 4168; PROLOG: latch.1: 4169; PROLOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4170; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4171; PROLOG: latch.2: 4172; PROLOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4173; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4174; PROLOG: latch.3: 4175; PROLOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4176; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4177; PROLOG: latch.4: 4178; PROLOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4179; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4180; PROLOG: latch.5: 4181; PROLOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4182; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4183; PROLOG: latch.6: 4184; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4185; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4186; PROLOG: latch.7: 4187; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 4188; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4189; 4190; PROLOG-BLOCK-LABEL: @test8( 4191; PROLOG-BLOCK-NEXT: bb: 4192; PROLOG-BLOCK-NEXT: br label %outerloop 4193; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4194; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4195; PROLOG-BLOCK: outerloop.loopexit: 4196; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.unr-lcssa.1 4197; PROLOG-BLOCK: outerloop: 4198; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4199; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4200; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4201; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4202; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4203; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit.unr-lcssa 4204; PROLOG-BLOCK: innerH.prol.preheader: 4205; PROLOG-BLOCK-NEXT: br label %innerH.prol 4206; PROLOG-BLOCK: innerH.prol: 4207; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4208; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4209; PROLOG-BLOCK: latch.prol: 4210; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.unr-lcssa 4211; PROLOG-BLOCK: innerH.prol.loopexit.unr-lcssa: 4212; PROLOG-BLOCK-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ], [ %i, %outerloop ] 4213; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4214; PROLOG-BLOCK: innerH.prol.loopexit: 4215; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4216; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4217; PROLOG-BLOCK: outerloop.new: 4218; PROLOG-BLOCK-NEXT: br label %innerH 4219; PROLOG-BLOCK: innerH: 4220; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr.ph, %outerloop.new ], [ %i4.1, %latch.1 ] 4221; PROLOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4222; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4223; PROLOG-BLOCK: latch: 4224; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4225; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4226; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4227; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4228; PROLOG-BLOCK: exit.unr-lcssa.loopexit3: 4229; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4230; PROLOG-BLOCK: exit.unr-lcssa: 4231; PROLOG-BLOCK-NEXT: br label %exit 4232; PROLOG-BLOCK: exit.loopexit: 4233; PROLOG-BLOCK-NEXT: br label %exit 4234; PROLOG-BLOCK: exit: 4235; PROLOG-BLOCK-NEXT: ret void 4236; PROLOG-BLOCK: latch.1: 4237; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4238; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11 4239; PROLOG-BLOCK: innerH.prol.preheader.1: 4240; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4241; PROLOG-BLOCK: innerH.prol.1: 4242; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4243; PROLOG-BLOCK: latch.prol.1: 4244; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.unr-lcssa.1 4245; PROLOG-BLOCK: innerH.prol.loopexit.unr-lcssa.1: 4246; PROLOG-BLOCK-NEXT: %i3.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %outerloop.loopexit ] 4247; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4248; PROLOG-BLOCK: innerH.prol.loopexit.1: 4249; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4250; PROLOG-BLOCK: outerloop.new.1: 4251; PROLOG-BLOCK-NEXT: br label %innerH.1 4252; PROLOG-BLOCK: innerH.1: 4253; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.ph.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4254; PROLOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4255; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4256; PROLOG-BLOCK: latch.12: 4257; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4258; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4259; PROLOG-BLOCK: latch.1.1: 4260; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4261; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11 4262; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4263; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4264; PROLOG-BLOCK: outerloop.loopexit.1: 4265; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !12 4266; 4267 4268bb: 4269 br label %outerloop 4270 4271outerloop: ; preds = %innerH, %bb 4272 %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4273 br label %innerH 4274 4275innerH: ; preds = %latch, %outerloop 4276 %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4277 %i4 = add nuw nsw i64 %i3, 1 4278 br i1 false, label %outerloop, label %latch 4279 4280latch: ; preds = %innerH 4281 %i6 = icmp ult i64 %i4, 100 4282 br i1 %i6, label %innerH, label %exit 4283 4284exit: ; preds = %latch 4285 ret void 4286} 4287 4288declare i8 addrspace(1)* @foo(i32) 4289; inner loop prolog unrolled 4290; a value from outer loop is used in exit block of inner loop. 4291; Don't create VMap entries for such values (%trip). 4292define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { 4293; EPILOG-NO-IC-LABEL: @test9( 4294; EPILOG-NO-IC-NEXT: bb: 4295; EPILOG-NO-IC-NEXT: br label %outerloopHdr 4296; EPILOG-NO-IC: outerloopHdr: 4297; EPILOG-NO-IC-NEXT: %trip = add i32 %n, -1 4298; EPILOG-NO-IC-NEXT: %outercnd = icmp slt i32 0, %trip 4299; EPILOG-NO-IC-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4300; EPILOG-NO-IC: preheader: 4301; EPILOG-NO-IC-NEXT: %i4 = zext i32 0 to i64 4302; EPILOG-NO-IC-NEXT: br label %header 4303; EPILOG-NO-IC: header: 4304; EPILOG-NO-IC-NEXT: %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 4305; EPILOG-NO-IC-NEXT: %i7 = trunc i64 %phi to i32 4306; EPILOG-NO-IC-NEXT: br i1 true, label %latch, label %innerexit 4307; EPILOG-NO-IC: innerexit: 4308; EPILOG-NO-IC-NEXT: %trip.lcssa = phi i32 [ %trip, %header ] 4309; EPILOG-NO-IC-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4310; EPILOG-NO-IC-NEXT: ret i8 addrspace(1)* %i9 4311; EPILOG-NO-IC: latch: 4312; EPILOG-NO-IC-NEXT: %i11 = add nsw i32 %i7, 1 4313; EPILOG-NO-IC-NEXT: %innercnd = icmp slt i32 %i11, %trip 4314; EPILOG-NO-IC-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4315; EPILOG-NO-IC-NEXT: br i1 %innercnd, label %header, label %outerLatch.loopexit 4316; EPILOG-NO-IC: outerLatch.loopexit: 4317; EPILOG-NO-IC-NEXT: br label %outerLatch 4318; EPILOG-NO-IC: outerLatch: 4319; EPILOG-NO-IC-NEXT: br label %outerloopHdr 4320; 4321; EPILOG-LABEL: @test9( 4322; EPILOG-NEXT: bb: 4323; EPILOG-NEXT: br label %outerloopHdr 4324; EPILOG: outerloopHdr: 4325; EPILOG-NEXT: %trip = add i32 %n, -1 4326; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4327; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4328; EPILOG: preheader: 4329; EPILOG-NEXT: %i4 = zext i32 0 to i64 4330; EPILOG-NEXT: br label %header 4331; EPILOG: header: 4332; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 4333; EPILOG-NEXT: %i7 = trunc i64 %phi to i32 4334; EPILOG-NEXT: br i1 true, label %latch, label %innerexit 4335; EPILOG: innerexit: 4336; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip, %header ] 4337; EPILOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4338; EPILOG-NEXT: ret i8 addrspace(1)* %i9 4339; EPILOG: latch: 4340; EPILOG-NEXT: %i11 = add nsw i32 %i7, 1 4341; EPILOG-NEXT: %innercnd = icmp slt i32 %i11, %trip 4342; EPILOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4343; EPILOG-NEXT: br i1 %innercnd, label %header, label %outerLatch.loopexit 4344; EPILOG: outerLatch.loopexit: 4345; EPILOG-NEXT: br label %outerLatch 4346; EPILOG: outerLatch: 4347; EPILOG-NEXT: br label %outerloopHdr 4348; 4349; EPILOG-BLOCK-LABEL: @test9( 4350; EPILOG-BLOCK-NEXT: bb: 4351; EPILOG-BLOCK-NEXT: br label %outerloopHdr 4352; EPILOG-BLOCK: outerloopHdr: 4353; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 4354; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4355; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4356; EPILOG-BLOCK: preheader: 4357; EPILOG-BLOCK-NEXT: br label %header 4358; EPILOG-BLOCK: header: 4359; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader ], [ %iv.next.1, %latch.1 ] 4360; EPILOG-BLOCK-NEXT: %i7 = trunc i64 %phi to i32 4361; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4362; EPILOG-BLOCK: innerexit.loopexit: 4363; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip, %header.1 ], [ %trip, %header ] 4364; EPILOG-BLOCK-NEXT: br label %innerexit 4365; EPILOG-BLOCK: innerexit.loopexit7: 4366; EPILOG-BLOCK-NEXT: %trip.lcssa.ph8 = phi i32 [ %trip.1, %header.1.1 ], [ %trip.1, %header.12 ] 4367; EPILOG-BLOCK-NEXT: br label %innerexit 4368; EPILOG-BLOCK: innerexit: 4369; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph8, %innerexit.loopexit7 ] 4370; EPILOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4371; EPILOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 4372; EPILOG-BLOCK: latch: 4373; EPILOG-BLOCK-NEXT: %i11 = add nuw nsw i32 %i7, 1 4374; EPILOG-BLOCK-NEXT: %innercnd = icmp slt i32 %i11, %trip 4375; EPILOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4376; EPILOG-BLOCK-NEXT: br i1 %innercnd, label %header.1, label %outerLatch.loopexit 4377; EPILOG-BLOCK: outerLatch.loopexit: 4378; EPILOG-BLOCK-NEXT: br label %outerLatch 4379; EPILOG-BLOCK: outerLatch: 4380; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 4381; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 4382; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 4383; EPILOG-BLOCK: header.1: 4384; EPILOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 4385; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4386; EPILOG-BLOCK: latch.1: 4387; EPILOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 4388; EPILOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 4389; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4390; EPILOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit, !llvm.loop !13 4391; EPILOG-BLOCK: preheader.1: 4392; EPILOG-BLOCK-NEXT: br label %header.12 4393; EPILOG-BLOCK: header.12: 4394; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.1 ], [ %iv.next.1.1, %latch.1.1 ] 4395; EPILOG-BLOCK-NEXT: %i7.11 = trunc i64 %phi.1 to i32 4396; EPILOG-BLOCK-NEXT: br i1 true, label %latch.16, label %innerexit.loopexit7 4397; EPILOG-BLOCK: latch.16: 4398; EPILOG-BLOCK-NEXT: %i11.13 = add nuw nsw i32 %i7.11, 1 4399; EPILOG-BLOCK-NEXT: %innercnd.14 = icmp slt i32 %i11.13, %trip.1 4400; EPILOG-BLOCK-NEXT: %iv.next.15 = add nuw nsw i64 %phi.1, 1 4401; EPILOG-BLOCK-NEXT: br i1 %innercnd.14, label %header.1.1, label %outerLatch.loopexit.1 4402; EPILOG-BLOCK: header.1.1: 4403; EPILOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.15 to i32 4404; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit7 4405; EPILOG-BLOCK: latch.1.1: 4406; EPILOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 4407; EPILOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 4408; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.15, 1 4409; EPILOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.12, label %outerLatch.loopexit.1, !llvm.loop !13 4410; EPILOG-BLOCK: outerLatch.loopexit.1: 4411; EPILOG-BLOCK-NEXT: br label %outerLatch.1 4412; EPILOG-BLOCK: outerLatch.1: 4413; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !14 4414; 4415; PROLOG-LABEL: @test9( 4416; PROLOG-NEXT: bb: 4417; PROLOG-NEXT: %0 = add i32 %n, -1 4418; PROLOG-NEXT: %1 = add i32 %n, -2 4419; PROLOG-NEXT: br label %outerloopHdr 4420; PROLOG: outerloopHdr: 4421; PROLOG-NEXT: %trip = add i32 %n, -1 4422; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 4423; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4424; PROLOG: preheader: 4425; PROLOG-NEXT: %i4 = zext i32 0 to i64 4426; PROLOG-NEXT: %xtraiter = and i32 %0, 7 4427; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4428; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4429; PROLOG: header.prol.preheader: 4430; PROLOG-NEXT: br label %header.prol 4431; PROLOG: header.prol: 4432; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 4433; PROLOG-NEXT: %prol.iter = phi i32 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 4434; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 4435; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 4436; PROLOG: latch.prol: 4437; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 4438; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 4439; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 4440; PROLOG-NEXT: %prol.iter.sub = sub i32 %prol.iter, 1 4441; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0 4442; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8 4443; PROLOG: header.prol.loopexit.unr-lcssa: 4444; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 4445; PROLOG-NEXT: br label %header.prol.loopexit 4446; PROLOG: header.prol.loopexit: 4447; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 4448; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 4449; PROLOG-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 4450; PROLOG: preheader.new: 4451; PROLOG-NEXT: br label %header 4452; PROLOG: header: 4453; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 4454; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4455; PROLOG: innerexit.loopexit: 4456; 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 ] 4457; PROLOG-NEXT: br label %innerexit 4458; PROLOG: innerexit.loopexit1: 4459; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 4460; PROLOG-NEXT: br label %innerexit 4461; PROLOG: innerexit: 4462; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4463; PROLOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4464; PROLOG-NEXT: ret i8 addrspace(1)* %i9 4465; PROLOG: latch: 4466; PROLOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4467; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4468; PROLOG: outerLatch.loopexit.unr-lcssa: 4469; PROLOG-NEXT: br label %outerLatch.loopexit 4470; PROLOG: outerLatch.loopexit: 4471; PROLOG-NEXT: br label %outerLatch 4472; PROLOG: outerLatch: 4473; PROLOG-NEXT: br label %outerloopHdr 4474; PROLOG: latch.1: 4475; PROLOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4476; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4477; PROLOG: latch.2: 4478; PROLOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 4479; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4480; PROLOG: latch.3: 4481; PROLOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 4482; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4483; PROLOG: latch.4: 4484; PROLOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 4485; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4486; PROLOG: latch.5: 4487; PROLOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 4488; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4489; PROLOG: latch.6: 4490; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 4491; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 4492; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 4493; PROLOG: latch.7: 4494; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 4495; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 4496; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 4497; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 4498; 4499; PROLOG-BLOCK-LABEL: @test9( 4500; PROLOG-BLOCK-NEXT: bb: 4501; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 4502; PROLOG-BLOCK-NEXT: %1 = add i32 %n, -2 4503; PROLOG-BLOCK-NEXT: br label %outerloopHdr 4504; PROLOG-BLOCK: outerloopHdr: 4505; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 4506; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4507; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4508; PROLOG-BLOCK: preheader: 4509; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 4510; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4511; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit.unr-lcssa 4512; PROLOG-BLOCK: header.prol.preheader: 4513; PROLOG-BLOCK-NEXT: br label %header.prol 4514; PROLOG-BLOCK: header.prol: 4515; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 4516; PROLOG-BLOCK: latch.prol: 4517; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.unr-lcssa 4518; PROLOG-BLOCK: header.prol.loopexit.unr-lcssa: 4519; PROLOG-BLOCK-NEXT: %phi.unr.ph = phi i64 [ 1, %latch.prol ], [ 0, %preheader ] 4520; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4521; PROLOG-BLOCK: header.prol.loopexit: 4522; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 4523; PROLOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 4524; PROLOG-BLOCK: preheader.new: 4525; PROLOG-BLOCK-NEXT: br label %header 4526; PROLOG-BLOCK: header: 4527; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr.ph, %preheader.new ], [ %iv.next.1, %latch.1 ] 4528; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 4529; PROLOG-BLOCK: innerexit.loopexit.loopexit: 4530; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 4531; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 4532; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 4533; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 4534; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 4535; PROLOG-BLOCK: innerexit.loopexit: 4536; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 4537; PROLOG-BLOCK-NEXT: br label %innerexit 4538; PROLOG-BLOCK: innerexit.loopexit1: 4539; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 4540; PROLOG-BLOCK-NEXT: br label %innerexit 4541; PROLOG-BLOCK: innerexit: 4542; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4543; PROLOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4544; PROLOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 4545; PROLOG-BLOCK: latch: 4546; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4547; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 4548; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 4549; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 4550; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 4551; PROLOG-BLOCK: outerLatch.loopexit: 4552; PROLOG-BLOCK-NEXT: br label %outerLatch 4553; PROLOG-BLOCK: outerLatch: 4554; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 4555; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 4556; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 4557; PROLOG-BLOCK: latch.1: 4558; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 4559; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 4560; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4561; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13 4562; PROLOG-BLOCK: preheader.1: 4563; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 4564; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 4565; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.unr-lcssa.1 4566; PROLOG-BLOCK: header.prol.preheader.1: 4567; PROLOG-BLOCK-NEXT: br label %header.prol.1 4568; PROLOG-BLOCK: header.prol.1: 4569; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 4570; PROLOG-BLOCK: latch.prol.1: 4571; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.unr-lcssa.1 4572; PROLOG-BLOCK: header.prol.loopexit.unr-lcssa.1: 4573; PROLOG-BLOCK-NEXT: %phi.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %preheader.1 ] 4574; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 4575; PROLOG-BLOCK: header.prol.loopexit.1: 4576; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 4577; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1 4578; PROLOG-BLOCK: preheader.new.1: 4579; PROLOG-BLOCK-NEXT: br label %header.1 4580; PROLOG-BLOCK: header.1: 4581; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.ph.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 4582; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 4583; PROLOG-BLOCK: latch.14: 4584; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 4585; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 4586; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 4587; PROLOG-BLOCK: latch.1.1: 4588; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 4589; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 4590; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 4591; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13 4592; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 4593; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 4594; PROLOG-BLOCK: outerLatch.loopexit.1: 4595; PROLOG-BLOCK-NEXT: br label %outerLatch.1 4596; PROLOG-BLOCK: outerLatch.1: 4597; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !14 4598; 4599bb: 4600 br label %outerloopHdr 4601 4602outerloopHdr: ; preds = %outerLatch, %bb 4603 %trip = add i32 %n, -1 4604 %outercnd = icmp slt i32 0, %trip 4605 br i1 %outercnd, label %preheader, label %outerLatch 4606 4607preheader: ; preds = %outerloopHdr 4608 %i4 = zext i32 0 to i64 4609 br label %header 4610 4611header: ; preds = %latch, %preheader 4612 %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 4613 %i7 = trunc i64 %phi to i32 4614 br i1 true, label %latch, label %innerexit 4615 4616innerexit: ; preds = %header 4617 %i9 = call i8 addrspace(1)* @foo(i32 %trip) 4618 ret i8 addrspace(1)* %i9 4619 4620latch: ; preds = %header 4621 %i11 = add nsw i32 %i7, 1 4622 %innercnd = icmp slt i32 %i11, %trip 4623 %iv.next = add nuw nsw i64 %phi, 1 4624 br i1 %innercnd, label %header, label %outerLatch 4625 4626outerLatch: ; preds = %latch, %outerloopHdr 4627 br label %outerloopHdr 4628} 4629