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: %0 = add i64 %n, -1 1499; PROLOG-NEXT: %xtraiter = and i64 %n, 7 1500; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1501; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1502; PROLOG: header.prol.preheader: 1503; PROLOG-NEXT: br label %header.prol 1504; PROLOG: header.prol: 1505; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1506; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1507; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 1508; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol 1509; PROLOG: for.exiting_block.prol: 1510; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 1511; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol 1512; PROLOG: latch.prol: 1513; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 1514; PROLOG-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 1515; PROLOG-NEXT: %add.prol = add nsw i32 %1, %sum.02.prol 1516; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 1517; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1518; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 1519; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 1520; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4 1521; PROLOG: header.prol.loopexit.unr-lcssa: 1522; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1523; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 1524; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1525; PROLOG-NEXT: br label %header.prol.loopexit 1526; PROLOG: header.prol.loopexit: 1527; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 1528; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 1529; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1530; PROLOG-NEXT: %2 = icmp ult i64 %0, 7 1531; PROLOG-NEXT: br i1 %2, label %latchExit, label %entry.new 1532; PROLOG: entry.new: 1533; PROLOG-NEXT: br label %header 1534; PROLOG: header: 1535; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1536; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 1537; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1538; PROLOG: for.exiting_block: 1539; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1540; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1541; PROLOG: latch: 1542; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1543; PROLOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 1544; PROLOG-NEXT: %add = add nsw i32 %3, %sum.02 1545; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1546; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 1547; PROLOG: latchExit.unr-lcssa.loopexit: 1548; PROLOG-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ], [ %add.7, %latch.7 ] 1549; PROLOG-NEXT: br label %latchExit.unr-lcssa 1550; PROLOG: latchExit.unr-lcssa.loopexit1: 1551; PROLOG-NEXT: %result.ph.ph2 = phi i32 [ 0, %header.prol ] 1552; PROLOG-NEXT: br label %latchExit.unr-lcssa 1553; PROLOG: latchExit.unr-lcssa: 1554; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 1555; PROLOG-NEXT: br label %latchExit 1556; PROLOG: latchExit: 1557; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1558; PROLOG-NEXT: ret i32 %result 1559; PROLOG: for.exit2.loopexit: 1560; PROLOG-NEXT: br label %for.exit2 1561; PROLOG: for.exit2.loopexit3: 1562; PROLOG-NEXT: br label %for.exit2 1563; PROLOG: for.exit2: 1564; PROLOG-NEXT: ret i32 42 1565; PROLOG: for.exiting_block.1: 1566; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1567; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1568; PROLOG: latch.1: 1569; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1570; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1571; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 1572; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1573; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2 1574; PROLOG: for.exiting_block.2: 1575; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1576; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1577; PROLOG: latch.2: 1578; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1579; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1580; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1581; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 1582; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3 1583; PROLOG: for.exiting_block.3: 1584; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1585; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1586; PROLOG: latch.3: 1587; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1588; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1589; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1590; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 1591; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4 1592; PROLOG: for.exiting_block.4: 1593; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1594; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1595; PROLOG: latch.4: 1596; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1597; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1598; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1599; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 1600; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5 1601; PROLOG: for.exiting_block.5: 1602; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1603; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1604; PROLOG: latch.5: 1605; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1606; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1607; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1608; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 1609; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6 1610; PROLOG: for.exiting_block.6: 1611; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1612; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1613; PROLOG: latch.6: 1614; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1615; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 1616; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1617; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 1618; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7 1619; PROLOG: for.exiting_block.7: 1620; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1621; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1622; PROLOG: latch.7: 1623; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1624; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 1625; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1626; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 1627; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 1628; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 1629; 1630; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit( 1631; PROLOG-BLOCK-NEXT: entry: 1632; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 1633; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 1634; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1635; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1636; PROLOG-BLOCK: header.prol.preheader: 1637; PROLOG-BLOCK-NEXT: br label %header.prol 1638; PROLOG-BLOCK: header.prol: 1639; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol 1640; PROLOG-BLOCK: for.exiting_block.prol: 1641; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 1642; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 1643; PROLOG-BLOCK: latch.prol: 1644; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 1645; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 1646; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %1, 0 1647; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 1648; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1649; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 1650; PROLOG-BLOCK: header.prol.loopexit: 1651; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 1652; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 1653; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 1654; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 1655; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %entry.new 1656; PROLOG-BLOCK: entry.new: 1657; PROLOG-BLOCK-NEXT: br label %header 1658; PROLOG-BLOCK: header: 1659; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 1660; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 1661; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1662; PROLOG-BLOCK: for.exiting_block: 1663; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1664; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1665; PROLOG-BLOCK: latch: 1666; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1667; PROLOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 1668; PROLOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1669; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1670; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 1671; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 1672; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ] 1673; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1674; PROLOG-BLOCK: latchExit.unr-lcssa: 1675; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1676; PROLOG-BLOCK-NEXT: br label %latchExit 1677; PROLOG-BLOCK: latchExit: 1678; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1679; PROLOG-BLOCK-NEXT: ret i32 %result 1680; PROLOG-BLOCK: for.exit2.loopexit: 1681; PROLOG-BLOCK-NEXT: br label %for.exit2 1682; PROLOG-BLOCK: for.exit2: 1683; PROLOG-BLOCK-NEXT: ret i32 42 1684; PROLOG-BLOCK: for.exiting_block.1: 1685; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1686; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1687; PROLOG-BLOCK: latch.1: 1688; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1689; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1690; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1691; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1692; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1693; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 1694; 1695 1696entry: 1697 br label %header 1698 1699header: 1700 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1701 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1702 br i1 %cond, label %latchExit, label %for.exiting_block 1703 1704for.exiting_block: 1705 %cmp = icmp eq i64 %n, 42 1706 br i1 %cmp, label %for.exit2, label %latch 1707 1708latch: ; preds = %latch, %entry 1709 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1710 %0 = load i32, i32* %arrayidx, align 4 1711 %add = add nsw i32 %0, %sum.02 1712 %indvars.iv.next = add i64 %indvars.iv, 1 1713 %exitcond = icmp eq i64 %indvars.iv.next, %n 1714 br i1 %exitcond, label %latchExit, label %header 1715 1716latchExit: ; preds = %latch, %entry 1717 %result = phi i32 [ 0, %header ], [ %add, %latch ] 1718 ret i32 %result 1719 1720for.exit2: 1721 ret i32 42 1722} 1723 1724; Two exiting blocks to latch where the exiting blocks are Latch and a 1725; non-header 1726; FIXME: We should unroll this loop. 1727define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { 1728; EPILOG-LABEL: @otherblock_latch_same_exit( 1729; EPILOG-NEXT: entry: 1730; EPILOG-NEXT: %0 = add i64 %n, -1 1731; EPILOG-NEXT: %xtraiter = and i64 %n, 7 1732; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 1733; EPILOG-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 1734; EPILOG: entry.new: 1735; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 1736; EPILOG-NEXT: br label %header 1737; EPILOG: header: 1738; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1739; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 1740; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 1741; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1742; EPILOG: for.exiting_block: 1743; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 1744; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1745; EPILOG: latch: 1746; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1747; EPILOG-NEXT: %2 = load i32, i32* %arrayidx, align 4 1748; EPILOG-NEXT: %add = add nsw i32 %2, %sum.02 1749; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1750; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 1751; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1752; EPILOG: latchExit.unr-lcssa.loopexit: 1753; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 1754; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 1755; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 1756; EPILOG-NEXT: br label %latchExit.unr-lcssa 1757; EPILOG: latchExit.unr-lcssa: 1758; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1759; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1760; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1761; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1762; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1763; EPILOG: header.epil.preheader: 1764; EPILOG-NEXT: br label %header.epil 1765; EPILOG: header.epil: 1766; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 1767; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 1768; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 1769; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 1770; EPILOG: for.exiting_block.epil: 1771; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 1772; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 1773; EPILOG: latch.epil: 1774; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1775; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 1776; EPILOG-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 1777; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1778; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1779; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 1780; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 1781; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5 1782; EPILOG: latchExit.epilog-lcssa.loopexit: 1783; 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 ] 1784; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1785; EPILOG: latchExit.epilog-lcssa.loopexit3: 1786; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 1787; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1788; EPILOG: latchExit.epilog-lcssa: 1789; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 1790; EPILOG-NEXT: br label %latchExit 1791; EPILOG: latchExit: 1792; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1793; EPILOG-NEXT: ret i32 %result 1794; EPILOG: for.exit2.loopexit: 1795; EPILOG-NEXT: br label %for.exit2 1796; EPILOG: for.exit2.loopexit2: 1797; EPILOG-NEXT: br label %for.exit2 1798; EPILOG: for.exit2: 1799; EPILOG-NEXT: ret i32 42 1800; EPILOG: for.exiting_block.1: 1801; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1802; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1803; EPILOG: latch.1: 1804; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1805; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1806; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 1807; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 1808; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 1809; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1810; EPILOG: for.exiting_block.2: 1811; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1812; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 1813; EPILOG: latch.2: 1814; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1815; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1816; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1817; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 1818; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 1819; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1820; EPILOG: for.exiting_block.3: 1821; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1822; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 1823; EPILOG: latch.3: 1824; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1825; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1826; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1827; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 1828; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 1829; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1830; EPILOG: for.exiting_block.4: 1831; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1832; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 1833; EPILOG: latch.4: 1834; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1835; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1836; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1837; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 1838; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 1839; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1840; EPILOG: for.exiting_block.5: 1841; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1842; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 1843; EPILOG: latch.5: 1844; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1845; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1846; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1847; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 1848; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 1849; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 1850; EPILOG: for.exiting_block.6: 1851; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1852; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 1853; EPILOG: latch.6: 1854; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1855; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 1856; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1857; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 1858; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 1859; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 1860; EPILOG: for.exiting_block.7: 1861; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1862; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 1863; EPILOG: latch.7: 1864; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1865; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 1866; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1867; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 1868; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 1869; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 1870; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 1871; 1872; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1873; EPILOG-BLOCK-NEXT: entry: 1874; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 1875; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 1876; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 1877; EPILOG-BLOCK-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 1878; EPILOG-BLOCK: entry.new: 1879; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 1880; EPILOG-BLOCK-NEXT: br label %header 1881; EPILOG-BLOCK: header: 1882; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 1883; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 1884; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ] 1885; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1886; EPILOG-BLOCK: for.exiting_block: 1887; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1888; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1889; EPILOG-BLOCK: latch: 1890; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1891; EPILOG-BLOCK-NEXT: %2 = load i32, i32* %arrayidx, align 4 1892; EPILOG-BLOCK-NEXT: %add = add nsw i32 %2, %sum.02 1893; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1894; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 1895; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1896; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 1897; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 1898; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 1899; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 1900; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1901; EPILOG-BLOCK: latchExit.unr-lcssa: 1902; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1903; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1904; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1905; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1906; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1907; EPILOG-BLOCK: header.epil.preheader: 1908; EPILOG-BLOCK-NEXT: br label %header.epil 1909; EPILOG-BLOCK: header.epil: 1910; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 1911; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 1912; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 1913; EPILOG-BLOCK: for.exiting_block.epil: 1914; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 1915; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 1916; EPILOG-BLOCK: latch.epil: 1917; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1918; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 1919; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 1920; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1921; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1922; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1923; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 1924; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ] 1925; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1926; EPILOG-BLOCK: latchExit.epilog-lcssa: 1927; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 1928; EPILOG-BLOCK-NEXT: br label %latchExit 1929; EPILOG-BLOCK: latchExit: 1930; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1931; EPILOG-BLOCK-NEXT: ret i32 %result 1932; EPILOG-BLOCK: for.exit2.loopexit: 1933; EPILOG-BLOCK-NEXT: br label %for.exit2 1934; EPILOG-BLOCK: for.exit2: 1935; EPILOG-BLOCK-NEXT: ret i32 42 1936; EPILOG-BLOCK: for.exiting_block.1: 1937; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1938; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1939; EPILOG-BLOCK: latch.1: 1940; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1941; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1942; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1943; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1944; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 1945; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 1946; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 1947; 1948; PROLOG-LABEL: @otherblock_latch_same_exit( 1949; PROLOG-NEXT: entry: 1950; PROLOG-NEXT: %0 = add i64 %n, -1 1951; PROLOG-NEXT: %xtraiter = and i64 %n, 7 1952; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1953; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1954; PROLOG: header.prol.preheader: 1955; PROLOG-NEXT: br label %header.prol 1956; PROLOG: header.prol: 1957; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1958; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1959; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 1960; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 1961; PROLOG: for.exiting_block.prol: 1962; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 1963; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 1964; PROLOG: latch.prol: 1965; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 1966; PROLOG-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 1967; PROLOG-NEXT: %add.prol = add nsw i32 %1, %sum.02.prol 1968; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 1969; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1970; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 1971; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 1972; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5 1973; PROLOG: header.prol.loopexit.unr-lcssa: 1974; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1975; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 1976; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1977; PROLOG-NEXT: br label %header.prol.loopexit 1978; PROLOG: header.prol.loopexit: 1979; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 1980; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 1981; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1982; PROLOG-NEXT: %2 = icmp ult i64 %0, 7 1983; PROLOG-NEXT: br i1 %2, label %latchExit, label %entry.new 1984; PROLOG: entry.new: 1985; PROLOG-NEXT: br label %header 1986; PROLOG: header: 1987; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1988; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 1989; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1990; PROLOG: for.exiting_block: 1991; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1992; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 1993; PROLOG: latch: 1994; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1995; PROLOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 1996; PROLOG-NEXT: %add = add nsw i32 %3, %sum.02 1997; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1998; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1999; PROLOG: latchExit.unr-lcssa.loopexit: 2000; PROLOG-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2001; PROLOG-NEXT: br label %latchExit.unr-lcssa 2002; PROLOG: latchExit.unr-lcssa.loopexit2: 2003; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ] 2004; PROLOG-NEXT: br label %latchExit.unr-lcssa 2005; PROLOG: latchExit.unr-lcssa: 2006; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2007; PROLOG-NEXT: br label %latchExit 2008; PROLOG: latchExit: 2009; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2010; PROLOG-NEXT: ret i32 %result 2011; PROLOG: for.exit2.loopexit: 2012; PROLOG-NEXT: br label %for.exit2 2013; PROLOG: for.exit2.loopexit1: 2014; PROLOG-NEXT: br label %for.exit2 2015; PROLOG: for.exit2: 2016; PROLOG-NEXT: ret i32 42 2017; PROLOG: for.exiting_block.1: 2018; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2019; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2020; PROLOG: latch.1: 2021; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2022; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2023; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 2024; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2025; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2026; PROLOG: for.exiting_block.2: 2027; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2028; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2029; PROLOG: latch.2: 2030; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2031; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2032; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2033; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 2034; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2035; PROLOG: for.exiting_block.3: 2036; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2037; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2038; PROLOG: latch.3: 2039; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2040; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2041; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2042; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 2043; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2044; PROLOG: for.exiting_block.4: 2045; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2046; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2047; PROLOG: latch.4: 2048; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2049; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2050; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2051; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 2052; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2053; PROLOG: for.exiting_block.5: 2054; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2055; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2056; PROLOG: latch.5: 2057; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2058; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2059; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2060; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2061; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2062; PROLOG: for.exiting_block.6: 2063; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2064; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2065; PROLOG: latch.6: 2066; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2067; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2068; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2069; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2070; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2071; PROLOG: for.exiting_block.7: 2072; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2073; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2074; PROLOG: latch.7: 2075; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2076; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2077; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2078; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2079; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2080; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2081; 2082; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit( 2083; PROLOG-BLOCK-NEXT: entry: 2084; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 2085; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 2086; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2087; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2088; PROLOG-BLOCK: header.prol.preheader: 2089; PROLOG-BLOCK-NEXT: br label %header.prol 2090; PROLOG-BLOCK: header.prol: 2091; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 2092; PROLOG-BLOCK: for.exiting_block.prol: 2093; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 2094; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 2095; PROLOG-BLOCK: latch.prol: 2096; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 2097; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 2098; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %1, 0 2099; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 2100; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2101; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 2102; PROLOG-BLOCK: header.prol.loopexit: 2103; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 2104; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 2105; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 2106; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 2107; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %entry.new 2108; PROLOG-BLOCK: entry.new: 2109; PROLOG-BLOCK-NEXT: br label %header 2110; PROLOG-BLOCK: header: 2111; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2112; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 2113; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2114; PROLOG-BLOCK: for.exiting_block: 2115; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2116; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2117; PROLOG-BLOCK: latch: 2118; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2119; PROLOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 2120; PROLOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2121; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2122; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2123; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2124; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2125; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2126; PROLOG-BLOCK: latchExit.unr-lcssa: 2127; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2128; PROLOG-BLOCK-NEXT: br label %latchExit 2129; PROLOG-BLOCK: latchExit: 2130; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2131; PROLOG-BLOCK-NEXT: ret i32 %result 2132; PROLOG-BLOCK: for.exit2.loopexit: 2133; PROLOG-BLOCK-NEXT: br label %for.exit2 2134; PROLOG-BLOCK: for.exit2: 2135; PROLOG-BLOCK-NEXT: ret i32 42 2136; PROLOG-BLOCK: for.exiting_block.1: 2137; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2138; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2139; PROLOG-BLOCK: latch.1: 2140; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2141; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2142; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2143; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2144; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2145; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 2146; 2147 2148entry: 2149 br label %header 2150 2151header: 2152 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2153 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2154 br i1 %cond, label %for.exit2, label %for.exiting_block 2155 2156for.exiting_block: 2157 %cmp = icmp eq i64 %n, 42 2158 br i1 %cmp, label %latchExit, label %latch 2159 2160latch: ; preds = %latch, %entry 2161 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2162 %0 = load i32, i32* %arrayidx, align 4 2163 %add = add nsw i32 %0, %sum.02 2164 %indvars.iv.next = add i64 %indvars.iv, 1 2165 %exitcond = icmp eq i64 %indvars.iv.next, %n 2166 br i1 %exitcond, label %latchExit, label %header 2167 2168latchExit: ; preds = %latch, %entry 2169 %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 2170 ret i32 %result 2171 2172for.exit2: 2173 ret i32 42 2174} 2175 2176; Two exiting blocks to latch where the exiting blocks are Latch and a 2177; non-header 2178; Same as above test except the incoming value for latch Phi is from the header 2179; FIXME: We should be able to runtime unroll. 2180define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { 2181; EPILOG-LABEL: @otherblock_latch_same_exit2( 2182; EPILOG-NEXT: entry: 2183; EPILOG-NEXT: %0 = add i64 %n, -1 2184; EPILOG-NEXT: %xtraiter = and i64 %n, 7 2185; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 2186; EPILOG-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 2187; EPILOG: entry.new: 2188; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 2189; EPILOG-NEXT: br label %header 2190; EPILOG: header: 2191; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2192; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 2193; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 2194; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2195; EPILOG: for.exiting_block: 2196; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2197; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2198; EPILOG: latch: 2199; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2200; EPILOG-NEXT: %2 = load i32, i32* %arrayidx, align 4 2201; EPILOG-NEXT: %add = add nsw i32 %2, %sum.02 2202; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2203; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 2204; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2205; EPILOG: latchExit.unr-lcssa.loopexit: 2206; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2207; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2208; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2209; EPILOG-NEXT: br label %latchExit.unr-lcssa 2210; EPILOG: latchExit.unr-lcssa: 2211; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2212; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2213; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2214; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2215; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2216; EPILOG: header.epil.preheader: 2217; EPILOG-NEXT: br label %header.epil 2218; EPILOG: header.epil: 2219; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2220; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2221; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 2222; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2223; EPILOG: for.exiting_block.epil: 2224; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2225; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2226; EPILOG: latch.epil: 2227; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2228; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 2229; EPILOG-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 2230; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2231; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2232; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 2233; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 2234; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6 2235; EPILOG: latchExit.epilog-lcssa.loopexit: 2236; 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 ] 2237; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2238; EPILOG: latchExit.epilog-lcssa.loopexit3: 2239; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2240; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2241; EPILOG: latchExit.epilog-lcssa: 2242; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2243; EPILOG-NEXT: br label %latchExit 2244; EPILOG: latchExit: 2245; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2246; EPILOG-NEXT: ret i32 %result 2247; EPILOG: for.exit2.loopexit: 2248; EPILOG-NEXT: br label %for.exit2 2249; EPILOG: for.exit2.loopexit2: 2250; EPILOG-NEXT: br label %for.exit2 2251; EPILOG: for.exit2: 2252; EPILOG-NEXT: ret i32 42 2253; EPILOG: for.exiting_block.1: 2254; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2255; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2256; EPILOG: latch.1: 2257; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2258; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2259; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2260; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 2261; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2262; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2263; EPILOG: for.exiting_block.2: 2264; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2265; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2266; EPILOG: latch.2: 2267; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2268; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2269; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2270; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 2271; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 2272; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2273; EPILOG: for.exiting_block.3: 2274; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2275; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2276; EPILOG: latch.3: 2277; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2278; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2279; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2280; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 2281; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 2282; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2283; EPILOG: for.exiting_block.4: 2284; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2285; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2286; EPILOG: latch.4: 2287; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2288; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2289; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2290; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 2291; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 2292; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2293; EPILOG: for.exiting_block.5: 2294; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2295; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2296; EPILOG: latch.5: 2297; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2298; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2299; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2300; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 2301; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 2302; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2303; EPILOG: for.exiting_block.6: 2304; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2305; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2306; EPILOG: latch.6: 2307; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2308; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2309; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2310; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 2311; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 2312; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2313; EPILOG: for.exiting_block.7: 2314; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2315; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2316; EPILOG: latch.7: 2317; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2318; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2319; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2320; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2321; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 2322; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 2323; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2324; 2325; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2326; EPILOG-BLOCK-NEXT: entry: 2327; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 2328; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 2329; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 2330; EPILOG-BLOCK-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 2331; EPILOG-BLOCK: entry.new: 2332; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 2333; EPILOG-BLOCK-NEXT: br label %header 2334; EPILOG-BLOCK: header: 2335; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2336; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 2337; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ] 2338; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2339; EPILOG-BLOCK: for.exiting_block: 2340; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2341; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2342; EPILOG-BLOCK: latch: 2343; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2344; EPILOG-BLOCK-NEXT: %2 = load i32, i32* %arrayidx, align 4 2345; EPILOG-BLOCK-NEXT: %add = add nsw i32 %2, %sum.02 2346; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2347; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 2348; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2349; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2350; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2351; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2352; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2353; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2354; EPILOG-BLOCK: latchExit.unr-lcssa: 2355; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2356; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2357; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2358; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2359; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2360; EPILOG-BLOCK: header.epil.preheader: 2361; EPILOG-BLOCK-NEXT: br label %header.epil 2362; EPILOG-BLOCK: header.epil: 2363; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 2364; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 2365; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2366; EPILOG-BLOCK: for.exiting_block.epil: 2367; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2368; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2369; EPILOG-BLOCK: latch.epil: 2370; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2371; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 2372; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 2373; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2374; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2375; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2376; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2377; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2378; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2379; EPILOG-BLOCK: latchExit.epilog-lcssa: 2380; 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 ] 2381; EPILOG-BLOCK-NEXT: br label %latchExit 2382; EPILOG-BLOCK: latchExit: 2383; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2384; EPILOG-BLOCK-NEXT: ret i32 %result 2385; EPILOG-BLOCK: for.exit2.loopexit: 2386; EPILOG-BLOCK-NEXT: br label %for.exit2 2387; EPILOG-BLOCK: for.exit2: 2388; EPILOG-BLOCK-NEXT: ret i32 42 2389; EPILOG-BLOCK: for.exiting_block.1: 2390; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2391; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2392; EPILOG-BLOCK: latch.1: 2393; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2394; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2395; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2396; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2397; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2398; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 2399; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2400; 2401; PROLOG-LABEL: @otherblock_latch_same_exit2( 2402; PROLOG-NEXT: entry: 2403; PROLOG-NEXT: %0 = add i64 %n, -1 2404; PROLOG-NEXT: %xtraiter = and i64 %n, 7 2405; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2406; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2407; PROLOG: header.prol.preheader: 2408; PROLOG-NEXT: br label %header.prol 2409; PROLOG: header.prol: 2410; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2411; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2412; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 2413; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 2414; PROLOG: for.exiting_block.prol: 2415; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 2416; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 2417; PROLOG: latch.prol: 2418; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 2419; PROLOG-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 2420; PROLOG-NEXT: %add.prol = add nsw i32 %1, %sum.02.prol 2421; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 2422; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2423; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 2424; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 2425; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6 2426; PROLOG: header.prol.loopexit.unr-lcssa: 2427; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2428; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 2429; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2430; PROLOG-NEXT: br label %header.prol.loopexit 2431; PROLOG: header.prol.loopexit: 2432; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 2433; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 2434; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2435; PROLOG-NEXT: %2 = icmp ult i64 %0, 7 2436; PROLOG-NEXT: br i1 %2, label %latchExit, label %entry.new 2437; PROLOG: entry.new: 2438; PROLOG-NEXT: br label %header 2439; PROLOG: header: 2440; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2441; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 2442; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2443; PROLOG: for.exiting_block: 2444; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2445; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2446; PROLOG: latch: 2447; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2448; PROLOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 2449; PROLOG-NEXT: %add = add nsw i32 %3, %sum.02 2450; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2451; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2452; PROLOG: latchExit.unr-lcssa.loopexit: 2453; PROLOG-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2454; PROLOG-NEXT: br label %latchExit.unr-lcssa 2455; PROLOG: latchExit.unr-lcssa.loopexit2: 2456; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2457; PROLOG-NEXT: br label %latchExit.unr-lcssa 2458; PROLOG: latchExit.unr-lcssa: 2459; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2460; PROLOG-NEXT: br label %latchExit 2461; PROLOG: latchExit: 2462; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2463; PROLOG-NEXT: ret i32 %result 2464; PROLOG: for.exit2.loopexit: 2465; PROLOG-NEXT: br label %for.exit2 2466; PROLOG: for.exit2.loopexit1: 2467; PROLOG-NEXT: br label %for.exit2 2468; PROLOG: for.exit2: 2469; PROLOG-NEXT: ret i32 42 2470; PROLOG: for.exiting_block.1: 2471; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2472; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2473; PROLOG: latch.1: 2474; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2475; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2476; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 2477; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2478; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2479; PROLOG: for.exiting_block.2: 2480; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2481; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2482; PROLOG: latch.2: 2483; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2484; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2485; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2486; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 2487; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2488; PROLOG: for.exiting_block.3: 2489; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2490; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2491; PROLOG: latch.3: 2492; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2493; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2494; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2495; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 2496; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2497; PROLOG: for.exiting_block.4: 2498; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2499; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2500; PROLOG: latch.4: 2501; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2502; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2503; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2504; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 2505; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2506; PROLOG: for.exiting_block.5: 2507; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2508; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2509; PROLOG: latch.5: 2510; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2511; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2512; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2513; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2514; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2515; PROLOG: for.exiting_block.6: 2516; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2517; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2518; PROLOG: latch.6: 2519; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2520; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2521; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2522; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2523; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2524; PROLOG: for.exiting_block.7: 2525; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2526; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2527; PROLOG: latch.7: 2528; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2529; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2530; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2531; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2532; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2533; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2534; 2535; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2536; PROLOG-BLOCK-NEXT: entry: 2537; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 2538; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 2539; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2540; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2541; PROLOG-BLOCK: header.prol.preheader: 2542; PROLOG-BLOCK-NEXT: br label %header.prol 2543; PROLOG-BLOCK: header.prol: 2544; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 2545; PROLOG-BLOCK: for.exiting_block.prol: 2546; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 2547; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 2548; PROLOG-BLOCK: latch.prol: 2549; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 2550; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 2551; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %1, 0 2552; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 2553; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2554; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 2555; PROLOG-BLOCK: header.prol.loopexit: 2556; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 2557; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 2558; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 2559; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 2560; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %entry.new 2561; PROLOG-BLOCK: entry.new: 2562; PROLOG-BLOCK-NEXT: br label %header 2563; PROLOG-BLOCK: header: 2564; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2565; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 2566; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2567; PROLOG-BLOCK: for.exiting_block: 2568; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2569; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2570; PROLOG-BLOCK: latch: 2571; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2572; PROLOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 2573; PROLOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2574; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2575; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2576; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2577; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2578; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2579; PROLOG-BLOCK: latchExit.unr-lcssa: 2580; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2581; PROLOG-BLOCK-NEXT: br label %latchExit 2582; PROLOG-BLOCK: latchExit: 2583; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2584; PROLOG-BLOCK-NEXT: ret i32 %result 2585; PROLOG-BLOCK: for.exit2.loopexit: 2586; PROLOG-BLOCK-NEXT: br label %for.exit2 2587; PROLOG-BLOCK: for.exit2: 2588; PROLOG-BLOCK-NEXT: ret i32 42 2589; PROLOG-BLOCK: for.exiting_block.1: 2590; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2591; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2592; PROLOG-BLOCK: latch.1: 2593; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2594; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2595; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2596; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2597; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2598; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2599; 2600 2601entry: 2602 br label %header 2603 2604header: 2605 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2606 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2607 br i1 %cond, label %for.exit2, label %for.exiting_block 2608 2609for.exiting_block: 2610 %cmp = icmp eq i64 %n, 42 2611 br i1 %cmp, label %latchExit, label %latch 2612 2613latch: ; preds = %latch, %entry 2614 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2615 %0 = load i32, i32* %arrayidx, align 4 2616 %add = add nsw i32 %0, %sum.02 2617 %indvars.iv.next = add i64 %indvars.iv, 1 2618 %exitcond = icmp eq i64 %indvars.iv.next, %n 2619 br i1 %exitcond, label %latchExit, label %header 2620 2621latchExit: ; preds = %latch, %entry 2622 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2623 ret i32 %result 2624 2625for.exit2: 2626 ret i32 42 2627} 2628 2629; Two exiting blocks to latch where the exiting blocks are Latch and a 2630; non-header 2631; Same as above test except the incoming value for cloned latch Phi is from the 2632; for.exiting_block. 2633; FIXME: We should be able to runtime unroll. 2634define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { 2635; EPILOG-LABEL: @otherblock_latch_same_exit3( 2636; EPILOG-NEXT: entry: 2637; EPILOG-NEXT: %0 = add i64 %n, -1 2638; EPILOG-NEXT: %xtraiter = and i64 %n, 7 2639; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 2640; EPILOG-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 2641; EPILOG: entry.new: 2642; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 2643; EPILOG-NEXT: br label %header 2644; EPILOG: header: 2645; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2646; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 2647; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 2648; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2649; EPILOG: for.exiting_block: 2650; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2651; EPILOG-NEXT: %2 = load i32, i32* %arrayidx, align 4 2652; EPILOG-NEXT: %add = add nsw i32 %2, %sum.02 2653; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2654; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2655; EPILOG: latch: 2656; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2657; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 2658; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2659; EPILOG: latchExit.unr-lcssa.loopexit: 2660; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2661; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2662; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2663; EPILOG-NEXT: br label %latchExit.unr-lcssa 2664; EPILOG: latchExit.unr-lcssa: 2665; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2666; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2667; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2668; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2669; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2670; EPILOG: header.epil.preheader: 2671; EPILOG-NEXT: br label %header.epil 2672; EPILOG: header.epil: 2673; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2674; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2675; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 2676; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2677; EPILOG: for.exiting_block.epil: 2678; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2679; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 2680; EPILOG-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 2681; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2682; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2683; EPILOG: latch.epil: 2684; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2685; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2686; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 2687; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 2688; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7 2689; EPILOG: latchExit.epilog-lcssa.loopexit: 2690; 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 ] 2691; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2692; EPILOG: latchExit.epilog-lcssa.loopexit3: 2693; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2694; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2695; EPILOG: latchExit.epilog-lcssa: 2696; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2697; EPILOG-NEXT: br label %latchExit 2698; EPILOG: latchExit: 2699; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2700; EPILOG-NEXT: ret i32 %result 2701; EPILOG: for.exit2.loopexit: 2702; EPILOG-NEXT: br label %for.exit2 2703; EPILOG: for.exit2.loopexit2: 2704; EPILOG-NEXT: br label %for.exit2 2705; EPILOG: for.exit2: 2706; EPILOG-NEXT: ret i32 42 2707; EPILOG: for.exiting_block.1: 2708; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2709; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2710; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2711; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2712; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2713; EPILOG: latch.1: 2714; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 2715; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2716; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2717; EPILOG: for.exiting_block.2: 2718; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2719; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2720; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2721; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2722; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2723; EPILOG: latch.2: 2724; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 2725; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 2726; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2727; EPILOG: for.exiting_block.3: 2728; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2729; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2730; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2731; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2732; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2733; EPILOG: latch.3: 2734; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 2735; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 2736; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2737; EPILOG: for.exiting_block.4: 2738; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2739; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2740; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2741; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2742; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2743; EPILOG: latch.4: 2744; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 2745; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 2746; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2747; EPILOG: for.exiting_block.5: 2748; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2749; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2750; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2751; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2752; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2753; EPILOG: latch.5: 2754; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 2755; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 2756; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2757; EPILOG: for.exiting_block.6: 2758; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2759; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2760; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2761; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2762; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2763; EPILOG: latch.6: 2764; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 2765; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 2766; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2767; EPILOG: for.exiting_block.7: 2768; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2769; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2770; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2771; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2772; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2773; EPILOG: latch.7: 2774; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2775; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 2776; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 2777; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2778; 2779; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2780; EPILOG-BLOCK-NEXT: entry: 2781; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 2782; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 2783; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 2784; EPILOG-BLOCK-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %entry.new 2785; EPILOG-BLOCK: entry.new: 2786; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 2787; EPILOG-BLOCK-NEXT: br label %header 2788; EPILOG-BLOCK: header: 2789; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2790; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 2791; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ] 2792; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2793; EPILOG-BLOCK: for.exiting_block: 2794; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2795; EPILOG-BLOCK-NEXT: %2 = load i32, i32* %arrayidx, align 4 2796; EPILOG-BLOCK-NEXT: %add = add nsw i32 %2, %sum.02 2797; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2798; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2799; EPILOG-BLOCK: latch: 2800; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2801; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 2802; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2803; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2804; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2805; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2806; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2807; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2808; EPILOG-BLOCK: latchExit.unr-lcssa: 2809; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2810; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2811; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2812; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2813; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2814; EPILOG-BLOCK: header.epil.preheader: 2815; EPILOG-BLOCK-NEXT: br label %header.epil 2816; EPILOG-BLOCK: header.epil: 2817; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 2818; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 2819; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2820; EPILOG-BLOCK: for.exiting_block.epil: 2821; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2822; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.epil, align 4 2823; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %3, %sum.02.epil 2824; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2825; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2826; EPILOG-BLOCK: latch.epil: 2827; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2828; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2829; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2830; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2831; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2832; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2833; EPILOG-BLOCK: latchExit.epilog-lcssa: 2834; 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 ] 2835; EPILOG-BLOCK-NEXT: br label %latchExit 2836; EPILOG-BLOCK: latchExit: 2837; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2838; EPILOG-BLOCK-NEXT: ret i32 %result 2839; EPILOG-BLOCK: for.exit2.loopexit: 2840; EPILOG-BLOCK-NEXT: br label %for.exit2 2841; EPILOG-BLOCK: for.exit2: 2842; EPILOG-BLOCK-NEXT: ret i32 42 2843; EPILOG-BLOCK: for.exiting_block.1: 2844; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2845; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2846; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2847; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2848; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2849; EPILOG-BLOCK: latch.1: 2850; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2851; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 2852; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 2853; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 2854; 2855; PROLOG-LABEL: @otherblock_latch_same_exit3( 2856; PROLOG-NEXT: entry: 2857; PROLOG-NEXT: %0 = add i64 %n, -1 2858; PROLOG-NEXT: %xtraiter = and i64 %n, 7 2859; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2860; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2861; PROLOG: header.prol.preheader: 2862; PROLOG-NEXT: br label %header.prol 2863; PROLOG: header.prol: 2864; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2865; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2866; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 2867; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 2868; PROLOG: for.exiting_block.prol: 2869; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 2870; PROLOG-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 2871; PROLOG-NEXT: %add.prol = add nsw i32 %1, %sum.02.prol 2872; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 2873; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 2874; PROLOG: latch.prol: 2875; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 2876; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2877; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 2878; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 2879; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7 2880; PROLOG: header.prol.loopexit.unr-lcssa: 2881; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2882; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 2883; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2884; PROLOG-NEXT: br label %header.prol.loopexit 2885; PROLOG: header.prol.loopexit: 2886; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 2887; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 2888; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2889; PROLOG-NEXT: %2 = icmp ult i64 %0, 7 2890; PROLOG-NEXT: br i1 %2, label %latchExit, label %entry.new 2891; PROLOG: entry.new: 2892; PROLOG-NEXT: br label %header 2893; PROLOG: header: 2894; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2895; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 2896; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2897; PROLOG: for.exiting_block: 2898; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2899; PROLOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 2900; PROLOG-NEXT: %add = add nsw i32 %3, %sum.02 2901; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2902; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2903; PROLOG: latch: 2904; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2905; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2906; PROLOG: latchExit.unr-lcssa.loopexit: 2907; PROLOG-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2908; PROLOG-NEXT: br label %latchExit.unr-lcssa 2909; PROLOG: latchExit.unr-lcssa.loopexit2: 2910; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2911; PROLOG-NEXT: br label %latchExit.unr-lcssa 2912; PROLOG: latchExit.unr-lcssa: 2913; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2914; PROLOG-NEXT: br label %latchExit 2915; PROLOG: latchExit: 2916; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2917; PROLOG-NEXT: ret i32 %result 2918; PROLOG: for.exit2.loopexit: 2919; PROLOG-NEXT: br label %for.exit2 2920; PROLOG: for.exit2.loopexit1: 2921; PROLOG-NEXT: br label %for.exit2 2922; PROLOG: for.exit2: 2923; PROLOG-NEXT: ret i32 42 2924; PROLOG: for.exiting_block.1: 2925; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2926; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2927; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 2928; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2929; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2930; PROLOG: latch.1: 2931; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2932; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2933; PROLOG: for.exiting_block.2: 2934; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2935; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2936; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2937; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2938; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2939; PROLOG: latch.2: 2940; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 2941; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2942; PROLOG: for.exiting_block.3: 2943; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2944; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2945; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2946; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2947; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2948; PROLOG: latch.3: 2949; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 2950; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2951; PROLOG: for.exiting_block.4: 2952; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2953; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2954; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2955; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2956; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2957; PROLOG: latch.4: 2958; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 2959; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2960; PROLOG: for.exiting_block.5: 2961; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2962; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2963; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2964; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2965; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2966; PROLOG: latch.5: 2967; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2968; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2969; PROLOG: for.exiting_block.6: 2970; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2971; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2972; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2973; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2974; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2975; PROLOG: latch.6: 2976; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2977; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2978; PROLOG: for.exiting_block.7: 2979; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2980; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2981; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2982; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2983; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2984; PROLOG: latch.7: 2985; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2986; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2987; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2988; 2989; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2990; PROLOG-BLOCK-NEXT: entry: 2991; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 2992; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 2993; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2994; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2995; PROLOG-BLOCK: header.prol.preheader: 2996; PROLOG-BLOCK-NEXT: br label %header.prol 2997; PROLOG-BLOCK: header.prol: 2998; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 2999; PROLOG-BLOCK: for.exiting_block.prol: 3000; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 3001; PROLOG-BLOCK-NEXT: %1 = load i32, i32* %arrayidx.prol, align 4 3002; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %1, 0 3003; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 3004; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 3005; PROLOG-BLOCK: latch.prol: 3006; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 3007; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3008; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3009; PROLOG-BLOCK: header.prol.loopexit: 3010; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 3011; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 3012; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 3013; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 3014; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %entry.new 3015; PROLOG-BLOCK: entry.new: 3016; PROLOG-BLOCK-NEXT: br label %header 3017; PROLOG-BLOCK: header: 3018; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3019; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 3020; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 3021; PROLOG-BLOCK: for.exiting_block: 3022; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3023; PROLOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 3024; PROLOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 3025; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3026; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 3027; PROLOG-BLOCK: latch: 3028; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 3029; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 3030; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 3031; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 3032; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3033; PROLOG-BLOCK: latchExit.unr-lcssa: 3034; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 3035; PROLOG-BLOCK-NEXT: br label %latchExit 3036; PROLOG-BLOCK: latchExit: 3037; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 3038; PROLOG-BLOCK-NEXT: ret i32 %result 3039; PROLOG-BLOCK: for.exit2.loopexit: 3040; PROLOG-BLOCK-NEXT: br label %for.exit2 3041; PROLOG-BLOCK: for.exit2: 3042; PROLOG-BLOCK-NEXT: ret i32 42 3043; PROLOG-BLOCK: for.exiting_block.1: 3044; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3045; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 3046; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 3047; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3048; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 3049; PROLOG-BLOCK: latch.1: 3050; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3051; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 3052; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 3053; 3054 3055entry: 3056 br label %header 3057 3058header: 3059 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 3060 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 3061 br i1 %cond, label %for.exit2, label %for.exiting_block 3062 3063for.exiting_block: 3064 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3065 %0 = load i32, i32* %arrayidx, align 4 3066 %add = add nsw i32 %0, %sum.02 3067 %cmp = icmp eq i64 %n, 42 3068 br i1 %cmp, label %latchExit, label %latch 3069 3070latch: ; preds = %latch, %entry 3071 %indvars.iv.next = add i64 %indvars.iv, 1 3072 %exitcond = icmp eq i64 %indvars.iv.next, %n 3073 br i1 %exitcond, label %latchExit, label %header 3074 3075latchExit: ; preds = %latch, %entry 3076 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 3077 ret i32 %result 3078 3079for.exit2: 3080 ret i32 42 3081} 3082 3083; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit). 3084; Only 2 blocks in loop: header and latch where both exit to same LatchExit. 3085define void @unique_exit(i32 %arg) { 3086; CHECK-LABEL: @unique_exit( 3087; CHECK-NEXT: entry: 3088; CHECK-NEXT: %i = icmp sgt i32 undef, %arg 3089; CHECK-NEXT: br i1 %i, label %preheader, label %returnblock 3090; CHECK: preheader: 3091; CHECK-NEXT: br label %header 3092; CHECK: header: 3093; CHECK-NEXT: br i1 true, label %latchExit, label %latch 3094; CHECK: latch: 3095; CHECK-NEXT: br label %latchExit 3096; CHECK: latchExit: 3097; CHECK-NEXT: %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ] 3098; CHECK-NEXT: br label %returnblock 3099; CHECK: returnblock: 3100; CHECK-NEXT: %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 3101; CHECK-NEXT: ret void 3102; 3103 3104entry: 3105 %i = icmp sgt i32 undef, %arg 3106 br i1 %i, label %preheader, label %returnblock 3107 3108preheader: ; preds = %entry 3109 br label %header 3110 3111header: ; preds = %preheader, %latch 3112 %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] 3113 %inc = add nsw i32 %i4, 1 3114 br i1 true, label %latchExit, label %latch 3115 3116latch: ; preds = %header 3117 %cmp = icmp slt i32 %inc, undef 3118 br i1 %cmp, label %header, label %latchExit 3119 3120latchExit: ; preds = %header, %latch 3121 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3122 br label %returnblock 3123 3124returnblock: ; preds = %latchExit, %entry 3125 %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 3126 ret void 3127} 3128 3129; two exiting and two exit blocks. 3130; the non-latch exiting block has duplicate edges to the non-latch exit block. 3131define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 3132; EPILOG-LABEL: @test5( 3133; EPILOG-NEXT: entry: 3134; EPILOG-NEXT: %0 = add i64 %trip, -1 3135; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 3136; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3137; EPILOG-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3138; EPILOG: entry.new: 3139; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3140; EPILOG-NEXT: br label %loop_header 3141; EPILOG: loop_header: 3142; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3143; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3144; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 3145; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3146; EPILOG: loop_exiting: 3147; EPILOG-NEXT: %ivy = add i64 %iv, %add 3148; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 3149; EPILOG-NEXT: i64 24, label %exit1.loopexit 3150; EPILOG-NEXT: i64 42, label %exit1.loopexit 3151; EPILOG-NEXT: ] 3152; EPILOG: loop_latch: 3153; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3154; EPILOG-NEXT: %sum.next = add i64 %sum, %add 3155; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 3156; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3157; EPILOG: exit1.loopexit: 3158; 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 ] 3159; EPILOG-NEXT: br label %exit1 3160; EPILOG: exit1.loopexit2: 3161; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 3162; EPILOG-NEXT: br label %exit1 3163; EPILOG: exit1: 3164; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 3165; EPILOG-NEXT: ret i64 %result 3166; EPILOG: latchexit.unr-lcssa.loopexit: 3167; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3168; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 3169; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3170; EPILOG-NEXT: br label %latchexit.unr-lcssa 3171; EPILOG: latchexit.unr-lcssa: 3172; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3173; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3174; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3175; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3176; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3177; EPILOG: loop_header.epil.preheader: 3178; EPILOG-NEXT: br label %loop_header.epil 3179; EPILOG: loop_header.epil: 3180; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 3181; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 3182; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ] 3183; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3184; EPILOG: loop_exiting.epil: 3185; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 3186; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3187; EPILOG-NEXT: i64 24, label %exit1.loopexit2 3188; EPILOG-NEXT: i64 42, label %exit1.loopexit2 3189; EPILOG-NEXT: ] 3190; EPILOG: loop_latch.epil: 3191; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3192; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3193; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 3194; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3195; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3196; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !8 3197; EPILOG: latchexit.epilog-lcssa: 3198; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 3199; EPILOG-NEXT: br label %latchexit 3200; EPILOG: latchexit: 3201; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 3202; EPILOG-NEXT: ret i64 %sum.next.lcssa 3203; EPILOG: loop_exiting.1: 3204; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3205; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3206; EPILOG-NEXT: i64 24, label %exit1.loopexit 3207; EPILOG-NEXT: i64 42, label %exit1.loopexit 3208; EPILOG-NEXT: ] 3209; EPILOG: loop_latch.1: 3210; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3211; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3212; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3213; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3214; EPILOG: loop_exiting.2: 3215; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3216; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3217; EPILOG-NEXT: i64 24, label %exit1.loopexit 3218; EPILOG-NEXT: i64 42, label %exit1.loopexit 3219; EPILOG-NEXT: ] 3220; EPILOG: loop_latch.2: 3221; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3222; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3223; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3224; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3225; EPILOG: loop_exiting.3: 3226; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3227; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3228; EPILOG-NEXT: i64 24, label %exit1.loopexit 3229; EPILOG-NEXT: i64 42, label %exit1.loopexit 3230; EPILOG-NEXT: ] 3231; EPILOG: loop_latch.3: 3232; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3233; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3234; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3235; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3236; EPILOG: loop_exiting.4: 3237; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3238; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3239; EPILOG-NEXT: i64 24, label %exit1.loopexit 3240; EPILOG-NEXT: i64 42, label %exit1.loopexit 3241; EPILOG-NEXT: ] 3242; EPILOG: loop_latch.4: 3243; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3244; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3245; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3246; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3247; EPILOG: loop_exiting.5: 3248; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3249; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3250; EPILOG-NEXT: i64 24, label %exit1.loopexit 3251; EPILOG-NEXT: i64 42, label %exit1.loopexit 3252; EPILOG-NEXT: ] 3253; EPILOG: loop_latch.5: 3254; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3255; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3256; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3257; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3258; EPILOG: loop_exiting.6: 3259; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3260; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3261; EPILOG-NEXT: i64 24, label %exit1.loopexit 3262; EPILOG-NEXT: i64 42, label %exit1.loopexit 3263; EPILOG-NEXT: ] 3264; EPILOG: loop_latch.6: 3265; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3266; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3267; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3268; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3269; EPILOG: loop_exiting.7: 3270; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3271; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3272; EPILOG-NEXT: i64 24, label %exit1.loopexit 3273; EPILOG-NEXT: i64 42, label %exit1.loopexit 3274; EPILOG-NEXT: ] 3275; EPILOG: loop_latch.7: 3276; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3277; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3278; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3279; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 3280; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 3281; 3282; EPILOG-BLOCK-LABEL: @test5( 3283; EPILOG-BLOCK-NEXT: entry: 3284; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3285; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3286; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3287; EPILOG-BLOCK-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3288; EPILOG-BLOCK: entry.new: 3289; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3290; EPILOG-BLOCK-NEXT: br label %loop_header 3291; EPILOG-BLOCK: loop_header: 3292; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3293; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3294; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ] 3295; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3296; EPILOG-BLOCK: loop_exiting: 3297; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3298; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3299; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3300; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3301; EPILOG-BLOCK-NEXT: ] 3302; EPILOG-BLOCK: loop_latch: 3303; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3304; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3305; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 3306; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3307; EPILOG-BLOCK: exit1.loopexit: 3308; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3309; EPILOG-BLOCK-NEXT: br label %exit1 3310; EPILOG-BLOCK: exit1: 3311; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 3312; EPILOG-BLOCK-NEXT: ret i64 %result 3313; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3314; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3315; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 3316; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3317; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3318; EPILOG-BLOCK: latchexit.unr-lcssa: 3319; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3320; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3321; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3322; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3323; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3324; EPILOG-BLOCK: loop_header.epil.preheader: 3325; EPILOG-BLOCK-NEXT: br label %loop_header.epil 3326; EPILOG-BLOCK: loop_header.epil: 3327; EPILOG-BLOCK-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ] 3328; EPILOG-BLOCK-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ] 3329; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3330; EPILOG-BLOCK: loop_exiting.epil: 3331; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.epil, %add 3332; EPILOG-BLOCK-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3333; EPILOG-BLOCK-NEXT: i64 24, label %exit1 3334; EPILOG-BLOCK-NEXT: i64 42, label %exit1 3335; EPILOG-BLOCK-NEXT: ] 3336; EPILOG-BLOCK: loop_latch.epil: 3337; EPILOG-BLOCK-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3338; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3339; EPILOG-BLOCK-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 3340; EPILOG-BLOCK-NEXT: br label %latchexit.epilog-lcssa 3341; EPILOG-BLOCK: latchexit.epilog-lcssa: 3342; EPILOG-BLOCK-NEXT: br label %latchexit 3343; EPILOG-BLOCK: latchexit: 3344; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %latchexit.epilog-lcssa ] 3345; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3346; EPILOG-BLOCK: loop_exiting.1: 3347; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3348; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3349; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3350; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3351; EPILOG-BLOCK-NEXT: ] 3352; EPILOG-BLOCK: loop_latch.1: 3353; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3354; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3355; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3356; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 3357; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8 3358; 3359; PROLOG-LABEL: @test5( 3360; PROLOG-NEXT: entry: 3361; PROLOG-NEXT: %0 = add i64 %trip, -1 3362; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 3363; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3364; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3365; PROLOG: loop_header.prol.preheader: 3366; PROLOG-NEXT: br label %loop_header.prol 3367; PROLOG: loop_header.prol: 3368; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 3369; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 3370; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ] 3371; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3372; PROLOG: loop_exiting.prol: 3373; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 3374; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 3375; PROLOG-NEXT: i64 24, label %exit1.loopexit1 3376; PROLOG-NEXT: i64 42, label %exit1.loopexit1 3377; PROLOG-NEXT: ] 3378; PROLOG: loop_latch.prol: 3379; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 3380; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 3381; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 3382; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 3383; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 3384; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !8 3385; PROLOG: loop_header.prol.loopexit.unr-lcssa: 3386; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 3387; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3388; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3389; PROLOG-NEXT: br label %loop_header.prol.loopexit 3390; PROLOG: loop_header.prol.loopexit: 3391; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3392; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3393; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3394; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 3395; PROLOG-NEXT: br i1 %1, label %latchexit, label %entry.new 3396; PROLOG: entry.new: 3397; PROLOG-NEXT: br label %loop_header 3398; PROLOG: loop_header: 3399; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3400; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3401; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3402; PROLOG: loop_exiting: 3403; PROLOG-NEXT: %ivy = add i64 %iv, %add 3404; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 3405; PROLOG-NEXT: i64 24, label %exit1.loopexit 3406; PROLOG-NEXT: i64 42, label %exit1.loopexit 3407; PROLOG-NEXT: ] 3408; PROLOG: loop_latch: 3409; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3410; PROLOG-NEXT: %sum.next = add i64 %sum, %add 3411; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3412; PROLOG: exit1.loopexit: 3413; 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 ] 3414; PROLOG-NEXT: br label %exit1 3415; PROLOG: exit1.loopexit1: 3416; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 3417; PROLOG-NEXT: br label %exit1 3418; PROLOG: exit1: 3419; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 3420; PROLOG-NEXT: ret i64 %result 3421; PROLOG: latchexit.unr-lcssa: 3422; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3423; PROLOG-NEXT: br label %latchexit 3424; PROLOG: latchexit: 3425; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3426; PROLOG-NEXT: ret i64 %sum.next.lcssa 3427; PROLOG: loop_exiting.1: 3428; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3429; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3430; PROLOG-NEXT: i64 24, label %exit1.loopexit 3431; PROLOG-NEXT: i64 42, label %exit1.loopexit 3432; PROLOG-NEXT: ] 3433; PROLOG: loop_latch.1: 3434; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3435; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3436; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3437; PROLOG: loop_exiting.2: 3438; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3439; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3440; PROLOG-NEXT: i64 24, label %exit1.loopexit 3441; PROLOG-NEXT: i64 42, label %exit1.loopexit 3442; PROLOG-NEXT: ] 3443; PROLOG: loop_latch.2: 3444; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3445; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3446; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3447; PROLOG: loop_exiting.3: 3448; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3449; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3450; PROLOG-NEXT: i64 24, label %exit1.loopexit 3451; PROLOG-NEXT: i64 42, label %exit1.loopexit 3452; PROLOG-NEXT: ] 3453; PROLOG: loop_latch.3: 3454; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3455; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3456; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3457; PROLOG: loop_exiting.4: 3458; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3459; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3460; PROLOG-NEXT: i64 24, label %exit1.loopexit 3461; PROLOG-NEXT: i64 42, label %exit1.loopexit 3462; PROLOG-NEXT: ] 3463; PROLOG: loop_latch.4: 3464; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3465; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3466; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3467; PROLOG: loop_exiting.5: 3468; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3469; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3470; PROLOG-NEXT: i64 24, label %exit1.loopexit 3471; PROLOG-NEXT: i64 42, label %exit1.loopexit 3472; PROLOG-NEXT: ] 3473; PROLOG: loop_latch.5: 3474; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3475; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3476; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3477; PROLOG: loop_exiting.6: 3478; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3479; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3480; PROLOG-NEXT: i64 24, label %exit1.loopexit 3481; PROLOG-NEXT: i64 42, label %exit1.loopexit 3482; PROLOG-NEXT: ] 3483; PROLOG: loop_latch.6: 3484; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3485; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3486; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3487; PROLOG: loop_exiting.7: 3488; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3489; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3490; PROLOG-NEXT: i64 24, label %exit1.loopexit 3491; PROLOG-NEXT: i64 42, label %exit1.loopexit 3492; PROLOG-NEXT: ] 3493; PROLOG: loop_latch.7: 3494; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3495; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3496; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 3497; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 3498; 3499; PROLOG-BLOCK-LABEL: @test5( 3500; PROLOG-BLOCK-NEXT: entry: 3501; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3502; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3503; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3504; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3505; PROLOG-BLOCK: loop_header.prol.preheader: 3506; PROLOG-BLOCK-NEXT: br label %loop_header.prol 3507; PROLOG-BLOCK: loop_header.prol: 3508; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3509; PROLOG-BLOCK: loop_exiting.prol: 3510; PROLOG-BLOCK-NEXT: %ivy.prol = add i64 0, %add 3511; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 3512; PROLOG-BLOCK-NEXT: i64 24, label %exit1 3513; PROLOG-BLOCK-NEXT: i64 42, label %exit1 3514; PROLOG-BLOCK-NEXT: ] 3515; PROLOG-BLOCK: loop_latch.prol: 3516; PROLOG-BLOCK-NEXT: %iv_next.prol = add nuw nsw i64 0, 1 3517; PROLOG-BLOCK-NEXT: %sum.next.prol = add i64 0, %add 3518; PROLOG-BLOCK-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 3519; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 3520; PROLOG-BLOCK: loop_header.prol.loopexit: 3521; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ] 3522; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ] 3523; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.prol, %loop_latch.prol ] 3524; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3525; PROLOG-BLOCK-NEXT: br i1 %1, label %latchexit, label %entry.new 3526; PROLOG-BLOCK: entry.new: 3527; PROLOG-BLOCK-NEXT: br label %loop_header 3528; PROLOG-BLOCK: loop_header: 3529; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3530; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3531; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3532; PROLOG-BLOCK: loop_exiting: 3533; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3534; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3535; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3536; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3537; PROLOG-BLOCK-NEXT: ] 3538; PROLOG-BLOCK: loop_latch: 3539; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3540; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3541; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3542; PROLOG-BLOCK: exit1.loopexit: 3543; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3544; PROLOG-BLOCK-NEXT: br label %exit1 3545; PROLOG-BLOCK: exit1: 3546; PROLOG-BLOCK-NEXT: %result = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 3547; PROLOG-BLOCK-NEXT: ret i64 %result 3548; PROLOG-BLOCK: latchexit.unr-lcssa: 3549; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3550; PROLOG-BLOCK-NEXT: br label %latchexit 3551; PROLOG-BLOCK: latchexit: 3552; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3553; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3554; PROLOG-BLOCK: loop_exiting.1: 3555; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3556; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3557; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3558; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3559; PROLOG-BLOCK-NEXT: ] 3560; PROLOG-BLOCK: loop_latch.1: 3561; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3562; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3563; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 3564; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8 3565; 3566 3567entry: 3568 br label %loop_header 3569 3570loop_header: 3571 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3572 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3573 br i1 %cond, label %loop_latch, label %loop_exiting 3574 3575loop_exiting: 3576 %ivy = add i64 %iv, %add 3577 switch i64 %sum, label %loop_latch [ 3578 i64 24, label %exit1 3579 i64 42, label %exit1 3580 ] 3581 3582loop_latch: 3583 %iv_next = add nuw nsw i64 %iv, 1 3584 %sum.next = add i64 %sum, %add 3585 %cmp = icmp ne i64 %iv_next, %trip 3586 br i1 %cmp, label %loop_header, label %latchexit 3587 3588exit1: 3589 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3590 ret i64 %result 3591 3592latchexit: 3593 ret i64 %sum.next 3594} 3595 3596; test when exit blocks have successors. 3597define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 3598; EPILOG-LABEL: @test6( 3599; EPILOG-NEXT: entry: 3600; EPILOG-NEXT: %0 = add i64 %n, -1 3601; EPILOG-NEXT: %xtraiter = and i64 %n, 7 3602; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3603; EPILOG-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3604; EPILOG: entry.new: 3605; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3606; EPILOG-NEXT: br label %header 3607; EPILOG: header: 3608; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3609; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3610; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ] 3611; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3612; EPILOG: for.exiting_block: 3613; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3614; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3615; EPILOG: latch: 3616; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3617; EPILOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3618; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3619; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3620; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 3621; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3622; EPILOG: latch_exit.unr-lcssa.loopexit: 3623; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3624; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3625; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3626; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3627; EPILOG: latch_exit.unr-lcssa: 3628; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3629; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3630; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3631; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3632; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3633; EPILOG: header.epil.preheader: 3634; EPILOG-NEXT: br label %header.epil 3635; EPILOG: header.epil: 3636; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3637; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3638; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 3639; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3640; EPILOG: for.exiting_block.epil: 3641; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3642; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3643; EPILOG: latch.epil: 3644; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3645; EPILOG-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3646; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3647; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3648; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3649; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 3650; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 3651; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !9 3652; EPILOG: latch_exit.epilog-lcssa: 3653; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3654; EPILOG-NEXT: br label %latch_exit 3655; EPILOG: latch_exit: 3656; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3657; EPILOG-NEXT: ret i32 %sum.0.lcssa 3658; EPILOG: for.exit2.loopexit: 3659; 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 ] 3660; EPILOG-NEXT: br label %for.exit2 3661; EPILOG: for.exit2.loopexit2: 3662; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3663; EPILOG-NEXT: br label %for.exit2 3664; EPILOG: for.exit2: 3665; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3666; EPILOG-NEXT: %addx = add i32 %retval, %x 3667; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3668; EPILOG: exit_true: 3669; EPILOG-NEXT: ret i32 %retval 3670; EPILOG: exit_false: 3671; EPILOG-NEXT: ret i32 %addx 3672; EPILOG: for.exiting_block.1: 3673; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3674; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3675; EPILOG: latch.1: 3676; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3677; EPILOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3678; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3679; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 3680; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3681; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3682; EPILOG: for.exiting_block.2: 3683; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3684; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3685; EPILOG: latch.2: 3686; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3687; EPILOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3688; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3689; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 3690; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 3691; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3692; EPILOG: for.exiting_block.3: 3693; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3694; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3695; EPILOG: latch.3: 3696; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3697; EPILOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3698; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3699; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 3700; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 3701; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3702; EPILOG: for.exiting_block.4: 3703; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3704; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3705; EPILOG: latch.4: 3706; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3707; EPILOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3708; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3709; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 3710; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 3711; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3712; EPILOG: for.exiting_block.5: 3713; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3714; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3715; EPILOG: latch.5: 3716; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3717; EPILOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3718; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3719; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 3720; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 3721; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3722; EPILOG: for.exiting_block.6: 3723; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3724; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3725; EPILOG: latch.6: 3726; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3727; EPILOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3728; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3729; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 3730; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 3731; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3732; EPILOG: for.exiting_block.7: 3733; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3734; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3735; EPILOG: latch.7: 3736; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3737; EPILOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3738; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3739; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3740; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 3741; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 3742; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3743; 3744; EPILOG-BLOCK-LABEL: @test6( 3745; EPILOG-BLOCK-NEXT: entry: 3746; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 3747; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3748; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3749; EPILOG-BLOCK-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3750; EPILOG-BLOCK: entry.new: 3751; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3752; EPILOG-BLOCK-NEXT: br label %header 3753; EPILOG-BLOCK: header: 3754; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3755; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 3756; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ] 3757; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3758; EPILOG-BLOCK: for.exiting_block: 3759; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3760; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3761; EPILOG-BLOCK: latch: 3762; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3763; EPILOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3764; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3765; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3766; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 3767; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3768; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 3769; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 3770; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 3771; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 3772; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 3773; EPILOG-BLOCK: latch_exit.unr-lcssa: 3774; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3775; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3776; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3777; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3778; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3779; EPILOG-BLOCK: header.epil.preheader: 3780; EPILOG-BLOCK-NEXT: br label %header.epil 3781; EPILOG-BLOCK: header.epil: 3782; EPILOG-BLOCK-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ] 3783; EPILOG-BLOCK-NEXT: %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ] 3784; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 3785; EPILOG-BLOCK: for.exiting_block.epil: 3786; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 3787; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 3788; EPILOG-BLOCK: latch.epil: 3789; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3790; EPILOG-BLOCK-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3791; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3792; EPILOG-BLOCK-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3793; EPILOG-BLOCK-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3794; EPILOG-BLOCK-NEXT: br label %latch_exit.epilog-lcssa 3795; EPILOG-BLOCK: latch_exit.epilog-lcssa: 3796; EPILOG-BLOCK-NEXT: br label %latch_exit 3797; EPILOG-BLOCK: latch_exit: 3798; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch_exit.epilog-lcssa ] 3799; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 3800; EPILOG-BLOCK: for.exit2.loopexit: 3801; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 3802; EPILOG-BLOCK-NEXT: br label %for.exit2 3803; EPILOG-BLOCK: for.exit2: 3804; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 3805; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 3806; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 3807; EPILOG-BLOCK: exit_true: 3808; EPILOG-BLOCK-NEXT: ret i32 %retval 3809; EPILOG-BLOCK: exit_false: 3810; EPILOG-BLOCK-NEXT: ret i32 %addx 3811; EPILOG-BLOCK: for.exiting_block.1: 3812; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3813; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3814; EPILOG-BLOCK: latch.1: 3815; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3816; EPILOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3817; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3818; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3819; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 3820; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0 3821; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9 3822; 3823; PROLOG-LABEL: @test6( 3824; PROLOG-NEXT: entry: 3825; PROLOG-NEXT: %0 = add i64 %n, -1 3826; PROLOG-NEXT: %xtraiter = and i64 %n, 7 3827; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3828; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3829; PROLOG: header.prol.preheader: 3830; PROLOG-NEXT: br label %header.prol 3831; PROLOG: header.prol: 3832; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3833; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3834; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 3835; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 3836; PROLOG: for.exiting_block.prol: 3837; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 3838; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 3839; PROLOG: latch.prol: 3840; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 3841; PROLOG-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 3842; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 3843; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 3844; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3845; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 3846; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 3847; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !9 3848; PROLOG: header.prol.loopexit.unr-lcssa: 3849; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3850; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 3851; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3852; PROLOG-NEXT: br label %header.prol.loopexit 3853; PROLOG: header.prol.loopexit: 3854; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 3855; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 3856; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 3857; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 3858; PROLOG-NEXT: br i1 %1, label %latch_exit, label %entry.new 3859; PROLOG: entry.new: 3860; PROLOG-NEXT: br label %header 3861; PROLOG: header: 3862; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3863; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 3864; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3865; PROLOG: for.exiting_block: 3866; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 3867; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3868; PROLOG: latch: 3869; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3870; PROLOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3871; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 3872; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 3873; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3874; PROLOG: latch_exit.unr-lcssa: 3875; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 3876; PROLOG-NEXT: br label %latch_exit 3877; PROLOG: latch_exit: 3878; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 3879; PROLOG-NEXT: ret i32 %sum.0.lcssa 3880; PROLOG: for.exit2.loopexit: 3881; 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 ] 3882; PROLOG-NEXT: br label %for.exit2 3883; PROLOG: for.exit2.loopexit1: 3884; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 3885; PROLOG-NEXT: br label %for.exit2 3886; PROLOG: for.exit2: 3887; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 3888; PROLOG-NEXT: %addx = add i32 %retval, %x 3889; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3890; PROLOG: exit_true: 3891; PROLOG-NEXT: ret i32 %retval 3892; PROLOG: exit_false: 3893; PROLOG-NEXT: ret i32 %addx 3894; PROLOG: for.exiting_block.1: 3895; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3896; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3897; PROLOG: latch.1: 3898; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3899; PROLOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3900; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3901; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3902; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3903; PROLOG: for.exiting_block.2: 3904; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3905; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3906; PROLOG: latch.2: 3907; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3908; PROLOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3909; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3910; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 3911; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3912; PROLOG: for.exiting_block.3: 3913; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3914; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3915; PROLOG: latch.3: 3916; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3917; PROLOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3918; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3919; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 3920; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3921; PROLOG: for.exiting_block.4: 3922; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3923; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3924; PROLOG: latch.4: 3925; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3926; PROLOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3927; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3928; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 3929; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3930; PROLOG: for.exiting_block.5: 3931; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3932; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3933; PROLOG: latch.5: 3934; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3935; PROLOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3936; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3937; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 3938; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3939; PROLOG: for.exiting_block.6: 3940; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3941; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3942; PROLOG: latch.6: 3943; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3944; PROLOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3945; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3946; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 3947; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3948; PROLOG: for.exiting_block.7: 3949; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3950; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3951; PROLOG: latch.7: 3952; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3953; PROLOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3954; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3955; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3956; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 3957; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 3958; 3959; PROLOG-BLOCK-LABEL: @test6( 3960; PROLOG-BLOCK-NEXT: entry: 3961; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 3962; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3963; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3964; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3965; PROLOG-BLOCK: header.prol.preheader: 3966; PROLOG-BLOCK-NEXT: br label %header.prol 3967; PROLOG-BLOCK: header.prol: 3968; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 3969; PROLOG-BLOCK: for.exiting_block.prol: 3970; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 3971; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 3972; PROLOG-BLOCK: latch.prol: 3973; PROLOG-BLOCK-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0 3974; PROLOG-BLOCK-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 3975; PROLOG-BLOCK-NEXT: %add.prol = add nsw i32 %load.prol, 0 3976; PROLOG-BLOCK-NEXT: %indvars.iv.next.prol = add i64 0, 1 3977; PROLOG-BLOCK-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3978; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3979; PROLOG-BLOCK: header.prol.loopexit: 3980; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ] 3981; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ] 3982; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ] 3983; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3984; PROLOG-BLOCK-NEXT: br i1 %1, label %latch_exit, label %entry.new 3985; PROLOG-BLOCK: entry.new: 3986; PROLOG-BLOCK-NEXT: br label %header 3987; PROLOG-BLOCK: header: 3988; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3989; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 3990; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3991; PROLOG-BLOCK: for.exiting_block: 3992; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3993; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3994; PROLOG-BLOCK: latch: 3995; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3996; PROLOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3997; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3998; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 3999; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4000; PROLOG-BLOCK: latch_exit.unr-lcssa: 4001; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 4002; PROLOG-BLOCK-NEXT: br label %latch_exit 4003; PROLOG-BLOCK: latch_exit: 4004; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4005; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4006; PROLOG-BLOCK: for.exit2.loopexit: 4007; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4008; PROLOG-BLOCK-NEXT: br label %for.exit2 4009; PROLOG-BLOCK: for.exit2: 4010; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 4011; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4012; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4013; PROLOG-BLOCK: exit_true: 4014; PROLOG-BLOCK-NEXT: ret i32 %retval 4015; PROLOG-BLOCK: exit_false: 4016; PROLOG-BLOCK-NEXT: ret i32 %addx 4017; PROLOG-BLOCK: for.exiting_block.1: 4018; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4019; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4020; PROLOG-BLOCK: latch.1: 4021; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4022; PROLOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4023; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4024; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4025; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 4026; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9 4027; 4028 4029entry: 4030 br label %header 4031 4032header: 4033 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 4034 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 4035 br i1 false, label %for.exit2, label %for.exiting_block 4036 4037for.exiting_block: 4038 %cmp = icmp eq i64 %n, 42 4039 br i1 %cmp, label %for.exit2, label %latch 4040 4041latch: 4042 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4043 %load = load i32, i32* %arrayidx, align 4 4044 %add = add nsw i32 %load, %sum.02 4045 %indvars.iv.next = add i64 %indvars.iv, 1 4046 %exitcond = icmp eq i64 %indvars.iv.next, %n 4047 br i1 %exitcond, label %latch_exit, label %header 4048 4049latch_exit: 4050 %sum.0.lcssa = phi i32 [ %add, %latch ] 4051 ret i32 %sum.0.lcssa 4052 4053for.exit2: 4054 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 4055 %addx = add i32 %retval, %x 4056 br i1 %cond, label %exit_true, label %exit_false 4057 4058exit_true: 4059 ret i32 %retval 4060 4061exit_false: 4062 ret i32 %addx 4063} 4064 4065; test when value in exit block does not have VMap. 4066define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 4067; EPILOG-LABEL: @test7( 4068; EPILOG-NEXT: bb: 4069; EPILOG-NEXT: %i = icmp slt i32 undef, 2 4070; EPILOG-NEXT: %sext = sext i32 undef to i64 4071; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 4072; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4073; EPILOG: preheader: 4074; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 4075; EPILOG-NEXT: %1 = add nsw i64 %sext, -2 4076; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4077; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4078; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4079; EPILOG: preheader.new: 4080; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4081; EPILOG-NEXT: br label %header 4082; EPILOG: header: 4083; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 4084; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ] 4085; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4086; EPILOG: latch: 4087; EPILOG-NEXT: %add = add nuw nsw i64 %i6, 1 4088; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1 4089; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4090; EPILOG: latchexit.unr-lcssa.loopexit: 4091; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 4092; EPILOG-NEXT: br label %latchexit.unr-lcssa 4093; EPILOG: latchexit.unr-lcssa: 4094; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4095; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4096; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4097; EPILOG: header.epil.preheader: 4098; EPILOG-NEXT: br label %header.epil 4099; EPILOG: header.epil: 4100; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 4101; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ] 4102; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 4103; EPILOG: latch.epil: 4104; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4105; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 4106; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1 4107; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0 4108; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !10 4109; EPILOG: latchexit.epilog-lcssa: 4110; EPILOG-NEXT: br label %latchexit 4111; EPILOG: latchexit: 4112; EPILOG-NEXT: unreachable 4113; EPILOG: loopexit2: 4114; EPILOG-NEXT: ret i32 %shft 4115; EPILOG: loopexit1.loopexit: 4116; 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 ] 4117; EPILOG-NEXT: br label %loopexit1 4118; EPILOG: loopexit1.loopexit1: 4119; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 4120; EPILOG-NEXT: br label %loopexit1 4121; EPILOG: loopexit1: 4122; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4123; EPILOG-NEXT: ret i32 %sext3 4124; EPILOG: latch.1: 4125; EPILOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4126; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 4127; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4128; EPILOG: latch.2: 4129; EPILOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4130; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1 4131; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4132; EPILOG: latch.3: 4133; EPILOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4134; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1 4135; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4136; EPILOG: latch.4: 4137; EPILOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4138; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1 4139; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4140; EPILOG: latch.5: 4141; EPILOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4142; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1 4143; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4144; EPILOG: latch.6: 4145; EPILOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4146; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1 4147; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4148; EPILOG: latch.7: 4149; EPILOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4150; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1 4151; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0 4152; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 4153; 4154; EPILOG-BLOCK-LABEL: @test7( 4155; EPILOG-BLOCK-NEXT: bb: 4156; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4157; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4158; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4159; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4160; EPILOG-BLOCK: preheader: 4161; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4162; EPILOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4163; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4164; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4165; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4166; EPILOG-BLOCK: preheader.new: 4167; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4168; EPILOG-BLOCK-NEXT: br label %header 4169; EPILOG-BLOCK: header: 4170; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 4171; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.1, %latch.1 ] 4172; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4173; EPILOG-BLOCK: latch: 4174; EPILOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4175; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1 4176; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4177; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 4178; EPILOG-BLOCK-NEXT: %i6.unr.ph = phi i64 [ %add.1, %latch.1 ] 4179; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 4180; EPILOG-BLOCK: latchexit.unr-lcssa: 4181; EPILOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4182; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4183; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4184; EPILOG-BLOCK: header.epil.preheader: 4185; EPILOG-BLOCK-NEXT: br label %header.epil 4186; EPILOG-BLOCK: header.epil: 4187; EPILOG-BLOCK-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ] 4188; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 4189; EPILOG-BLOCK: latch.epil: 4190; EPILOG-BLOCK-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4191; EPILOG-BLOCK-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 4192; EPILOG-BLOCK-NEXT: br label %latchexit.epilog-lcssa 4193; EPILOG-BLOCK: latchexit.epilog-lcssa: 4194; EPILOG-BLOCK-NEXT: br label %latchexit 4195; EPILOG-BLOCK: latchexit: 4196; EPILOG-BLOCK-NEXT: unreachable 4197; EPILOG-BLOCK: loopexit2: 4198; EPILOG-BLOCK-NEXT: ret i32 %shft 4199; EPILOG-BLOCK: loopexit1.loopexit: 4200; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4201; EPILOG-BLOCK-NEXT: br label %loopexit1 4202; EPILOG-BLOCK: loopexit1: 4203; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 4204; EPILOG-BLOCK-NEXT: ret i32 %sext3 4205; EPILOG-BLOCK: latch.1: 4206; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4207; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1 4208; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0 4209; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10 4210; 4211; PROLOG-LABEL: @test7( 4212; PROLOG-NEXT: bb: 4213; PROLOG-NEXT: %i = icmp slt i32 undef, 2 4214; PROLOG-NEXT: %sext = sext i32 undef to i64 4215; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 4216; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4217; PROLOG: preheader: 4218; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 4219; PROLOG-NEXT: %1 = add nsw i64 %sext, -2 4220; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4221; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4222; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4223; PROLOG: header.prol.preheader: 4224; PROLOG-NEXT: br label %header.prol 4225; PROLOG: header.prol: 4226; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 4227; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 4228; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 4229; PROLOG: latch.prol: 4230; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 4231; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 4232; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 4233; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 4234; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10 4235; PROLOG: header.prol.loopexit.unr-lcssa: 4236; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 4237; PROLOG-NEXT: br label %header.prol.loopexit 4238; PROLOG: header.prol.loopexit: 4239; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 4240; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4241; PROLOG-NEXT: br i1 %2, label %latchexit, label %preheader.new 4242; PROLOG: preheader.new: 4243; PROLOG-NEXT: br label %header 4244; PROLOG: header: 4245; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 4246; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4247; PROLOG: latch: 4248; PROLOG-NEXT: %add = add nuw nsw i64 %i6, 1 4249; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4250; PROLOG: latchexit.unr-lcssa: 4251; PROLOG-NEXT: br label %latchexit 4252; PROLOG: latchexit: 4253; PROLOG-NEXT: unreachable 4254; PROLOG: loopexit2: 4255; PROLOG-NEXT: ret i32 %shft 4256; PROLOG: loopexit1.loopexit: 4257; 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 ] 4258; PROLOG-NEXT: br label %loopexit1 4259; PROLOG: loopexit1.loopexit1: 4260; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 4261; PROLOG-NEXT: br label %loopexit1 4262; PROLOG: loopexit1: 4263; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4264; PROLOG-NEXT: ret i32 %sext3 4265; PROLOG: latch.1: 4266; PROLOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4267; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4268; PROLOG: latch.2: 4269; PROLOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4270; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4271; PROLOG: latch.3: 4272; PROLOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4273; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4274; PROLOG: latch.4: 4275; PROLOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4276; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4277; PROLOG: latch.5: 4278; PROLOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4279; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4280; PROLOG: latch.6: 4281; PROLOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4282; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4283; PROLOG: latch.7: 4284; PROLOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4285; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 4286; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 4287; 4288; PROLOG-BLOCK-LABEL: @test7( 4289; PROLOG-BLOCK-NEXT: bb: 4290; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4291; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4292; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4293; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4294; PROLOG-BLOCK: preheader: 4295; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4296; PROLOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4297; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4298; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4299; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4300; PROLOG-BLOCK: header.prol.preheader: 4301; PROLOG-BLOCK-NEXT: br label %header.prol 4302; PROLOG-BLOCK: header.prol: 4303; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 4304; PROLOG-BLOCK: latch.prol: 4305; PROLOG-BLOCK-NEXT: %add.prol = add nuw nsw i64 1, 1 4306; PROLOG-BLOCK-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 4307; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4308; PROLOG-BLOCK: header.prol.loopexit: 4309; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %add.prol, %latch.prol ] 4310; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4311; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %preheader.new 4312; PROLOG-BLOCK: preheader.new: 4313; PROLOG-BLOCK-NEXT: br label %header 4314; PROLOG-BLOCK: header: 4315; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 4316; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4317; PROLOG-BLOCK: latch: 4318; PROLOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4319; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4320; PROLOG-BLOCK: latchexit.unr-lcssa: 4321; PROLOG-BLOCK-NEXT: br label %latchexit 4322; PROLOG-BLOCK: latchexit: 4323; PROLOG-BLOCK-NEXT: unreachable 4324; PROLOG-BLOCK: loopexit2: 4325; PROLOG-BLOCK-NEXT: ret i32 %shft 4326; PROLOG-BLOCK: loopexit1.loopexit: 4327; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4328; PROLOG-BLOCK-NEXT: br label %loopexit1 4329; PROLOG-BLOCK: loopexit1: 4330; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 4331; PROLOG-BLOCK-NEXT: ret i32 %sext3 4332; PROLOG-BLOCK: latch.1: 4333; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4334; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 4335; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10 4336; 4337bb: 4338 %i = icmp slt i32 undef, 2 4339 %sext = sext i32 undef to i64 4340 %shft = ashr exact i32 %arg, 16 4341 br i1 %i, label %loopexit2, label %preheader 4342 4343preheader: ; preds = %bb2 4344 br label %header 4345 4346header: ; preds = %latch, %preheader 4347 %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4348 br i1 false, label %loopexit1, label %latch 4349 4350latch: ; preds = %header 4351 %add = add nuw nsw i64 %i6, 1 4352 %i9 = icmp slt i64 %add, %sext 4353 br i1 %i9, label %header, label %latchexit 4354 4355latchexit: ; preds = %latch 4356 unreachable 4357 4358loopexit2: ; preds = %bb2 4359 ret i32 %shft 4360 4361loopexit1: ; preds = %header 4362 %sext3 = phi i32 [ %shft, %header ] 4363 ret i32 %sext3 4364} 4365 4366; Nested loop and inner loop is unrolled 4367; FIXME: we cannot unroll with epilog remainder currently, because 4368; the outer loop does not contain the epilog preheader and epilog exit (while 4369; infact it should). This causes us to choke up on LCSSA form being incorrect in 4370; outer loop. However, the exit block where LCSSA fails, is infact still within 4371; the outer loop. For now, we just bail out in presence of outer loop and epilog 4372; loop is generated. 4373; The outer loop header is the preheader for the inner loop and the inner header 4374; branches back to the outer loop. 4375define void @test8() { 4376; EPILOG-LABEL: @test8( 4377; EPILOG-NEXT: bb: 4378; EPILOG-NEXT: br label %outerloop 4379; EPILOG: outerloop.loopexit: 4380; EPILOG-NEXT: br label %outerloop 4381; EPILOG: outerloop: 4382; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4383; EPILOG-NEXT: br label %innerH 4384; EPILOG: innerH: 4385; EPILOG-NEXT: %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4386; EPILOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4387; EPILOG-NEXT: br i1 false, label %outerloop.loopexit, label %latch 4388; EPILOG: latch: 4389; EPILOG-NEXT: %i6 = icmp ult i64 %i4, 100 4390; EPILOG-NEXT: br i1 %i6, label %innerH, label %exit 4391; EPILOG: exit: 4392; EPILOG-NEXT: ret void 4393; 4394; EPILOG-BLOCK-LABEL: @test8( 4395; EPILOG-BLOCK-NEXT: bb: 4396; EPILOG-BLOCK-NEXT: br label %outerloop 4397; EPILOG-BLOCK: outerloop.loopexit: 4398; EPILOG-BLOCK-NEXT: br label %innerH.12 4399; EPILOG-BLOCK: outerloop: 4400; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4401; EPILOG-BLOCK-NEXT: br label %innerH 4402; EPILOG-BLOCK: innerH: 4403; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop ], [ %i4.1, %latch.1 ] 4404; EPILOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4405; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch 4406; EPILOG-BLOCK: latch: 4407; EPILOG-BLOCK-NEXT: %i6 = icmp ult i64 %i4, 100 4408; EPILOG-BLOCK-NEXT: br i1 %i6, label %innerH.1, label %exit.loopexit 4409; EPILOG-BLOCK: exit.loopexit: 4410; EPILOG-BLOCK-NEXT: br label %exit 4411; EPILOG-BLOCK: exit.loopexit5: 4412; EPILOG-BLOCK-NEXT: br label %exit 4413; EPILOG-BLOCK: exit: 4414; EPILOG-BLOCK-NEXT: ret void 4415; EPILOG-BLOCK: innerH.1: 4416; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4417; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.1 4418; EPILOG-BLOCK: latch.1: 4419; EPILOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4420; EPILOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.loopexit, !llvm.loop !11 4421; EPILOG-BLOCK: innerH.12: 4422; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.loopexit ], [ %i4.1.1, %latch.1.1 ] 4423; EPILOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4424; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.14 4425; EPILOG-BLOCK: latch.14: 4426; EPILOG-BLOCK-NEXT: %i6.13 = icmp ult i64 %i4.11, 100 4427; EPILOG-BLOCK-NEXT: br i1 %i6.13, label %innerH.1.1, label %exit.loopexit5 4428; EPILOG-BLOCK: innerH.1.1: 4429; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4430; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.1.1 4431; EPILOG-BLOCK: latch.1.1: 4432; EPILOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4433; EPILOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.12, label %exit.loopexit5, !llvm.loop !11 4434; EPILOG-BLOCK: outerloop.loopexit.1: 4435; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !12 4436; 4437; PROLOG-LABEL: @test8( 4438; PROLOG-NEXT: bb: 4439; PROLOG-NEXT: br label %outerloop 4440; PROLOG: outerloop.loopexit.loopexit: 4441; PROLOG-NEXT: br label %outerloop.loopexit 4442; PROLOG: outerloop.loopexit.loopexit1: 4443; PROLOG-NEXT: br label %outerloop.loopexit 4444; PROLOG: outerloop.loopexit: 4445; PROLOG-NEXT: br label %outerloop 4446; PROLOG: outerloop: 4447; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4448; PROLOG-NEXT: %0 = sub i64 100, %i 4449; PROLOG-NEXT: %1 = sub i64 99, %i 4450; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4451; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4452; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4453; PROLOG: innerH.prol.preheader: 4454; PROLOG-NEXT: br label %innerH.prol 4455; PROLOG: innerH.prol: 4456; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 4457; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 4458; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4459; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4460; PROLOG: latch.prol: 4461; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 4462; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1 4463; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0 4464; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !11 4465; PROLOG: innerH.prol.loopexit.unr-lcssa: 4466; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4467; PROLOG-NEXT: br label %innerH.prol.loopexit 4468; PROLOG: innerH.prol.loopexit: 4469; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4470; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4471; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4472; PROLOG: outerloop.new: 4473; PROLOG-NEXT: br label %innerH 4474; PROLOG: innerH: 4475; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4476; PROLOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4477; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4478; PROLOG: latch: 4479; PROLOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4480; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4481; PROLOG: exit.unr-lcssa: 4482; PROLOG-NEXT: br label %exit 4483; PROLOG: exit.loopexit: 4484; PROLOG-NEXT: br label %exit 4485; PROLOG: exit: 4486; PROLOG-NEXT: ret void 4487; PROLOG: latch.1: 4488; PROLOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4489; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4490; PROLOG: latch.2: 4491; PROLOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4492; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4493; PROLOG: latch.3: 4494; PROLOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4495; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4496; PROLOG: latch.4: 4497; PROLOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4498; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4499; PROLOG: latch.5: 4500; PROLOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4501; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4502; PROLOG: latch.6: 4503; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4504; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4505; PROLOG: latch.7: 4506; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 4507; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4508; 4509; PROLOG-BLOCK-LABEL: @test8( 4510; PROLOG-BLOCK-NEXT: bb: 4511; PROLOG-BLOCK-NEXT: br label %outerloop 4512; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4513; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4514; PROLOG-BLOCK: outerloop.loopexit: 4515; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.unr-lcssa.1 4516; PROLOG-BLOCK: outerloop: 4517; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4518; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4519; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4520; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4521; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4522; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit.unr-lcssa 4523; PROLOG-BLOCK: innerH.prol.preheader: 4524; PROLOG-BLOCK-NEXT: br label %innerH.prol 4525; PROLOG-BLOCK: innerH.prol: 4526; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4527; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4528; PROLOG-BLOCK: latch.prol: 4529; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.unr-lcssa 4530; PROLOG-BLOCK: innerH.prol.loopexit.unr-lcssa: 4531; PROLOG-BLOCK-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ], [ %i, %outerloop ] 4532; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4533; PROLOG-BLOCK: innerH.prol.loopexit: 4534; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4535; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4536; PROLOG-BLOCK: outerloop.new: 4537; PROLOG-BLOCK-NEXT: br label %innerH 4538; PROLOG-BLOCK: innerH: 4539; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr.ph, %outerloop.new ], [ %i4.1, %latch.1 ] 4540; PROLOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4541; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4542; PROLOG-BLOCK: latch: 4543; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4544; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4545; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4546; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4547; PROLOG-BLOCK: exit.unr-lcssa.loopexit3: 4548; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4549; PROLOG-BLOCK: exit.unr-lcssa: 4550; PROLOG-BLOCK-NEXT: br label %exit 4551; PROLOG-BLOCK: exit.loopexit: 4552; PROLOG-BLOCK-NEXT: br label %exit 4553; PROLOG-BLOCK: exit: 4554; PROLOG-BLOCK-NEXT: ret void 4555; PROLOG-BLOCK: latch.1: 4556; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4557; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11 4558; PROLOG-BLOCK: innerH.prol.preheader.1: 4559; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4560; PROLOG-BLOCK: innerH.prol.1: 4561; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4562; PROLOG-BLOCK: latch.prol.1: 4563; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.unr-lcssa.1 4564; PROLOG-BLOCK: innerH.prol.loopexit.unr-lcssa.1: 4565; PROLOG-BLOCK-NEXT: %i3.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %outerloop.loopexit ] 4566; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4567; PROLOG-BLOCK: innerH.prol.loopexit.1: 4568; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4569; PROLOG-BLOCK: outerloop.new.1: 4570; PROLOG-BLOCK-NEXT: br label %innerH.1 4571; PROLOG-BLOCK: innerH.1: 4572; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.ph.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4573; PROLOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4574; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4575; PROLOG-BLOCK: latch.12: 4576; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4577; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4578; PROLOG-BLOCK: latch.1.1: 4579; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4580; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11 4581; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4582; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4583; PROLOG-BLOCK: outerloop.loopexit.1: 4584; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !12 4585; 4586 4587bb: 4588 br label %outerloop 4589 4590outerloop: ; preds = %innerH, %bb 4591 %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4592 br label %innerH 4593 4594innerH: ; preds = %latch, %outerloop 4595 %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4596 %i4 = add nuw nsw i64 %i3, 1 4597 br i1 false, label %outerloop, label %latch 4598 4599latch: ; preds = %innerH 4600 %i6 = icmp ult i64 %i4, 100 4601 br i1 %i6, label %innerH, label %exit 4602 4603exit: ; preds = %latch 4604 ret void 4605} 4606 4607declare i8 addrspace(1)* @foo(i32) 4608; inner loop prolog unrolled 4609; a value from outer loop is used in exit block of inner loop. 4610; Don't create VMap entries for such values (%trip). 4611define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { 4612; EPILOG-LABEL: @test9( 4613; EPILOG-NEXT: bb: 4614; EPILOG-NEXT: br label %outerloopHdr 4615; EPILOG: outerloopHdr: 4616; EPILOG-NEXT: %trip = add i32 %n, -1 4617; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4618; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4619; EPILOG: preheader: 4620; EPILOG-NEXT: %i4 = zext i32 0 to i64 4621; EPILOG-NEXT: br label %header 4622; EPILOG: header: 4623; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 4624; EPILOG-NEXT: %i7 = trunc i64 %phi to i32 4625; EPILOG-NEXT: br i1 true, label %latch, label %innerexit 4626; EPILOG: innerexit: 4627; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip, %header ] 4628; EPILOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4629; EPILOG-NEXT: ret i8 addrspace(1)* %i9 4630; EPILOG: latch: 4631; EPILOG-NEXT: %i11 = add nsw i32 %i7, 1 4632; EPILOG-NEXT: %innercnd = icmp slt i32 %i11, %trip 4633; EPILOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4634; EPILOG-NEXT: br i1 %innercnd, label %header, label %outerLatch.loopexit 4635; EPILOG: outerLatch.loopexit: 4636; EPILOG-NEXT: br label %outerLatch 4637; EPILOG: outerLatch: 4638; EPILOG-NEXT: br label %outerloopHdr 4639; 4640; EPILOG-BLOCK-LABEL: @test9( 4641; EPILOG-BLOCK-NEXT: bb: 4642; EPILOG-BLOCK-NEXT: br label %outerloopHdr 4643; EPILOG-BLOCK: outerloopHdr: 4644; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 4645; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4646; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4647; EPILOG-BLOCK: preheader: 4648; EPILOG-BLOCK-NEXT: br label %header 4649; EPILOG-BLOCK: header: 4650; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader ], [ %iv.next.1, %latch.1 ] 4651; EPILOG-BLOCK-NEXT: %i7 = trunc i64 %phi to i32 4652; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4653; EPILOG-BLOCK: innerexit.loopexit: 4654; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip, %header.1 ], [ %trip, %header ] 4655; EPILOG-BLOCK-NEXT: br label %innerexit 4656; EPILOG-BLOCK: innerexit.loopexit7: 4657; EPILOG-BLOCK-NEXT: %trip.lcssa.ph8 = phi i32 [ %trip.1, %header.1.1 ], [ %trip.1, %header.12 ] 4658; EPILOG-BLOCK-NEXT: br label %innerexit 4659; EPILOG-BLOCK: innerexit: 4660; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph8, %innerexit.loopexit7 ] 4661; EPILOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4662; EPILOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 4663; EPILOG-BLOCK: latch: 4664; EPILOG-BLOCK-NEXT: %i11 = add nuw nsw i32 %i7, 1 4665; EPILOG-BLOCK-NEXT: %innercnd = icmp slt i32 %i11, %trip 4666; EPILOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4667; EPILOG-BLOCK-NEXT: br i1 %innercnd, label %header.1, label %outerLatch.loopexit 4668; EPILOG-BLOCK: outerLatch.loopexit: 4669; EPILOG-BLOCK-NEXT: br label %outerLatch 4670; EPILOG-BLOCK: outerLatch: 4671; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 4672; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 4673; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 4674; EPILOG-BLOCK: header.1: 4675; EPILOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 4676; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4677; EPILOG-BLOCK: latch.1: 4678; EPILOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 4679; EPILOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 4680; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4681; EPILOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit, !llvm.loop !13 4682; EPILOG-BLOCK: preheader.1: 4683; EPILOG-BLOCK-NEXT: br label %header.12 4684; EPILOG-BLOCK: header.12: 4685; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.1 ], [ %iv.next.1.1, %latch.1.1 ] 4686; EPILOG-BLOCK-NEXT: %i7.11 = trunc i64 %phi.1 to i32 4687; EPILOG-BLOCK-NEXT: br i1 true, label %latch.16, label %innerexit.loopexit7 4688; EPILOG-BLOCK: latch.16: 4689; EPILOG-BLOCK-NEXT: %i11.13 = add nuw nsw i32 %i7.11, 1 4690; EPILOG-BLOCK-NEXT: %innercnd.14 = icmp slt i32 %i11.13, %trip.1 4691; EPILOG-BLOCK-NEXT: %iv.next.15 = add nuw nsw i64 %phi.1, 1 4692; EPILOG-BLOCK-NEXT: br i1 %innercnd.14, label %header.1.1, label %outerLatch.loopexit.1 4693; EPILOG-BLOCK: header.1.1: 4694; EPILOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.15 to i32 4695; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit7 4696; EPILOG-BLOCK: latch.1.1: 4697; EPILOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 4698; EPILOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 4699; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.15, 1 4700; EPILOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.12, label %outerLatch.loopexit.1, !llvm.loop !13 4701; EPILOG-BLOCK: outerLatch.loopexit.1: 4702; EPILOG-BLOCK-NEXT: br label %outerLatch.1 4703; EPILOG-BLOCK: outerLatch.1: 4704; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !14 4705; 4706; PROLOG-LABEL: @test9( 4707; PROLOG-NEXT: bb: 4708; PROLOG-NEXT: %0 = add i32 %n, -1 4709; PROLOG-NEXT: %1 = add i32 %n, -2 4710; PROLOG-NEXT: br label %outerloopHdr 4711; PROLOG: outerloopHdr: 4712; PROLOG-NEXT: %trip = add i32 %n, -1 4713; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 4714; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4715; PROLOG: preheader: 4716; PROLOG-NEXT: %i4 = zext i32 0 to i64 4717; PROLOG-NEXT: %xtraiter = and i32 %0, 7 4718; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4719; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4720; PROLOG: header.prol.preheader: 4721; PROLOG-NEXT: br label %header.prol 4722; PROLOG: header.prol: 4723; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 4724; PROLOG-NEXT: %prol.iter = phi i32 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ] 4725; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 4726; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 4727; PROLOG: latch.prol: 4728; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 4729; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 4730; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 4731; PROLOG-NEXT: %prol.iter.sub = sub i32 %prol.iter, 1 4732; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0 4733; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !12 4734; PROLOG: header.prol.loopexit.unr-lcssa: 4735; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 4736; PROLOG-NEXT: br label %header.prol.loopexit 4737; PROLOG: header.prol.loopexit: 4738; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 4739; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 4740; PROLOG-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 4741; PROLOG: preheader.new: 4742; PROLOG-NEXT: br label %header 4743; PROLOG: header: 4744; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 4745; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4746; PROLOG: innerexit.loopexit: 4747; 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 ] 4748; PROLOG-NEXT: br label %innerexit 4749; PROLOG: innerexit.loopexit1: 4750; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 4751; PROLOG-NEXT: br label %innerexit 4752; PROLOG: innerexit: 4753; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4754; PROLOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4755; PROLOG-NEXT: ret i8 addrspace(1)* %i9 4756; PROLOG: latch: 4757; PROLOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4758; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4759; PROLOG: outerLatch.loopexit.unr-lcssa: 4760; PROLOG-NEXT: br label %outerLatch.loopexit 4761; PROLOG: outerLatch.loopexit: 4762; PROLOG-NEXT: br label %outerLatch 4763; PROLOG: outerLatch: 4764; PROLOG-NEXT: br label %outerloopHdr 4765; PROLOG: latch.1: 4766; PROLOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4767; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4768; PROLOG: latch.2: 4769; PROLOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 4770; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4771; PROLOG: latch.3: 4772; PROLOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 4773; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4774; PROLOG: latch.4: 4775; PROLOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 4776; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4777; PROLOG: latch.5: 4778; PROLOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 4779; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4780; PROLOG: latch.6: 4781; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 4782; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 4783; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 4784; PROLOG: latch.7: 4785; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 4786; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 4787; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 4788; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 4789; 4790; PROLOG-BLOCK-LABEL: @test9( 4791; PROLOG-BLOCK-NEXT: bb: 4792; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 4793; PROLOG-BLOCK-NEXT: %1 = add i32 %n, -2 4794; PROLOG-BLOCK-NEXT: br label %outerloopHdr 4795; PROLOG-BLOCK: outerloopHdr: 4796; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 4797; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4798; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4799; PROLOG-BLOCK: preheader: 4800; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 4801; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4802; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit.unr-lcssa 4803; PROLOG-BLOCK: header.prol.preheader: 4804; PROLOG-BLOCK-NEXT: br label %header.prol 4805; PROLOG-BLOCK: header.prol: 4806; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 4807; PROLOG-BLOCK: latch.prol: 4808; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.unr-lcssa 4809; PROLOG-BLOCK: header.prol.loopexit.unr-lcssa: 4810; PROLOG-BLOCK-NEXT: %phi.unr.ph = phi i64 [ 1, %latch.prol ], [ 0, %preheader ] 4811; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4812; PROLOG-BLOCK: header.prol.loopexit: 4813; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 4814; PROLOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 4815; PROLOG-BLOCK: preheader.new: 4816; PROLOG-BLOCK-NEXT: br label %header 4817; PROLOG-BLOCK: header: 4818; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr.ph, %preheader.new ], [ %iv.next.1, %latch.1 ] 4819; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 4820; PROLOG-BLOCK: innerexit.loopexit.loopexit: 4821; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 4822; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 4823; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 4824; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 4825; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 4826; PROLOG-BLOCK: innerexit.loopexit: 4827; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 4828; PROLOG-BLOCK-NEXT: br label %innerexit 4829; PROLOG-BLOCK: innerexit.loopexit1: 4830; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 4831; PROLOG-BLOCK-NEXT: br label %innerexit 4832; PROLOG-BLOCK: innerexit: 4833; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4834; PROLOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4835; PROLOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 4836; PROLOG-BLOCK: latch: 4837; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4838; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 4839; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 4840; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 4841; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 4842; PROLOG-BLOCK: outerLatch.loopexit: 4843; PROLOG-BLOCK-NEXT: br label %outerLatch 4844; PROLOG-BLOCK: outerLatch: 4845; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 4846; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 4847; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 4848; PROLOG-BLOCK: latch.1: 4849; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 4850; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 4851; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4852; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13 4853; PROLOG-BLOCK: preheader.1: 4854; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 4855; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 4856; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.unr-lcssa.1 4857; PROLOG-BLOCK: header.prol.preheader.1: 4858; PROLOG-BLOCK-NEXT: br label %header.prol.1 4859; PROLOG-BLOCK: header.prol.1: 4860; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 4861; PROLOG-BLOCK: latch.prol.1: 4862; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.unr-lcssa.1 4863; PROLOG-BLOCK: header.prol.loopexit.unr-lcssa.1: 4864; PROLOG-BLOCK-NEXT: %phi.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %preheader.1 ] 4865; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 4866; PROLOG-BLOCK: header.prol.loopexit.1: 4867; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 4868; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1 4869; PROLOG-BLOCK: preheader.new.1: 4870; PROLOG-BLOCK-NEXT: br label %header.1 4871; PROLOG-BLOCK: header.1: 4872; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.ph.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 4873; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 4874; PROLOG-BLOCK: latch.14: 4875; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 4876; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 4877; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 4878; PROLOG-BLOCK: latch.1.1: 4879; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 4880; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 4881; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 4882; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13 4883; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 4884; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 4885; PROLOG-BLOCK: outerLatch.loopexit.1: 4886; PROLOG-BLOCK-NEXT: br label %outerLatch.1 4887; PROLOG-BLOCK: outerLatch.1: 4888; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !14 4889; 4890bb: 4891 br label %outerloopHdr 4892 4893outerloopHdr: ; preds = %outerLatch, %bb 4894 %trip = add i32 %n, -1 4895 %outercnd = icmp slt i32 0, %trip 4896 br i1 %outercnd, label %preheader, label %outerLatch 4897 4898preheader: ; preds = %outerloopHdr 4899 %i4 = zext i32 0 to i64 4900 br label %header 4901 4902header: ; preds = %latch, %preheader 4903 %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 4904 %i7 = trunc i64 %phi to i32 4905 br i1 true, label %latch, label %innerexit 4906 4907innerexit: ; preds = %header 4908 %i9 = call i8 addrspace(1)* @foo(i32 %trip) 4909 ret i8 addrspace(1)* %i9 4910 4911latch: ; preds = %header 4912 %i11 = add nsw i32 %i7, 1 4913 %innercnd = icmp slt i32 %i11, %trip 4914 %iv.next = add nuw nsw i64 %phi, 1 4915 br i1 %innercnd, label %header, label %outerLatch 4916 4917outerLatch: ; preds = %latch, %outerloopHdr 4918 br label %outerloopHdr 4919} 4920