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