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