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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 38; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 39; EPILOG: loop_exiting_bb1.1: 40; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 41; EPILOG: loop_exiting_bb2.1: 42; EPILOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 43; EPILOG: loop_latch.1: 44; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 45; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 46; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 47; EPILOG: loop_exiting_bb1.2: 48; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 49; EPILOG: loop_exiting_bb2.2: 50; EPILOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 51; EPILOG: loop_latch.2: 52; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 53; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 54; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 55; EPILOG: loop_exiting_bb1.3: 56; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 57; EPILOG: loop_exiting_bb2.3: 58; EPILOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 59; EPILOG: loop_latch.3: 60; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 61; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 62; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 63; EPILOG: loop_exiting_bb1.4: 64; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 65; EPILOG: loop_exiting_bb2.4: 66; EPILOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 67; EPILOG: loop_latch.4: 68; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 69; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 70; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 71; EPILOG: loop_exiting_bb1.5: 72; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 73; EPILOG: loop_exiting_bb2.5: 74; EPILOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 75; EPILOG: loop_latch.5: 76; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 77; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 78; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 79; EPILOG: loop_exiting_bb1.6: 80; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 81; EPILOG: loop_exiting_bb2.6: 82; EPILOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 83; EPILOG: loop_latch.6: 84; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 85; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 86; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 87; EPILOG: loop_exiting_bb1.7: 88; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 89; EPILOG: loop_exiting_bb2.7: 90; EPILOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 91; EPILOG: loop_latch.7: 92; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 93; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 94; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 95; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 96; EPILOG: exit1.loopexit: 97; EPILOG-NEXT: br label %exit1 98; EPILOG: exit1.loopexit1: 99; EPILOG-NEXT: br label %exit1 100; EPILOG: exit1: 101; EPILOG-NEXT: ret void 102; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 103; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 104; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 105; EPILOG: exit2.loopexit.unr-lcssa: 106; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 107; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 108; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 109; EPILOG: loop_header.epil.preheader: 110; EPILOG-NEXT: br label %loop_header.epil 111; EPILOG: loop_header.epil: 112; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 113; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 114; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 115; EPILOG: loop_exiting_bb1.epil: 116; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1 117; EPILOG: loop_exiting_bb2.epil: 118; EPILOG-NEXT: br i1 false, label %loop_latch.epil, label %exit3.loopexit2 119; EPILOG: loop_latch.epil: 120; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 121; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 122; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 123; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 124; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0 125; EPILOG: exit2.loopexit.epilog-lcssa: 126; EPILOG-NEXT: br label %exit2.loopexit 127; EPILOG: exit2.loopexit: 128; EPILOG-NEXT: ret void 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 154; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 155; EPILOG-BLOCK: loop_exiting_bb1.1: 156; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 157; EPILOG-BLOCK: loop_exiting_bb2.1: 158; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 159; EPILOG-BLOCK: loop_latch.1: 160; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 161; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 162; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 163; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0 164; EPILOG-BLOCK: exit1.loopexit: 165; EPILOG-BLOCK-NEXT: br label %exit1 166; EPILOG-BLOCK: exit1: 167; EPILOG-BLOCK-NEXT: ret void 168; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 169; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 170; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 171; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 172; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 173; EPILOG-BLOCK: loop_header.epil.preheader: 174; EPILOG-BLOCK-NEXT: br label %loop_header.epil 175; EPILOG-BLOCK: loop_header.epil: 176; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 177; EPILOG-BLOCK: loop_exiting_bb1.epil: 178; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1 179; EPILOG-BLOCK: loop_exiting_bb2.epil: 180; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.epil, label %exit3 181; EPILOG-BLOCK: loop_latch.epil: 182; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 183; EPILOG-BLOCK: exit2.loopexit: 184; EPILOG-BLOCK-NEXT: ret void 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 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 206; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: loop_exiting_bb1.1: 234; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 235; PROLOG: loop_exiting_bb2.1: 236; PROLOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 237; PROLOG: loop_latch.1: 238; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 239; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 240; PROLOG: loop_exiting_bb1.2: 241; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 242; PROLOG: loop_exiting_bb2.2: 243; PROLOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 244; PROLOG: loop_latch.2: 245; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 246; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 247; PROLOG: loop_exiting_bb1.3: 248; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 249; PROLOG: loop_exiting_bb2.3: 250; PROLOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 251; PROLOG: loop_latch.3: 252; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 253; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 254; PROLOG: loop_exiting_bb1.4: 255; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 256; PROLOG: loop_exiting_bb2.4: 257; PROLOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 258; PROLOG: loop_latch.4: 259; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 260; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 261; PROLOG: loop_exiting_bb1.5: 262; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 263; PROLOG: loop_exiting_bb2.5: 264; PROLOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 265; PROLOG: loop_latch.5: 266; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 267; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 268; PROLOG: loop_exiting_bb1.6: 269; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 270; PROLOG: loop_exiting_bb2.6: 271; PROLOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 272; PROLOG: loop_latch.6: 273; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 274; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 275; PROLOG: loop_exiting_bb1.7: 276; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 277; PROLOG: loop_exiting_bb2.7: 278; PROLOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 279; PROLOG: loop_latch.7: 280; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 281; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 282; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 283; PROLOG: exit1.loopexit: 284; PROLOG-NEXT: br label %exit1 285; PROLOG: exit1.loopexit1: 286; PROLOG-NEXT: br label %exit1 287; PROLOG: exit1: 288; PROLOG-NEXT: ret void 289; PROLOG: exit2.loopexit.unr-lcssa: 290; PROLOG-NEXT: br label %exit2.loopexit 291; PROLOG: exit2.loopexit: 292; PROLOG-NEXT: ret void 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: loop_exiting_bb1.1: 331; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 332; PROLOG-BLOCK: loop_exiting_bb2.1: 333; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 334; PROLOG-BLOCK: loop_latch.1: 335; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 336; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 337; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0 338; PROLOG-BLOCK: exit1.loopexit: 339; PROLOG-BLOCK-NEXT: br label %exit1 340; PROLOG-BLOCK: exit1: 341; PROLOG-BLOCK-NEXT: ret void 342; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 343; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 344; PROLOG-BLOCK: exit2.loopexit: 345; PROLOG-BLOCK-NEXT: ret void 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 406; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 407; EPILOG: for.exiting_block.1: 408; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 409; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 410; EPILOG: for.body.1: 411; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 412; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 413; EPILOG-NEXT: %add.1 = add nsw i32 %3, %add 414; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 415; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 416; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 417; EPILOG: for.exiting_block.2: 418; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 419; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 420; EPILOG: for.body.2: 421; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 422; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.2, align 4 423; EPILOG-NEXT: %add.2 = add nsw i32 %4, %add.1 424; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 425; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 426; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 427; EPILOG: for.exiting_block.3: 428; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 429; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 430; EPILOG: for.body.3: 431; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 432; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.3, align 4 433; EPILOG-NEXT: %add.3 = add nsw i32 %5, %add.2 434; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 435; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 436; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 437; EPILOG: for.exiting_block.4: 438; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 439; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 440; EPILOG: for.body.4: 441; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 442; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.4, align 4 443; EPILOG-NEXT: %add.4 = add nsw i32 %6, %add.3 444; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 445; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 446; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 447; EPILOG: for.exiting_block.5: 448; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 449; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 450; EPILOG: for.body.5: 451; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 452; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.5, align 4 453; EPILOG-NEXT: %add.5 = add nsw i32 %7, %add.4 454; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 455; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 456; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 457; EPILOG: for.exiting_block.6: 458; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 459; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 460; EPILOG: for.body.6: 461; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 462; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.6, align 4 463; EPILOG-NEXT: %add.6 = add nsw i32 %8, %add.5 464; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 465; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 466; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 467; EPILOG: for.exiting_block.7: 468; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 469; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 470; EPILOG: for.body.7: 471; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 472; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.7, align 4 473; EPILOG-NEXT: %add.7 = add nsw i32 %9, %add.6 474; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 475; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 476; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 477; EPILOG-NEXT: br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header 478; EPILOG: for.end.unr-lcssa.loopexit: 479; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ] 480; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ] 481; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ] 482; EPILOG-NEXT: br label %for.end.unr-lcssa 483; EPILOG: for.end.unr-lcssa: 484; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 485; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 486; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 487; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 488; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 489; EPILOG: header.epil.preheader: 490; EPILOG-NEXT: br label %header.epil 491; EPILOG: header.epil: 492; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 493; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ] 494; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ] 495; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 496; EPILOG: for.exiting_block.epil: 497; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 498; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil 499; EPILOG: for.body.epil: 500; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 501; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.epil, align 4 502; EPILOG-NEXT: %add.epil = add nsw i32 %10, %sum.02.epil 503; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 504; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 505; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 506; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 507; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2 508; EPILOG: for.end.epilog-lcssa: 509; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ] 510; EPILOG-NEXT: br label %for.end 511; EPILOG: for.end: 512; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ] 513; EPILOG-NEXT: ret i32 %sum.0.lcssa 514; EPILOG: for.exit2.loopexit: 515; 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 ] 516; EPILOG-NEXT: br label %for.exit2 517; EPILOG: for.exit2.loopexit2: 518; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 519; EPILOG-NEXT: br label %for.exit2 520; EPILOG: for.exit2: 521; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 522; EPILOG-NEXT: ret i32 %retval 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 547; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 548; EPILOG-BLOCK: for.exiting_block.1: 549; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 550; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 551; EPILOG-BLOCK: for.body.1: 552; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 553; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 554; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %3, %add 555; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 556; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 557; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 558; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2 559; EPILOG-BLOCK: for.end.unr-lcssa.loopexit: 560; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ] 561; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ] 562; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ] 563; EPILOG-BLOCK-NEXT: br label %for.end.unr-lcssa 564; EPILOG-BLOCK: for.end.unr-lcssa: 565; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 566; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 567; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 568; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 569; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 570; EPILOG-BLOCK: header.epil.preheader: 571; EPILOG-BLOCK-NEXT: br label %header.epil 572; EPILOG-BLOCK: header.epil: 573; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 574; EPILOG-BLOCK: for.exiting_block.epil: 575; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 576; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %for.body.epil 577; EPILOG-BLOCK: for.body.epil: 578; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 579; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.epil, align 4 580; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %4, %sum.02.unr 581; EPILOG-BLOCK-NEXT: br label %for.end 582; EPILOG-BLOCK: for.end: 583; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ] 584; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 585; EPILOG-BLOCK: for.exit2.loopexit: 586; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 587; EPILOG-BLOCK-NEXT: br label %for.exit2 588; EPILOG-BLOCK: for.exit2: 589; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 590; EPILOG-BLOCK-NEXT: ret i32 %retval 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 [ 0, %header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 615; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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.exiting_block.1: 644; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 645; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 646; PROLOG: for.body.1: 647; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 648; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 649; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 650; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 651; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 652; PROLOG: for.exiting_block.2: 653; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 654; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 655; PROLOG: for.body.2: 656; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 657; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 658; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 659; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 660; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 661; PROLOG: for.exiting_block.3: 662; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 663; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 664; PROLOG: for.body.3: 665; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 666; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 667; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 668; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 669; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 670; PROLOG: for.exiting_block.4: 671; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 672; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 673; PROLOG: for.body.4: 674; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 675; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 676; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 677; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 678; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 679; PROLOG: for.exiting_block.5: 680; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 681; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 682; PROLOG: for.body.5: 683; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 684; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 685; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 686; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 687; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 688; PROLOG: for.exiting_block.6: 689; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 690; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 691; PROLOG: for.body.6: 692; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 693; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 694; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 695; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 696; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 697; PROLOG: for.exiting_block.7: 698; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 699; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 700; PROLOG: for.body.7: 701; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 702; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 703; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 704; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 705; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 706; PROLOG-NEXT: br i1 %exitcond.7, label %for.end.unr-lcssa, label %header 707; PROLOG: for.end.unr-lcssa: 708; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ] 709; PROLOG-NEXT: br label %for.end 710; PROLOG: for.end: 711; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 712; PROLOG-NEXT: ret i32 %sum.0.lcssa 713; PROLOG: for.exit2.loopexit: 714; 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 ] 715; PROLOG-NEXT: br label %for.exit2 716; PROLOG: for.exit2.loopexit1: 717; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 718; PROLOG-NEXT: br label %for.exit2 719; PROLOG: for.exit2: 720; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 721; PROLOG-NEXT: ret i32 %retval 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.exiting_block.1: 761; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 762; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 763; PROLOG-BLOCK: for.body.1: 764; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 765; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 766; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 767; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 768; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 769; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2 770; PROLOG-BLOCK: for.end.unr-lcssa: 771; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ] 772; PROLOG-BLOCK-NEXT: br label %for.end 773; PROLOG-BLOCK: for.end: 774; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 775; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 776; PROLOG-BLOCK: for.exit2.loopexit: 777; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 778; PROLOG-BLOCK-NEXT: br label %for.exit2 779; PROLOG-BLOCK: for.exit2: 780; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 781; PROLOG-BLOCK-NEXT: ret i32 %retval 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 846; EPILOG-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 847; EPILOG: loop_exiting_bb1.1: 848; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 849; EPILOG-NEXT: i64 24, label %exit1.loopexit 850; EPILOG-NEXT: i64 42, label %exit3.loopexit 851; EPILOG-NEXT: ] 852; EPILOG: loop_latch.1: 853; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 854; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 855; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 856; EPILOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 857; EPILOG: loop_exiting_bb1.2: 858; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 859; EPILOG-NEXT: i64 24, label %exit1.loopexit 860; EPILOG-NEXT: i64 42, label %exit3.loopexit 861; EPILOG-NEXT: ] 862; EPILOG: loop_latch.2: 863; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 864; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 865; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 866; EPILOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 867; EPILOG: loop_exiting_bb1.3: 868; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 869; EPILOG-NEXT: i64 24, label %exit1.loopexit 870; EPILOG-NEXT: i64 42, label %exit3.loopexit 871; EPILOG-NEXT: ] 872; EPILOG: loop_latch.3: 873; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 874; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 875; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 876; EPILOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 877; EPILOG: loop_exiting_bb1.4: 878; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 879; EPILOG-NEXT: i64 24, label %exit1.loopexit 880; EPILOG-NEXT: i64 42, label %exit3.loopexit 881; EPILOG-NEXT: ] 882; EPILOG: loop_latch.4: 883; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 884; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 885; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 886; EPILOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 887; EPILOG: loop_exiting_bb1.5: 888; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 889; EPILOG-NEXT: i64 24, label %exit1.loopexit 890; EPILOG-NEXT: i64 42, label %exit3.loopexit 891; EPILOG-NEXT: ] 892; EPILOG: loop_latch.5: 893; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 894; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 895; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 896; EPILOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 897; EPILOG: loop_exiting_bb1.6: 898; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 899; EPILOG-NEXT: i64 24, label %exit1.loopexit 900; EPILOG-NEXT: i64 42, label %exit3.loopexit 901; EPILOG-NEXT: ] 902; EPILOG: loop_latch.6: 903; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 904; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 905; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 906; EPILOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 907; EPILOG: loop_exiting_bb1.7: 908; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 909; EPILOG-NEXT: i64 24, label %exit1.loopexit 910; EPILOG-NEXT: i64 42, label %exit3.loopexit 911; EPILOG-NEXT: ] 912; EPILOG: loop_latch.7: 913; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 914; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 915; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 916; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 917; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 918; EPILOG: exit1.loopexit: 919; EPILOG-NEXT: br label %exit1 920; EPILOG: exit1.loopexit1: 921; EPILOG-NEXT: br label %exit1 922; EPILOG: exit1: 923; EPILOG-NEXT: ret void 924; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 925; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 926; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 927; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 928; EPILOG: exit2.loopexit.unr-lcssa: 929; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 930; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 931; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 932; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 933; EPILOG: loop_header.epil.preheader: 934; EPILOG-NEXT: br label %loop_header.epil 935; EPILOG: loop_header.epil: 936; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 937; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 938; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 939; EPILOG-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 940; EPILOG: loop_exiting_bb1.epil: 941; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 942; EPILOG-NEXT: i64 24, label %exit1.loopexit1 943; EPILOG-NEXT: i64 42, label %exit3.loopexit2 944; EPILOG-NEXT: ] 945; EPILOG: loop_latch.epil: 946; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 947; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 948; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 949; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 950; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 951; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3 952; EPILOG: exit2.loopexit.epilog-lcssa: 953; EPILOG-NEXT: br label %exit2.loopexit 954; EPILOG: exit2.loopexit: 955; EPILOG-NEXT: ret void 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 984; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 985; EPILOG-BLOCK: loop_exiting_bb1.1: 986; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 987; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 988; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 989; EPILOG-BLOCK-NEXT: ] 990; EPILOG-BLOCK: loop_latch.1: 991; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 992; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 993; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 994; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 995; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3 996; EPILOG-BLOCK: exit1.loopexit: 997; EPILOG-BLOCK-NEXT: br label %exit1 998; EPILOG-BLOCK: exit1: 999; EPILOG-BLOCK-NEXT: ret void 1000; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 1001; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 1002; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 1003; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 1004; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1005; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1006; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 1007; EPILOG-BLOCK: loop_header.epil.preheader: 1008; EPILOG-BLOCK-NEXT: br label %loop_header.epil 1009; EPILOG-BLOCK: loop_header.epil: 1010; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 1011; EPILOG-BLOCK: loop_exiting_bb1.epil: 1012; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 1013; EPILOG-BLOCK-NEXT: i64 24, label %exit1 1014; EPILOG-BLOCK-NEXT: i64 42, label %exit3 1015; EPILOG-BLOCK-NEXT: ] 1016; EPILOG-BLOCK: loop_latch.epil: 1017; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 1018; EPILOG-BLOCK: exit2.loopexit: 1019; EPILOG-BLOCK-NEXT: ret void 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 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 1044; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: loop_exiting_bb1.1: 1077; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1078; PROLOG-NEXT: i64 24, label %exit1.loopexit 1079; PROLOG-NEXT: i64 42, label %exit3.loopexit 1080; PROLOG-NEXT: ] 1081; PROLOG: loop_latch.1: 1082; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1083; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 1084; PROLOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 1085; PROLOG: loop_exiting_bb1.2: 1086; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1087; PROLOG-NEXT: i64 24, label %exit1.loopexit 1088; PROLOG-NEXT: i64 42, label %exit3.loopexit 1089; PROLOG-NEXT: ] 1090; PROLOG: loop_latch.2: 1091; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 1092; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1093; PROLOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 1094; PROLOG: loop_exiting_bb1.3: 1095; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1096; PROLOG-NEXT: i64 24, label %exit1.loopexit 1097; PROLOG-NEXT: i64 42, label %exit3.loopexit 1098; PROLOG-NEXT: ] 1099; PROLOG: loop_latch.3: 1100; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 1101; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1102; PROLOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 1103; PROLOG: loop_exiting_bb1.4: 1104; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1105; PROLOG-NEXT: i64 24, label %exit1.loopexit 1106; PROLOG-NEXT: i64 42, label %exit3.loopexit 1107; PROLOG-NEXT: ] 1108; PROLOG: loop_latch.4: 1109; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 1110; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1111; PROLOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 1112; PROLOG: loop_exiting_bb1.5: 1113; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1114; PROLOG-NEXT: i64 24, label %exit1.loopexit 1115; PROLOG-NEXT: i64 42, label %exit3.loopexit 1116; PROLOG-NEXT: ] 1117; PROLOG: loop_latch.5: 1118; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 1119; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1120; PROLOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 1121; PROLOG: loop_exiting_bb1.6: 1122; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1123; PROLOG-NEXT: i64 24, label %exit1.loopexit 1124; PROLOG-NEXT: i64 42, label %exit3.loopexit 1125; PROLOG-NEXT: ] 1126; PROLOG: loop_latch.6: 1127; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 1128; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1129; PROLOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 1130; PROLOG: loop_exiting_bb1.7: 1131; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1132; PROLOG-NEXT: i64 24, label %exit1.loopexit 1133; PROLOG-NEXT: i64 42, label %exit3.loopexit 1134; PROLOG-NEXT: ] 1135; PROLOG: loop_latch.7: 1136; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 1137; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1138; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 1139; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 1140; PROLOG: exit1.loopexit: 1141; PROLOG-NEXT: br label %exit1 1142; PROLOG: exit1.loopexit1: 1143; PROLOG-NEXT: br label %exit1 1144; PROLOG: exit1: 1145; PROLOG-NEXT: ret void 1146; PROLOG: exit2.loopexit.unr-lcssa: 1147; PROLOG-NEXT: br label %exit2.loopexit 1148; PROLOG: exit2.loopexit: 1149; PROLOG-NEXT: ret void 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: loop_exiting_bb1.1: 1193; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1194; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1195; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1196; PROLOG-BLOCK-NEXT: ] 1197; PROLOG-BLOCK: loop_latch.1: 1198; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1199; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 1200; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 1201; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3 1202; PROLOG-BLOCK: exit1.loopexit: 1203; PROLOG-BLOCK-NEXT: br label %exit1 1204; PROLOG-BLOCK: exit1: 1205; PROLOG-BLOCK-NEXT: ret void 1206; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 1207; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 1208; PROLOG-BLOCK: exit2.loopexit: 1209; PROLOG-BLOCK-NEXT: ret void 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 1268; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1269; EPILOG: for.exiting_block.1: 1270; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1271; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1272; EPILOG: latch.1: 1273; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1274; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 1275; EPILOG-NEXT: %add.1 = add nsw i32 %3, %add 1276; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 1277; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 1278; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2 1279; EPILOG: for.exiting_block.2: 1280; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1281; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1282; EPILOG: latch.2: 1283; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1284; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.2, align 4 1285; EPILOG-NEXT: %add.2 = add nsw i32 %4, %add.1 1286; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 1287; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 1288; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3 1289; EPILOG: for.exiting_block.3: 1290; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1291; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1292; EPILOG: latch.3: 1293; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1294; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.3, align 4 1295; EPILOG-NEXT: %add.3 = add nsw i32 %5, %add.2 1296; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 1297; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 1298; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4 1299; EPILOG: for.exiting_block.4: 1300; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1301; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1302; EPILOG: latch.4: 1303; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1304; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.4, align 4 1305; EPILOG-NEXT: %add.4 = add nsw i32 %6, %add.3 1306; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 1307; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 1308; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5 1309; EPILOG: for.exiting_block.5: 1310; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1311; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1312; EPILOG: latch.5: 1313; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1314; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.5, align 4 1315; EPILOG-NEXT: %add.5 = add nsw i32 %7, %add.4 1316; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 1317; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 1318; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6 1319; EPILOG: for.exiting_block.6: 1320; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1321; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1322; EPILOG: latch.6: 1323; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1324; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.6, align 4 1325; EPILOG-NEXT: %add.6 = add nsw i32 %8, %add.5 1326; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 1327; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 1328; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7 1329; EPILOG: for.exiting_block.7: 1330; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1331; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1332; EPILOG: latch.7: 1333; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1334; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.7, align 4 1335; EPILOG-NEXT: %add.7 = add nsw i32 %9, %add.6 1336; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 1337; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 1338; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1339; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 1340; EPILOG: latchExit.unr-lcssa.loopexit: 1341; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 1342; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 1343; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 1344; EPILOG-NEXT: br label %latchExit.unr-lcssa 1345; EPILOG: latchExit.unr-lcssa: 1346; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1347; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1348; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1349; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1350; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1351; EPILOG: header.epil.preheader: 1352; EPILOG-NEXT: br label %header.epil 1353; EPILOG: header.epil: 1354; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 1355; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 1356; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 1357; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil 1358; EPILOG: for.exiting_block.epil: 1359; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 1360; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil 1361; EPILOG: latch.epil: 1362; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1363; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.epil, align 4 1364; EPILOG-NEXT: %add.epil = add nsw i32 %10, %sum.02.epil 1365; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1366; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1367; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 1368; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 1369; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4 1370; EPILOG: latchExit.epilog-lcssa.loopexit: 1371; 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 ] 1372; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1373; EPILOG: latchExit.epilog-lcssa.loopexit2: 1374; EPILOG-NEXT: %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ] 1375; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1376; EPILOG: latchExit.epilog-lcssa: 1377; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 1378; EPILOG-NEXT: br label %latchExit 1379; EPILOG: latchExit: 1380; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1381; EPILOG-NEXT: ret i32 %result 1382; EPILOG: for.exit2.loopexit: 1383; EPILOG-NEXT: br label %for.exit2 1384; EPILOG: for.exit2.loopexit4: 1385; EPILOG-NEXT: br label %for.exit2 1386; EPILOG: for.exit2: 1387; EPILOG-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 1412; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1413; EPILOG-BLOCK: for.exiting_block.1: 1414; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1415; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1416; EPILOG-BLOCK: latch.1: 1417; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1418; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 1419; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %3, %add 1420; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1421; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 1422; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1423; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 1424; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 1425; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 1426; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 1427; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 1428; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1429; EPILOG-BLOCK: latchExit.unr-lcssa: 1430; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1431; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1432; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1433; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1434; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1435; EPILOG-BLOCK: header.epil.preheader: 1436; EPILOG-BLOCK-NEXT: br label %header.epil 1437; EPILOG-BLOCK: header.epil: 1438; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil 1439; EPILOG-BLOCK: for.exiting_block.epil: 1440; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 1441; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 1442; EPILOG-BLOCK: latch.epil: 1443; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 1444; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.epil, align 4 1445; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %4, %sum.02.unr 1446; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1447; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 1448; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ] 1449; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1450; EPILOG-BLOCK: latchExit.epilog-lcssa: 1451; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 1452; EPILOG-BLOCK-NEXT: br label %latchExit 1453; EPILOG-BLOCK: latchExit: 1454; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1455; EPILOG-BLOCK-NEXT: ret i32 %result 1456; EPILOG-BLOCK: for.exit2.loopexit: 1457; EPILOG-BLOCK-NEXT: br label %for.exit2 1458; EPILOG-BLOCK: for.exit2: 1459; EPILOG-BLOCK-NEXT: ret i32 42 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 [ 0, %header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 1484; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: for.exiting_block.1: 1513; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1514; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1515; PROLOG: latch.1: 1516; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1517; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1518; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 1519; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1520; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2 1521; PROLOG: for.exiting_block.2: 1522; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1523; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1524; PROLOG: latch.2: 1525; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1526; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1527; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1528; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 1529; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3 1530; PROLOG: for.exiting_block.3: 1531; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1532; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1533; PROLOG: latch.3: 1534; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1535; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1536; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1537; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 1538; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4 1539; PROLOG: for.exiting_block.4: 1540; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1541; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1542; PROLOG: latch.4: 1543; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1544; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1545; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1546; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 1547; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5 1548; PROLOG: for.exiting_block.5: 1549; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1550; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1551; PROLOG: latch.5: 1552; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1553; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1554; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1555; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 1556; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6 1557; PROLOG: for.exiting_block.6: 1558; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1559; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1560; PROLOG: latch.6: 1561; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1562; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 1563; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1564; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 1565; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7 1566; PROLOG: for.exiting_block.7: 1567; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1568; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1569; PROLOG: latch.7: 1570; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1571; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 1572; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1573; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 1574; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 1575; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 1576; PROLOG: latchExit.unr-lcssa.loopexit: 1577; 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 ] 1578; PROLOG-NEXT: br label %latchExit.unr-lcssa 1579; PROLOG: latchExit.unr-lcssa.loopexit1: 1580; PROLOG-NEXT: %result.ph.ph2 = phi i32 [ 0, %header.prol ] 1581; PROLOG-NEXT: br label %latchExit.unr-lcssa 1582; PROLOG: latchExit.unr-lcssa: 1583; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 1584; PROLOG-NEXT: br label %latchExit 1585; PROLOG: latchExit: 1586; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1587; PROLOG-NEXT: ret i32 %result 1588; PROLOG: for.exit2.loopexit: 1589; PROLOG-NEXT: br label %for.exit2 1590; PROLOG: for.exit2.loopexit3: 1591; PROLOG-NEXT: br label %for.exit2 1592; PROLOG: for.exit2: 1593; PROLOG-NEXT: ret i32 42 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: for.exiting_block.1: 1633; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1634; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1635; PROLOG-BLOCK: latch.1: 1636; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1637; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1638; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1639; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1640; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1641; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 1642; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 1643; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ] 1644; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1645; PROLOG-BLOCK: latchExit.unr-lcssa: 1646; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1647; PROLOG-BLOCK-NEXT: br label %latchExit 1648; PROLOG-BLOCK: latchExit: 1649; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1650; PROLOG-BLOCK-NEXT: ret i32 %result 1651; PROLOG-BLOCK: for.exit2.loopexit: 1652; PROLOG-BLOCK-NEXT: br label %for.exit2 1653; PROLOG-BLOCK: for.exit2: 1654; PROLOG-BLOCK-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 1712; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1713; EPILOG: for.exiting_block.1: 1714; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1715; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1716; EPILOG: latch.1: 1717; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1718; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 1719; EPILOG-NEXT: %add.1 = add nsw i32 %3, %add 1720; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 1721; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 1722; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1723; EPILOG: for.exiting_block.2: 1724; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1725; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 1726; EPILOG: latch.2: 1727; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1728; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.2, align 4 1729; EPILOG-NEXT: %add.2 = add nsw i32 %4, %add.1 1730; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 1731; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 1732; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1733; EPILOG: for.exiting_block.3: 1734; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1735; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 1736; EPILOG: latch.3: 1737; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1738; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.3, align 4 1739; EPILOG-NEXT: %add.3 = add nsw i32 %5, %add.2 1740; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 1741; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 1742; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1743; EPILOG: for.exiting_block.4: 1744; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1745; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 1746; EPILOG: latch.4: 1747; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1748; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.4, align 4 1749; EPILOG-NEXT: %add.4 = add nsw i32 %6, %add.3 1750; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 1751; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 1752; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1753; EPILOG: for.exiting_block.5: 1754; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1755; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 1756; EPILOG: latch.5: 1757; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1758; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.5, align 4 1759; EPILOG-NEXT: %add.5 = add nsw i32 %7, %add.4 1760; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 1761; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 1762; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 1763; EPILOG: for.exiting_block.6: 1764; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1765; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 1766; EPILOG: latch.6: 1767; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1768; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.6, align 4 1769; EPILOG-NEXT: %add.6 = add nsw i32 %8, %add.5 1770; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 1771; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 1772; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 1773; EPILOG: for.exiting_block.7: 1774; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1775; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 1776; EPILOG: latch.7: 1777; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1778; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.7, align 4 1779; EPILOG-NEXT: %add.7 = add nsw i32 %9, %add.6 1780; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 1781; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 1782; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1783; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 1784; EPILOG: latchExit.unr-lcssa.loopexit: 1785; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 1786; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 1787; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 1788; EPILOG-NEXT: br label %latchExit.unr-lcssa 1789; EPILOG: latchExit.unr-lcssa: 1790; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1791; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1792; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1793; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1794; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1795; EPILOG: header.epil.preheader: 1796; EPILOG-NEXT: br label %header.epil 1797; EPILOG: header.epil: 1798; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 1799; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 1800; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 1801; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 1802; EPILOG: for.exiting_block.epil: 1803; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 1804; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 1805; EPILOG: latch.epil: 1806; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1807; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.epil, align 4 1808; EPILOG-NEXT: %add.epil = add nsw i32 %10, %sum.02.epil 1809; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1810; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1811; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 1812; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 1813; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5 1814; EPILOG: latchExit.epilog-lcssa.loopexit: 1815; 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 ] 1816; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1817; EPILOG: latchExit.epilog-lcssa.loopexit3: 1818; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 1819; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1820; EPILOG: latchExit.epilog-lcssa: 1821; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 1822; EPILOG-NEXT: br label %latchExit 1823; EPILOG: latchExit: 1824; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1825; EPILOG-NEXT: ret i32 %result 1826; EPILOG: for.exit2.loopexit: 1827; EPILOG-NEXT: br label %for.exit2 1828; EPILOG: for.exit2.loopexit2: 1829; EPILOG-NEXT: br label %for.exit2 1830; EPILOG: for.exit2: 1831; EPILOG-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 1856; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1857; EPILOG-BLOCK: for.exiting_block.1: 1858; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1859; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1860; EPILOG-BLOCK: latch.1: 1861; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1862; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 1863; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %3, %add 1864; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1865; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 1866; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1867; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 1868; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 1869; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 1870; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 1871; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 1872; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1873; EPILOG-BLOCK: latchExit.unr-lcssa: 1874; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1875; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1876; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1877; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1878; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1879; EPILOG-BLOCK: header.epil.preheader: 1880; EPILOG-BLOCK-NEXT: br label %header.epil 1881; EPILOG-BLOCK: header.epil: 1882; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 1883; EPILOG-BLOCK: for.exiting_block.epil: 1884; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 1885; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 1886; EPILOG-BLOCK: latch.epil: 1887; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 1888; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.epil, align 4 1889; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %4, %sum.02.unr 1890; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1891; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 1892; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ] 1893; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1894; EPILOG-BLOCK: latchExit.epilog-lcssa: 1895; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 1896; EPILOG-BLOCK-NEXT: br label %latchExit 1897; EPILOG-BLOCK: latchExit: 1898; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1899; EPILOG-BLOCK-NEXT: ret i32 %result 1900; EPILOG-BLOCK: for.exit2.loopexit: 1901; EPILOG-BLOCK-NEXT: br label %for.exit2 1902; EPILOG-BLOCK: for.exit2: 1903; EPILOG-BLOCK-NEXT: ret i32 42 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 [ 0, %header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 1928; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: for.exiting_block.1: 1957; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1958; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 1959; PROLOG: latch.1: 1960; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1961; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1962; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 1963; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1964; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1965; PROLOG: for.exiting_block.2: 1966; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1967; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 1968; PROLOG: latch.2: 1969; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1970; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1971; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1972; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 1973; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1974; PROLOG: for.exiting_block.3: 1975; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1976; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 1977; PROLOG: latch.3: 1978; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1979; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1980; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1981; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 1982; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1983; PROLOG: for.exiting_block.4: 1984; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1985; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 1986; PROLOG: latch.4: 1987; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1988; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1989; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1990; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 1991; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1992; PROLOG: for.exiting_block.5: 1993; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1994; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 1995; PROLOG: latch.5: 1996; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1997; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1998; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1999; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2000; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2001; PROLOG: for.exiting_block.6: 2002; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2003; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2004; PROLOG: latch.6: 2005; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2006; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2007; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2008; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2009; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2010; PROLOG: for.exiting_block.7: 2011; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2012; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2013; PROLOG: latch.7: 2014; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2015; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2016; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2017; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2018; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2019; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2020; PROLOG: latchExit.unr-lcssa.loopexit: 2021; 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 ] 2022; PROLOG-NEXT: br label %latchExit.unr-lcssa 2023; PROLOG: latchExit.unr-lcssa.loopexit2: 2024; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ] 2025; PROLOG-NEXT: br label %latchExit.unr-lcssa 2026; PROLOG: latchExit.unr-lcssa: 2027; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2028; PROLOG-NEXT: br label %latchExit 2029; PROLOG: latchExit: 2030; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2031; PROLOG-NEXT: ret i32 %result 2032; PROLOG: for.exit2.loopexit: 2033; PROLOG-NEXT: br label %for.exit2 2034; PROLOG: for.exit2.loopexit1: 2035; PROLOG-NEXT: br label %for.exit2 2036; PROLOG: for.exit2: 2037; PROLOG-NEXT: ret i32 42 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: for.exiting_block.1: 2077; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2078; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2079; PROLOG-BLOCK: latch.1: 2080; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2081; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2082; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2083; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2084; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2085; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 2086; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2087; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2088; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2089; PROLOG-BLOCK: latchExit.unr-lcssa: 2090; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2091; PROLOG-BLOCK-NEXT: br label %latchExit 2092; PROLOG-BLOCK: latchExit: 2093; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2094; PROLOG-BLOCK-NEXT: ret i32 %result 2095; PROLOG-BLOCK: for.exit2.loopexit: 2096; PROLOG-BLOCK-NEXT: br label %for.exit2 2097; PROLOG-BLOCK: for.exit2: 2098; PROLOG-BLOCK-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 2157; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2158; EPILOG: for.exiting_block.1: 2159; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2160; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2161; EPILOG: latch.1: 2162; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2163; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 2164; EPILOG-NEXT: %add.1 = add nsw i32 %3, %add 2165; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 2166; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 2167; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2168; EPILOG: for.exiting_block.2: 2169; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2170; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2171; EPILOG: latch.2: 2172; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2173; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.2, align 4 2174; EPILOG-NEXT: %add.2 = add nsw i32 %4, %add.1 2175; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 2176; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 2177; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2178; EPILOG: for.exiting_block.3: 2179; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2180; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2181; EPILOG: latch.3: 2182; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2183; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.3, align 4 2184; EPILOG-NEXT: %add.3 = add nsw i32 %5, %add.2 2185; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 2186; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 2187; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2188; EPILOG: for.exiting_block.4: 2189; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2190; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2191; EPILOG: latch.4: 2192; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2193; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.4, align 4 2194; EPILOG-NEXT: %add.4 = add nsw i32 %6, %add.3 2195; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 2196; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 2197; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2198; EPILOG: for.exiting_block.5: 2199; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2200; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2201; EPILOG: latch.5: 2202; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2203; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.5, align 4 2204; EPILOG-NEXT: %add.5 = add nsw i32 %7, %add.4 2205; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 2206; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 2207; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2208; EPILOG: for.exiting_block.6: 2209; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2210; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2211; EPILOG: latch.6: 2212; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2213; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.6, align 4 2214; EPILOG-NEXT: %add.6 = add nsw i32 %8, %add.5 2215; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 2216; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 2217; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2218; EPILOG: for.exiting_block.7: 2219; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2220; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2221; EPILOG: latch.7: 2222; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2223; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.7, align 4 2224; EPILOG-NEXT: %add.7 = add nsw i32 %9, %add.6 2225; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2226; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 2227; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2228; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2229; EPILOG: latchExit.unr-lcssa.loopexit: 2230; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2231; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2232; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2233; EPILOG-NEXT: br label %latchExit.unr-lcssa 2234; EPILOG: latchExit.unr-lcssa: 2235; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2236; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2237; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2238; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2239; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2240; EPILOG: header.epil.preheader: 2241; EPILOG-NEXT: br label %header.epil 2242; EPILOG: header.epil: 2243; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2244; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2245; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 2246; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2247; EPILOG: for.exiting_block.epil: 2248; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2249; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2250; EPILOG: latch.epil: 2251; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2252; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.epil, align 4 2253; EPILOG-NEXT: %add.epil = add nsw i32 %10, %sum.02.epil 2254; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2255; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2256; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 2257; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 2258; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6 2259; EPILOG: latchExit.epilog-lcssa.loopexit: 2260; 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 ] 2261; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2262; EPILOG: latchExit.epilog-lcssa.loopexit3: 2263; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2264; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2265; EPILOG: latchExit.epilog-lcssa: 2266; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2267; EPILOG-NEXT: br label %latchExit 2268; EPILOG: latchExit: 2269; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2270; EPILOG-NEXT: ret i32 %result 2271; EPILOG: for.exit2.loopexit: 2272; EPILOG-NEXT: br label %for.exit2 2273; EPILOG: for.exit2.loopexit2: 2274; EPILOG-NEXT: br label %for.exit2 2275; EPILOG: for.exit2: 2276; EPILOG-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 2301; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2302; EPILOG-BLOCK: for.exiting_block.1: 2303; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2304; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2305; EPILOG-BLOCK: latch.1: 2306; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2307; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 2308; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %3, %add 2309; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2310; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 2311; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2312; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2313; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2314; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2315; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2316; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2317; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2318; EPILOG-BLOCK: latchExit.unr-lcssa: 2319; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2320; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2321; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2322; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2323; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2324; EPILOG-BLOCK: header.epil.preheader: 2325; EPILOG-BLOCK-NEXT: br label %header.epil 2326; EPILOG-BLOCK: header.epil: 2327; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2328; EPILOG-BLOCK: for.exiting_block.epil: 2329; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2330; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2331; EPILOG-BLOCK: latch.epil: 2332; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 2333; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.epil, align 4 2334; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %4, %sum.02.unr 2335; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2336; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2337; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2338; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2339; EPILOG-BLOCK: latchExit.epilog-lcssa: 2340; 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 ] 2341; EPILOG-BLOCK-NEXT: br label %latchExit 2342; EPILOG-BLOCK: latchExit: 2343; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2344; EPILOG-BLOCK-NEXT: ret i32 %result 2345; EPILOG-BLOCK: for.exit2.loopexit: 2346; EPILOG-BLOCK-NEXT: br label %for.exit2 2347; EPILOG-BLOCK: for.exit2: 2348; EPILOG-BLOCK-NEXT: ret i32 42 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 [ 0, %header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 2373; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: for.exiting_block.1: 2402; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2403; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2404; PROLOG: latch.1: 2405; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2406; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2407; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 2408; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2409; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2410; PROLOG: for.exiting_block.2: 2411; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2412; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2413; PROLOG: latch.2: 2414; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2415; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2416; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2417; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 2418; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2419; PROLOG: for.exiting_block.3: 2420; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2421; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2422; PROLOG: latch.3: 2423; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2424; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2425; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2426; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 2427; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2428; PROLOG: for.exiting_block.4: 2429; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2430; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2431; PROLOG: latch.4: 2432; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2433; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2434; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2435; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 2436; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2437; PROLOG: for.exiting_block.5: 2438; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2439; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2440; PROLOG: latch.5: 2441; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2442; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2443; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2444; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2445; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2446; PROLOG: for.exiting_block.6: 2447; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2448; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2449; PROLOG: latch.6: 2450; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2451; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2452; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2453; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2454; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2455; PROLOG: for.exiting_block.7: 2456; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2457; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2458; PROLOG: latch.7: 2459; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2460; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2461; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2462; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2463; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2464; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2465; PROLOG: latchExit.unr-lcssa.loopexit: 2466; 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 ] 2467; PROLOG-NEXT: br label %latchExit.unr-lcssa 2468; PROLOG: latchExit.unr-lcssa.loopexit2: 2469; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2470; PROLOG-NEXT: br label %latchExit.unr-lcssa 2471; PROLOG: latchExit.unr-lcssa: 2472; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2473; PROLOG-NEXT: br label %latchExit 2474; PROLOG: latchExit: 2475; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2476; PROLOG-NEXT: ret i32 %result 2477; PROLOG: for.exit2.loopexit: 2478; PROLOG-NEXT: br label %for.exit2 2479; PROLOG: for.exit2.loopexit1: 2480; PROLOG-NEXT: br label %for.exit2 2481; PROLOG: for.exit2: 2482; PROLOG-NEXT: ret i32 42 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: for.exiting_block.1: 2522; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2523; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2524; PROLOG-BLOCK: latch.1: 2525; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2526; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2527; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2528; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2529; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2530; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2531; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2532; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2533; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2534; PROLOG-BLOCK: latchExit.unr-lcssa: 2535; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2536; PROLOG-BLOCK-NEXT: br label %latchExit 2537; PROLOG-BLOCK: latchExit: 2538; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2539; PROLOG-BLOCK-NEXT: ret i32 %result 2540; PROLOG-BLOCK: for.exit2.loopexit: 2541; PROLOG-BLOCK-NEXT: br label %for.exit2 2542; PROLOG-BLOCK: for.exit2: 2543; PROLOG-BLOCK-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 2603; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2604; EPILOG: for.exiting_block.1: 2605; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2606; EPILOG-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 2607; EPILOG-NEXT: %add.1 = add nsw i32 %3, %add 2608; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2609; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2610; EPILOG: latch.1: 2611; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 2612; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 2613; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2614; EPILOG: for.exiting_block.2: 2615; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2616; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.2, align 4 2617; EPILOG-NEXT: %add.2 = add nsw i32 %4, %add.1 2618; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2619; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2620; EPILOG: latch.2: 2621; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 2622; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 2623; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2624; EPILOG: for.exiting_block.3: 2625; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2626; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.3, align 4 2627; EPILOG-NEXT: %add.3 = add nsw i32 %5, %add.2 2628; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2629; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2630; EPILOG: latch.3: 2631; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 2632; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 2633; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2634; EPILOG: for.exiting_block.4: 2635; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2636; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.4, align 4 2637; EPILOG-NEXT: %add.4 = add nsw i32 %6, %add.3 2638; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2639; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2640; EPILOG: latch.4: 2641; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 2642; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 2643; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2644; EPILOG: for.exiting_block.5: 2645; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2646; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.5, align 4 2647; EPILOG-NEXT: %add.5 = add nsw i32 %7, %add.4 2648; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2649; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2650; EPILOG: latch.5: 2651; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 2652; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 2653; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2654; EPILOG: for.exiting_block.6: 2655; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2656; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.6, align 4 2657; EPILOG-NEXT: %add.6 = add nsw i32 %8, %add.5 2658; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2659; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2660; EPILOG: latch.6: 2661; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 2662; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 2663; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2664; EPILOG: for.exiting_block.7: 2665; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2666; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.7, align 4 2667; EPILOG-NEXT: %add.7 = add nsw i32 %9, %add.6 2668; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2669; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2670; EPILOG: latch.7: 2671; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2672; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 2673; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2674; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2675; EPILOG: latchExit.unr-lcssa.loopexit: 2676; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2677; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2678; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2679; EPILOG-NEXT: br label %latchExit.unr-lcssa 2680; EPILOG: latchExit.unr-lcssa: 2681; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2682; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2683; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2684; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2685; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2686; EPILOG: header.epil.preheader: 2687; EPILOG-NEXT: br label %header.epil 2688; EPILOG: header.epil: 2689; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2690; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2691; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 2692; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2693; EPILOG: for.exiting_block.epil: 2694; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2695; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.epil, align 4 2696; EPILOG-NEXT: %add.epil = add nsw i32 %10, %sum.02.epil 2697; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2698; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2699; EPILOG: latch.epil: 2700; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2701; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2702; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 2703; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 2704; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7 2705; EPILOG: latchExit.epilog-lcssa.loopexit: 2706; 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 ] 2707; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2708; EPILOG: latchExit.epilog-lcssa.loopexit3: 2709; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2710; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2711; EPILOG: latchExit.epilog-lcssa: 2712; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2713; EPILOG-NEXT: br label %latchExit 2714; EPILOG: latchExit: 2715; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2716; EPILOG-NEXT: ret i32 %result 2717; EPILOG: for.exit2.loopexit: 2718; EPILOG-NEXT: br label %for.exit2 2719; EPILOG: for.exit2.loopexit2: 2720; EPILOG-NEXT: br label %for.exit2 2721; EPILOG: for.exit2: 2722; EPILOG-NEXT: ret i32 42 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 [ 0, %entry.new ], [ %niter.next.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.next = add nuw nsw i64 %niter, 1 2747; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2748; EPILOG-BLOCK: for.exiting_block.1: 2749; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2750; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx.1, align 4 2751; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %3, %add 2752; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2753; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2754; EPILOG-BLOCK: latch.1: 2755; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2756; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 2757; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2758; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 2759; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2760; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2761; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2762; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2763; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2764; EPILOG-BLOCK: latchExit.unr-lcssa: 2765; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2766; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2767; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2768; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2769; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2770; EPILOG-BLOCK: header.epil.preheader: 2771; EPILOG-BLOCK-NEXT: br label %header.epil 2772; EPILOG-BLOCK: header.epil: 2773; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2774; EPILOG-BLOCK: for.exiting_block.epil: 2775; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 2776; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.epil, align 4 2777; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %4, %sum.02.unr 2778; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2779; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2780; EPILOG-BLOCK: latch.epil: 2781; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2782; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2783; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2784; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2785; EPILOG-BLOCK: latchExit.epilog-lcssa: 2786; 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 ] 2787; EPILOG-BLOCK-NEXT: br label %latchExit 2788; EPILOG-BLOCK: latchExit: 2789; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2790; EPILOG-BLOCK-NEXT: ret i32 %result 2791; EPILOG-BLOCK: for.exit2.loopexit: 2792; EPILOG-BLOCK-NEXT: br label %for.exit2 2793; EPILOG-BLOCK: for.exit2: 2794; EPILOG-BLOCK-NEXT: ret i32 42 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 [ 0, %header.prol.preheader ], [ %prol.iter.next, %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.next = add i64 %prol.iter, 1 2819; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 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: for.exiting_block.1: 2848; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2849; PROLOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2850; PROLOG-NEXT: %add.1 = add nsw i32 %4, %add 2851; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2852; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2853; PROLOG: latch.1: 2854; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2855; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2856; PROLOG: for.exiting_block.2: 2857; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2858; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2859; PROLOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2860; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2861; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2862; PROLOG: latch.2: 2863; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 2864; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2865; PROLOG: for.exiting_block.3: 2866; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2867; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2868; PROLOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2869; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2870; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2871; PROLOG: latch.3: 2872; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 2873; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2874; PROLOG: for.exiting_block.4: 2875; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2876; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2877; PROLOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2878; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2879; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2880; PROLOG: latch.4: 2881; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 2882; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2883; PROLOG: for.exiting_block.5: 2884; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2885; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2886; PROLOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2887; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2888; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2889; PROLOG: latch.5: 2890; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 2891; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2892; PROLOG: for.exiting_block.6: 2893; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2894; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2895; PROLOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2896; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2897; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2898; PROLOG: latch.6: 2899; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 2900; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2901; PROLOG: for.exiting_block.7: 2902; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2903; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2904; PROLOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2905; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2906; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2907; PROLOG: latch.7: 2908; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 2909; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2910; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2911; PROLOG: latchExit.unr-lcssa.loopexit: 2912; 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 ] 2913; PROLOG-NEXT: br label %latchExit.unr-lcssa 2914; PROLOG: latchExit.unr-lcssa.loopexit2: 2915; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2916; PROLOG-NEXT: br label %latchExit.unr-lcssa 2917; PROLOG: latchExit.unr-lcssa: 2918; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2919; PROLOG-NEXT: br label %latchExit 2920; PROLOG: latchExit: 2921; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2922; PROLOG-NEXT: ret i32 %result 2923; PROLOG: for.exit2.loopexit: 2924; PROLOG-NEXT: br label %for.exit2 2925; PROLOG: for.exit2.loopexit1: 2926; PROLOG-NEXT: br label %for.exit2 2927; PROLOG: for.exit2: 2928; PROLOG-NEXT: ret i32 42 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: for.exiting_block.1: 2968; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2969; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2970; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2971; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2972; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2973; PROLOG-BLOCK: latch.1: 2974; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2975; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2976; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 2977; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2978; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2979; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2980; PROLOG-BLOCK: latchExit.unr-lcssa: 2981; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2982; PROLOG-BLOCK-NEXT: br label %latchExit 2983; PROLOG-BLOCK: latchExit: 2984; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2985; PROLOG-BLOCK-NEXT: ret i32 %result 2986; PROLOG-BLOCK: for.exit2.loopexit: 2987; PROLOG-BLOCK-NEXT: br label %for.exit2 2988; PROLOG-BLOCK: for.exit2: 2989; PROLOG-BLOCK-NEXT: ret i32 42 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; Show a case where we have multiple exits, but (provably) exit on the 3021; first iteration and thus have nothing to unroll 3022define void @non_loop(i32 %arg) { 3023; CHECK-LABEL: @non_loop( 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; Latch exit is shared by all exiting blocks 3067define void @unique_exit(i32 %N, i32 %M) { 3068; EPILOG-LABEL: @unique_exit( 3069; EPILOG-NEXT: preheader: 3070; EPILOG-NEXT: %M.shifted = shl nuw i32 %M, 3 3071; EPILOG-NEXT: %0 = shl i32 %M, 3 3072; EPILOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %0, i32 1) 3073; EPILOG-NEXT: %1 = add i32 %umax, -1 3074; EPILOG-NEXT: %xtraiter = and i32 %umax, 7 3075; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 3076; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3077; EPILOG: preheader.new: 3078; EPILOG-NEXT: %unroll_iter = sub i32 %umax, %xtraiter 3079; EPILOG-NEXT: br label %header 3080; EPILOG: header: 3081; EPILOG-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ] 3082; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 3083; EPILOG-NEXT: %inc = add nuw nsw i32 %i4, 1 3084; EPILOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3085; EPILOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3086; EPILOG: latch: 3087; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3088; EPILOG-NEXT: %inc.1 = add nuw nsw i32 %inc, 1 3089; EPILOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3090; EPILOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3091; EPILOG: latch.1: 3092; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 3093; EPILOG-NEXT: %inc.2 = add nuw nsw i32 %inc.1, 1 3094; EPILOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3095; EPILOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit 3096; EPILOG: latch.2: 3097; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 3098; EPILOG-NEXT: %inc.3 = add nuw nsw i32 %inc.2, 1 3099; EPILOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3100; EPILOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit 3101; EPILOG: latch.3: 3102; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 3103; EPILOG-NEXT: %inc.4 = add nuw nsw i32 %inc.3, 1 3104; EPILOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3105; EPILOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit 3106; EPILOG: latch.4: 3107; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 3108; EPILOG-NEXT: %inc.5 = add nuw nsw i32 %inc.4, 1 3109; EPILOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3110; EPILOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit 3111; EPILOG: latch.5: 3112; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 3113; EPILOG-NEXT: %inc.6 = add nuw nsw i32 %inc.5, 1 3114; EPILOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3115; EPILOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit 3116; EPILOG: latch.6: 3117; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 3118; EPILOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3119; EPILOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3120; EPILOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit 3121; EPILOG: latch.7: 3122; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 3123; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 3124; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3125; EPILOG: latchExit.unr-lcssa.loopexit: 3126; EPILOG-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ] 3127; EPILOG-NEXT: %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ] 3128; EPILOG-NEXT: br label %latchExit.unr-lcssa 3129; EPILOG: latchExit.unr-lcssa: 3130; EPILOG-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3131; EPILOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3132; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3133; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3134; EPILOG: header.epil.preheader: 3135; EPILOG-NEXT: br label %header.epil 3136; EPILOG: header.epil: 3137; EPILOG-NEXT: %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ] 3138; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3139; EPILOG-NEXT: %inc.epil = add nuw i32 %i4.epil, 1 3140; EPILOG-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3141; EPILOG-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2 3142; EPILOG: latch.epil: 3143; EPILOG-NEXT: %cmp.epil = icmp ult i32 %inc.epil, %M.shifted 3144; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 3145; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 3146; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8 3147; EPILOG: latchExit.epilog-lcssa.loopexit: 3148; EPILOG-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ] 3149; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3150; EPILOG: latchExit.epilog-lcssa.loopexit2: 3151; EPILOG-NEXT: %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ] 3152; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3153; EPILOG: latchExit.epilog-lcssa: 3154; EPILOG-NEXT: %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 3155; EPILOG-NEXT: br label %latchExit 3156; EPILOG: latchExit: 3157; EPILOG-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3158; EPILOG-NEXT: ret void 3159; 3160; EPILOG-BLOCK-LABEL: @unique_exit( 3161; EPILOG-BLOCK-NEXT: preheader: 3162; EPILOG-BLOCK-NEXT: %0 = shl i32 %M, 3 3163; EPILOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %0, i32 1) 3164; EPILOG-BLOCK-NEXT: %1 = add i32 %umax, -1 3165; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 3166; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3167; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3168; EPILOG-BLOCK: preheader.new: 3169; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %umax, %xtraiter 3170; EPILOG-BLOCK-NEXT: br label %header 3171; EPILOG-BLOCK: header: 3172; EPILOG-BLOCK-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ] 3173; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 3174; EPILOG-BLOCK-NEXT: %inc = add nuw nsw i32 %i4, 1 3175; EPILOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3176; EPILOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3177; EPILOG-BLOCK: latch: 3178; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3179; EPILOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3180; EPILOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3181; EPILOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3182; EPILOG-BLOCK: latch.1: 3183; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 3184; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 3185; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3186; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 3187; EPILOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ] 3188; EPILOG-BLOCK-NEXT: %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ] 3189; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3190; EPILOG-BLOCK: latchExit.unr-lcssa: 3191; EPILOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3192; EPILOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3193; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3194; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3195; EPILOG-BLOCK: header.epil.preheader: 3196; EPILOG-BLOCK-NEXT: br label %header.epil 3197; EPILOG-BLOCK: header.epil: 3198; EPILOG-BLOCK-NEXT: %inc.epil = add nuw i32 %i4.unr, 1 3199; EPILOG-BLOCK-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3200; EPILOG-BLOCK-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa 3201; EPILOG-BLOCK: latch.epil: 3202; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3203; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 3204; EPILOG-BLOCK-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ] 3205; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3206; EPILOG-BLOCK: latchExit.epilog-lcssa: 3207; EPILOG-BLOCK-NEXT: %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 3208; EPILOG-BLOCK-NEXT: br label %latchExit 3209; EPILOG-BLOCK: latchExit: 3210; EPILOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3211; EPILOG-BLOCK-NEXT: ret void 3212; 3213; PROLOG-LABEL: @unique_exit( 3214; PROLOG-NEXT: preheader: 3215; PROLOG-NEXT: %M.shifted = shl nuw i32 %M, 3 3216; PROLOG-NEXT: %0 = shl i32 %M, 3 3217; PROLOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %0, i32 1) 3218; PROLOG-NEXT: %1 = add i32 %umax, -1 3219; PROLOG-NEXT: %xtraiter = and i32 %umax, 7 3220; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3221; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3222; PROLOG: header.prol.preheader: 3223; PROLOG-NEXT: br label %header.prol 3224; PROLOG: header.prol: 3225; PROLOG-NEXT: %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3226; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 3227; PROLOG-NEXT: %inc.prol = add nuw i32 %i4.prol, 1 3228; PROLOG-NEXT: %cmp1.prol = icmp ult i32 %inc.prol, %N 3229; PROLOG-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1 3230; PROLOG: latch.prol: 3231; PROLOG-NEXT: %cmp.prol = icmp ult i32 %inc.prol, %M.shifted 3232; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 3233; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 3234; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8 3235; PROLOG: header.prol.loopexit.unr-lcssa: 3236; PROLOG-NEXT: %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ] 3237; PROLOG-NEXT: %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ] 3238; PROLOG-NEXT: br label %header.prol.loopexit 3239; PROLOG: header.prol.loopexit: 3240; PROLOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ] 3241; PROLOG-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ] 3242; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 3243; PROLOG-NEXT: br i1 %2, label %latchExit, label %preheader.new 3244; PROLOG: preheader.new: 3245; PROLOG-NEXT: br label %header 3246; PROLOG: header: 3247; PROLOG-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ] 3248; PROLOG-NEXT: %inc = add nuw i32 %i4, 1 3249; PROLOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3250; PROLOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3251; PROLOG: latch: 3252; PROLOG-NEXT: %inc.1 = add nuw i32 %inc, 1 3253; PROLOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3254; PROLOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3255; PROLOG: latch.1: 3256; PROLOG-NEXT: %inc.2 = add nuw i32 %inc.1, 1 3257; PROLOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3258; PROLOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit 3259; PROLOG: latch.2: 3260; PROLOG-NEXT: %inc.3 = add nuw i32 %inc.2, 1 3261; PROLOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3262; PROLOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit 3263; PROLOG: latch.3: 3264; PROLOG-NEXT: %inc.4 = add nuw i32 %inc.3, 1 3265; PROLOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3266; PROLOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit 3267; PROLOG: latch.4: 3268; PROLOG-NEXT: %inc.5 = add nuw i32 %inc.4, 1 3269; PROLOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3270; PROLOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit 3271; PROLOG: latch.5: 3272; PROLOG-NEXT: %inc.6 = add nuw i32 %inc.5, 1 3273; PROLOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3274; PROLOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit 3275; PROLOG: latch.6: 3276; PROLOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3277; PROLOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3278; PROLOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit 3279; PROLOG: latch.7: 3280; PROLOG-NEXT: %cmp.7 = icmp ult i32 %inc.7, %M.shifted 3281; PROLOG-NEXT: br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3282; PROLOG: latchExit.unr-lcssa.loopexit: 3283; PROLOG-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ] 3284; PROLOG-NEXT: br label %latchExit.unr-lcssa 3285; PROLOG: latchExit.unr-lcssa.loopexit1: 3286; PROLOG-NEXT: %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ] 3287; PROLOG-NEXT: br label %latchExit.unr-lcssa 3288; PROLOG: latchExit.unr-lcssa: 3289; PROLOG-NEXT: %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 3290; PROLOG-NEXT: br label %latchExit 3291; PROLOG: latchExit: 3292; PROLOG-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3293; PROLOG-NEXT: ret void 3294; 3295; PROLOG-BLOCK-LABEL: @unique_exit( 3296; PROLOG-BLOCK-NEXT: preheader: 3297; PROLOG-BLOCK-NEXT: %M.shifted = shl nuw i32 %M, 3 3298; PROLOG-BLOCK-NEXT: %0 = shl i32 %M, 3 3299; PROLOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %0, i32 1) 3300; PROLOG-BLOCK-NEXT: %1 = add i32 %umax, -1 3301; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 3302; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3303; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3304; PROLOG-BLOCK: header.prol.preheader: 3305; PROLOG-BLOCK-NEXT: br label %header.prol 3306; PROLOG-BLOCK: header.prol: 3307; PROLOG-BLOCK-NEXT: %cmp1.prol = icmp ult i32 1, %N 3308; PROLOG-BLOCK-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa 3309; PROLOG-BLOCK: latch.prol: 3310; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3311; PROLOG-BLOCK: header.prol.loopexit: 3312; PROLOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ] 3313; PROLOG-BLOCK-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ] 3314; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3315; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %preheader.new 3316; PROLOG-BLOCK: preheader.new: 3317; PROLOG-BLOCK-NEXT: br label %header 3318; PROLOG-BLOCK: header: 3319; PROLOG-BLOCK-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ] 3320; PROLOG-BLOCK-NEXT: %inc = add nuw i32 %i4, 1 3321; PROLOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3322; PROLOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3323; PROLOG-BLOCK: latch: 3324; PROLOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3325; PROLOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3326; PROLOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3327; PROLOG-BLOCK: latch.1: 3328; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ult i32 %inc.1, %M.shifted 3329; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3330; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 3331; PROLOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ] 3332; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3333; PROLOG-BLOCK: latchExit.unr-lcssa: 3334; PROLOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3335; PROLOG-BLOCK-NEXT: br label %latchExit 3336; PROLOG-BLOCK: latchExit: 3337; PROLOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3338; PROLOG-BLOCK-NEXT: ret void 3339; 3340 3341preheader: 3342 %M.shifted = shl nuw i32 %M, 3 3343 br label %header 3344 3345header: ; preds = %preheader, %latch 3346 %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ] 3347 %inc = add nuw i32 %i4, 1 3348 %cmp1 = icmp ult i32 %inc, %N 3349 br i1 %cmp1, label %latch, label %latchExit 3350 3351latch: ; preds = %header 3352 %cmp = icmp ult i32 %inc, %M.shifted 3353 br i1 %cmp, label %header, label %latchExit 3354 3355latchExit: ; preds = %header, %latch 3356 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3357 ret void 3358} 3359 3360 3361; two exiting and two exit blocks. 3362; the non-latch exiting block has duplicate edges to the non-latch exit block. 3363define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 3364; EPILOG-LABEL: @test5( 3365; EPILOG-NEXT: entry: 3366; EPILOG-NEXT: %0 = add i64 %trip, -1 3367; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 3368; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3369; EPILOG-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3370; EPILOG: entry.new: 3371; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3372; EPILOG-NEXT: br label %loop_header 3373; EPILOG: loop_header: 3374; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3375; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3376; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 3377; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3378; EPILOG: loop_exiting: 3379; EPILOG-NEXT: %ivy = add i64 %iv, %add 3380; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 3381; EPILOG-NEXT: i64 24, label %exit1.loopexit 3382; EPILOG-NEXT: i64 42, label %exit1.loopexit 3383; EPILOG-NEXT: ] 3384; EPILOG: loop_latch: 3385; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3386; EPILOG-NEXT: %sum.next = add i64 %sum, %add 3387; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3388; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3389; EPILOG: loop_exiting.1: 3390; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3391; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3392; EPILOG-NEXT: i64 24, label %exit1.loopexit 3393; EPILOG-NEXT: i64 42, label %exit1.loopexit 3394; EPILOG-NEXT: ] 3395; EPILOG: loop_latch.1: 3396; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3397; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3398; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 3399; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3400; EPILOG: loop_exiting.2: 3401; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3402; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3403; EPILOG-NEXT: i64 24, label %exit1.loopexit 3404; EPILOG-NEXT: i64 42, label %exit1.loopexit 3405; EPILOG-NEXT: ] 3406; EPILOG: loop_latch.2: 3407; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3408; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3409; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 3410; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3411; EPILOG: loop_exiting.3: 3412; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3413; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3414; EPILOG-NEXT: i64 24, label %exit1.loopexit 3415; EPILOG-NEXT: i64 42, label %exit1.loopexit 3416; EPILOG-NEXT: ] 3417; EPILOG: loop_latch.3: 3418; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3419; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3420; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 3421; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3422; EPILOG: loop_exiting.4: 3423; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3424; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3425; EPILOG-NEXT: i64 24, label %exit1.loopexit 3426; EPILOG-NEXT: i64 42, label %exit1.loopexit 3427; EPILOG-NEXT: ] 3428; EPILOG: loop_latch.4: 3429; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3430; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3431; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 3432; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3433; EPILOG: loop_exiting.5: 3434; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3435; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3436; EPILOG-NEXT: i64 24, label %exit1.loopexit 3437; EPILOG-NEXT: i64 42, label %exit1.loopexit 3438; EPILOG-NEXT: ] 3439; EPILOG: loop_latch.5: 3440; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3441; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3442; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 3443; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3444; EPILOG: loop_exiting.6: 3445; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3446; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3447; EPILOG-NEXT: i64 24, label %exit1.loopexit 3448; EPILOG-NEXT: i64 42, label %exit1.loopexit 3449; EPILOG-NEXT: ] 3450; EPILOG: loop_latch.6: 3451; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3452; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3453; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 3454; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3455; EPILOG: loop_exiting.7: 3456; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3457; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3458; EPILOG-NEXT: i64 24, label %exit1.loopexit 3459; EPILOG-NEXT: i64 42, label %exit1.loopexit 3460; EPILOG-NEXT: ] 3461; EPILOG: loop_latch.7: 3462; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3463; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3464; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 3465; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 3466; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 3467; EPILOG: exit1.loopexit: 3468; 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 ] 3469; EPILOG-NEXT: br label %exit1 3470; EPILOG: exit1.loopexit2: 3471; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 3472; EPILOG-NEXT: br label %exit1 3473; EPILOG: exit1: 3474; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 3475; EPILOG-NEXT: ret i64 %result 3476; EPILOG: latchexit.unr-lcssa.loopexit: 3477; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3478; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 3479; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3480; EPILOG-NEXT: br label %latchexit.unr-lcssa 3481; EPILOG: latchexit.unr-lcssa: 3482; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3483; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3484; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3485; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3486; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3487; EPILOG: loop_header.epil.preheader: 3488; EPILOG-NEXT: br label %loop_header.epil 3489; EPILOG: loop_header.epil: 3490; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 3491; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 3492; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 3493; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3494; EPILOG: loop_exiting.epil: 3495; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 3496; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3497; EPILOG-NEXT: i64 24, label %exit1.loopexit2 3498; EPILOG-NEXT: i64 42, label %exit1.loopexit2 3499; EPILOG-NEXT: ] 3500; EPILOG: loop_latch.epil: 3501; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3502; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3503; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 3504; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3505; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3506; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9 3507; EPILOG: latchexit.epilog-lcssa: 3508; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 3509; EPILOG-NEXT: br label %latchexit 3510; EPILOG: latchexit: 3511; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 3512; EPILOG-NEXT: ret i64 %sum.next.lcssa 3513; 3514; EPILOG-BLOCK-LABEL: @test5( 3515; EPILOG-BLOCK-NEXT: entry: 3516; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3517; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3518; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3519; EPILOG-BLOCK-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3520; EPILOG-BLOCK: entry.new: 3521; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3522; EPILOG-BLOCK-NEXT: br label %loop_header 3523; EPILOG-BLOCK: loop_header: 3524; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3525; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3526; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 3527; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3528; EPILOG-BLOCK: loop_exiting: 3529; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3530; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3531; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3532; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3533; EPILOG-BLOCK-NEXT: ] 3534; EPILOG-BLOCK: loop_latch: 3535; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3536; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3537; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3538; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3539; EPILOG-BLOCK: loop_exiting.1: 3540; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3541; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3542; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3543; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3544; EPILOG-BLOCK-NEXT: ] 3545; EPILOG-BLOCK: loop_latch.1: 3546; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3547; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3548; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 3549; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 3550; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9 3551; EPILOG-BLOCK: exit1.loopexit: 3552; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3553; EPILOG-BLOCK-NEXT: br label %exit1 3554; EPILOG-BLOCK: exit1: 3555; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 3556; EPILOG-BLOCK-NEXT: ret i64 %result 3557; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3558; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3559; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 3560; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3561; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3562; EPILOG-BLOCK: latchexit.unr-lcssa: 3563; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3564; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3565; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3566; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3567; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3568; EPILOG-BLOCK: loop_header.epil.preheader: 3569; EPILOG-BLOCK-NEXT: br label %loop_header.epil 3570; EPILOG-BLOCK: loop_header.epil: 3571; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3572; EPILOG-BLOCK: loop_exiting.epil: 3573; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.unr, %add 3574; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 3575; EPILOG-BLOCK-NEXT: i64 24, label %exit1 3576; EPILOG-BLOCK-NEXT: i64 42, label %exit1 3577; EPILOG-BLOCK-NEXT: ] 3578; EPILOG-BLOCK: loop_latch.epil: 3579; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.unr, %add 3580; EPILOG-BLOCK-NEXT: br label %latchexit 3581; EPILOG-BLOCK: latchexit: 3582; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ] 3583; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3584; 3585; PROLOG-LABEL: @test5( 3586; PROLOG-NEXT: entry: 3587; PROLOG-NEXT: %0 = add i64 %trip, -1 3588; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 3589; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3590; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3591; PROLOG: loop_header.prol.preheader: 3592; PROLOG-NEXT: br label %loop_header.prol 3593; PROLOG: loop_header.prol: 3594; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 3595; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 3596; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 3597; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3598; PROLOG: loop_exiting.prol: 3599; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 3600; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 3601; PROLOG-NEXT: i64 24, label %exit1.loopexit1 3602; PROLOG-NEXT: i64 42, label %exit1.loopexit1 3603; PROLOG-NEXT: ] 3604; PROLOG: loop_latch.prol: 3605; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 3606; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 3607; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 3608; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 3609; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 3610; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9 3611; PROLOG: loop_header.prol.loopexit.unr-lcssa: 3612; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 3613; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3614; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3615; PROLOG-NEXT: br label %loop_header.prol.loopexit 3616; PROLOG: loop_header.prol.loopexit: 3617; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3618; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3619; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3620; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 3621; PROLOG-NEXT: br i1 %1, label %latchexit, label %entry.new 3622; PROLOG: entry.new: 3623; PROLOG-NEXT: br label %loop_header 3624; PROLOG: loop_header: 3625; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3626; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3627; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3628; PROLOG: loop_exiting: 3629; PROLOG-NEXT: %ivy = add i64 %iv, %add 3630; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 3631; PROLOG-NEXT: i64 24, label %exit1.loopexit 3632; PROLOG-NEXT: i64 42, label %exit1.loopexit 3633; PROLOG-NEXT: ] 3634; PROLOG: loop_latch: 3635; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3636; PROLOG-NEXT: %sum.next = add i64 %sum, %add 3637; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3638; PROLOG: loop_exiting.1: 3639; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3640; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3641; PROLOG-NEXT: i64 24, label %exit1.loopexit 3642; PROLOG-NEXT: i64 42, label %exit1.loopexit 3643; PROLOG-NEXT: ] 3644; PROLOG: loop_latch.1: 3645; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3646; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3647; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3648; PROLOG: loop_exiting.2: 3649; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3650; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3651; PROLOG-NEXT: i64 24, label %exit1.loopexit 3652; PROLOG-NEXT: i64 42, label %exit1.loopexit 3653; PROLOG-NEXT: ] 3654; PROLOG: loop_latch.2: 3655; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3656; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3657; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3658; PROLOG: loop_exiting.3: 3659; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3660; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3661; PROLOG-NEXT: i64 24, label %exit1.loopexit 3662; PROLOG-NEXT: i64 42, label %exit1.loopexit 3663; PROLOG-NEXT: ] 3664; PROLOG: loop_latch.3: 3665; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3666; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3667; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3668; PROLOG: loop_exiting.4: 3669; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3670; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3671; PROLOG-NEXT: i64 24, label %exit1.loopexit 3672; PROLOG-NEXT: i64 42, label %exit1.loopexit 3673; PROLOG-NEXT: ] 3674; PROLOG: loop_latch.4: 3675; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3676; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3677; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3678; PROLOG: loop_exiting.5: 3679; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3680; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3681; PROLOG-NEXT: i64 24, label %exit1.loopexit 3682; PROLOG-NEXT: i64 42, label %exit1.loopexit 3683; PROLOG-NEXT: ] 3684; PROLOG: loop_latch.5: 3685; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3686; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3687; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3688; PROLOG: loop_exiting.6: 3689; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3690; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3691; PROLOG-NEXT: i64 24, label %exit1.loopexit 3692; PROLOG-NEXT: i64 42, label %exit1.loopexit 3693; PROLOG-NEXT: ] 3694; PROLOG: loop_latch.6: 3695; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3696; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3697; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3698; PROLOG: loop_exiting.7: 3699; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3700; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3701; PROLOG-NEXT: i64 24, label %exit1.loopexit 3702; PROLOG-NEXT: i64 42, label %exit1.loopexit 3703; PROLOG-NEXT: ] 3704; PROLOG: loop_latch.7: 3705; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3706; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3707; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 3708; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 3709; PROLOG: exit1.loopexit: 3710; 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 ] 3711; PROLOG-NEXT: br label %exit1 3712; PROLOG: exit1.loopexit1: 3713; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 3714; PROLOG-NEXT: br label %exit1 3715; PROLOG: exit1: 3716; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 3717; PROLOG-NEXT: ret i64 %result 3718; PROLOG: latchexit.unr-lcssa: 3719; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3720; PROLOG-NEXT: br label %latchexit 3721; PROLOG: latchexit: 3722; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3723; PROLOG-NEXT: ret i64 %sum.next.lcssa 3724; 3725; PROLOG-BLOCK-LABEL: @test5( 3726; PROLOG-BLOCK-NEXT: entry: 3727; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3728; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3729; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3730; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3731; PROLOG-BLOCK: loop_header.prol.preheader: 3732; PROLOG-BLOCK-NEXT: br label %loop_header.prol 3733; PROLOG-BLOCK: loop_header.prol: 3734; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3735; PROLOG-BLOCK: loop_exiting.prol: 3736; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 3737; PROLOG-BLOCK-NEXT: i64 24, label %exit1 3738; PROLOG-BLOCK-NEXT: i64 42, label %exit1 3739; PROLOG-BLOCK-NEXT: ] 3740; PROLOG-BLOCK: loop_latch.prol: 3741; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 3742; PROLOG-BLOCK: loop_header.prol.loopexit: 3743; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 3744; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 3745; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ] 3746; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3747; PROLOG-BLOCK-NEXT: br i1 %1, label %latchexit, label %entry.new 3748; PROLOG-BLOCK: entry.new: 3749; PROLOG-BLOCK-NEXT: br label %loop_header 3750; PROLOG-BLOCK: loop_header: 3751; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3752; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3753; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3754; PROLOG-BLOCK: loop_exiting: 3755; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3756; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3757; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3758; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3759; PROLOG-BLOCK-NEXT: ] 3760; PROLOG-BLOCK: loop_latch: 3761; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3762; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3763; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3764; PROLOG-BLOCK: loop_exiting.1: 3765; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3766; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3767; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3768; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3769; PROLOG-BLOCK-NEXT: ] 3770; PROLOG-BLOCK: loop_latch.1: 3771; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3772; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3773; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 3774; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9 3775; PROLOG-BLOCK: exit1.loopexit: 3776; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3777; PROLOG-BLOCK-NEXT: br label %exit1 3778; PROLOG-BLOCK: exit1: 3779; PROLOG-BLOCK-NEXT: %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 3780; PROLOG-BLOCK-NEXT: ret i64 %result 3781; PROLOG-BLOCK: latchexit.unr-lcssa: 3782; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3783; PROLOG-BLOCK-NEXT: br label %latchexit 3784; PROLOG-BLOCK: latchexit: 3785; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3786; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3787; 3788 3789entry: 3790 br label %loop_header 3791 3792loop_header: 3793 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3794 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3795 br i1 %cond, label %loop_latch, label %loop_exiting 3796 3797loop_exiting: 3798 %ivy = add i64 %iv, %add 3799 switch i64 %sum, label %loop_latch [ 3800 i64 24, label %exit1 3801 i64 42, label %exit1 3802 ] 3803 3804loop_latch: 3805 %iv_next = add nuw nsw i64 %iv, 1 3806 %sum.next = add i64 %sum, %add 3807 %cmp = icmp ne i64 %iv_next, %trip 3808 br i1 %cmp, label %loop_header, label %latchexit 3809 3810exit1: 3811 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3812 ret i64 %result 3813 3814latchexit: 3815 ret i64 %sum.next 3816} 3817 3818; test when exit blocks have successors. 3819define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 3820; EPILOG-LABEL: @test6( 3821; EPILOG-NEXT: entry: 3822; EPILOG-NEXT: %0 = add i64 %n, -1 3823; EPILOG-NEXT: %xtraiter = and i64 %n, 7 3824; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3825; EPILOG-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3826; EPILOG: entry.new: 3827; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3828; EPILOG-NEXT: br label %header 3829; EPILOG: header: 3830; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3831; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3832; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 3833; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3834; EPILOG: for.exiting_block: 3835; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3836; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3837; EPILOG: latch: 3838; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3839; EPILOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3840; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3841; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3842; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3843; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3844; EPILOG: for.exiting_block.1: 3845; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3846; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3847; EPILOG: latch.1: 3848; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3849; EPILOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3850; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3851; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 3852; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 3853; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3854; EPILOG: for.exiting_block.2: 3855; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3856; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3857; EPILOG: latch.2: 3858; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3859; EPILOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3860; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3861; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 3862; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 3863; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3864; EPILOG: for.exiting_block.3: 3865; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3866; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3867; EPILOG: latch.3: 3868; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3869; EPILOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3870; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3871; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 3872; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 3873; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3874; EPILOG: for.exiting_block.4: 3875; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3876; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3877; EPILOG: latch.4: 3878; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3879; EPILOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3880; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3881; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 3882; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 3883; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3884; EPILOG: for.exiting_block.5: 3885; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3886; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3887; EPILOG: latch.5: 3888; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3889; EPILOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3890; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3891; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 3892; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 3893; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3894; EPILOG: for.exiting_block.6: 3895; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3896; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3897; EPILOG: latch.6: 3898; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3899; EPILOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3900; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3901; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 3902; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 3903; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3904; EPILOG: for.exiting_block.7: 3905; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3906; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3907; EPILOG: latch.7: 3908; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3909; EPILOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3910; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3911; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3912; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 3913; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 3914; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3915; EPILOG: latch_exit.unr-lcssa.loopexit: 3916; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3917; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3918; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3919; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3920; EPILOG: latch_exit.unr-lcssa: 3921; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3922; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3923; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3924; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3925; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3926; EPILOG: header.epil.preheader: 3927; EPILOG-NEXT: br label %header.epil 3928; EPILOG: header.epil: 3929; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3930; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3931; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3932; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3933; EPILOG: for.exiting_block.epil: 3934; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3935; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3936; EPILOG: latch.epil: 3937; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3938; EPILOG-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3939; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3940; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3941; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3942; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3943; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3944; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10 3945; EPILOG: latch_exit.epilog-lcssa: 3946; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3947; EPILOG-NEXT: br label %latch_exit 3948; EPILOG: latch_exit: 3949; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3950; EPILOG-NEXT: ret i32 %sum.0.lcssa 3951; EPILOG: for.exit2.loopexit: 3952; 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 ] 3953; EPILOG-NEXT: br label %for.exit2 3954; EPILOG: for.exit2.loopexit2: 3955; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3956; EPILOG-NEXT: br label %for.exit2 3957; EPILOG: for.exit2: 3958; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3959; EPILOG-NEXT: %addx = add i32 %retval, %x 3960; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3961; EPILOG: exit_true: 3962; EPILOG-NEXT: ret i32 %retval 3963; EPILOG: exit_false: 3964; EPILOG-NEXT: ret i32 %addx 3965; 3966; EPILOG-BLOCK-LABEL: @test6( 3967; EPILOG-BLOCK-NEXT: entry: 3968; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 3969; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3970; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3971; EPILOG-BLOCK-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3972; EPILOG-BLOCK: entry.new: 3973; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3974; EPILOG-BLOCK-NEXT: br label %header 3975; EPILOG-BLOCK: header: 3976; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3977; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 3978; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 3979; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3980; EPILOG-BLOCK: for.exiting_block: 3981; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3982; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3983; EPILOG-BLOCK: latch: 3984; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3985; EPILOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3986; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3987; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3988; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3989; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3990; EPILOG-BLOCK: for.exiting_block.1: 3991; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3992; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3993; EPILOG-BLOCK: latch.1: 3994; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3995; EPILOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3996; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3997; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3998; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 3999; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 4000; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10 4001; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 4002; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 4003; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 4004; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 4005; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 4006; EPILOG-BLOCK: latch_exit.unr-lcssa: 4007; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 4008; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4009; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4010; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4011; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 4012; EPILOG-BLOCK: header.epil.preheader: 4013; EPILOG-BLOCK-NEXT: br label %header.epil 4014; EPILOG-BLOCK: header.epil: 4015; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 4016; EPILOG-BLOCK: for.exiting_block.epil: 4017; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 4018; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 4019; EPILOG-BLOCK: latch.epil: 4020; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 4021; EPILOG-BLOCK-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 4022; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.unr 4023; EPILOG-BLOCK-NEXT: br label %latch_exit 4024; EPILOG-BLOCK: latch_exit: 4025; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ] 4026; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4027; EPILOG-BLOCK: for.exit2.loopexit: 4028; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4029; EPILOG-BLOCK-NEXT: br label %for.exit2 4030; EPILOG-BLOCK: for.exit2: 4031; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 4032; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4033; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4034; EPILOG-BLOCK: exit_true: 4035; EPILOG-BLOCK-NEXT: ret i32 %retval 4036; EPILOG-BLOCK: exit_false: 4037; EPILOG-BLOCK-NEXT: ret i32 %addx 4038; 4039; PROLOG-LABEL: @test6( 4040; PROLOG-NEXT: entry: 4041; PROLOG-NEXT: %0 = add i64 %n, -1 4042; PROLOG-NEXT: %xtraiter = and i64 %n, 7 4043; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4044; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4045; PROLOG: header.prol.preheader: 4046; PROLOG-NEXT: br label %header.prol 4047; PROLOG: header.prol: 4048; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 4049; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 4050; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4051; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 4052; PROLOG: for.exiting_block.prol: 4053; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 4054; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 4055; PROLOG: latch.prol: 4056; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 4057; PROLOG-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 4058; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 4059; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 4060; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 4061; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4062; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4063; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10 4064; PROLOG: header.prol.loopexit.unr-lcssa: 4065; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4066; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 4067; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4068; PROLOG-NEXT: br label %header.prol.loopexit 4069; PROLOG: header.prol.loopexit: 4070; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 4071; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 4072; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 4073; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 4074; PROLOG-NEXT: br i1 %1, label %latch_exit, label %entry.new 4075; PROLOG: entry.new: 4076; PROLOG-NEXT: br label %header 4077; PROLOG: header: 4078; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 4079; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 4080; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4081; PROLOG: for.exiting_block: 4082; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 4083; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4084; PROLOG: latch: 4085; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4086; PROLOG-NEXT: %load = load i32, i32* %arrayidx, align 4 4087; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 4088; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4089; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4090; PROLOG: for.exiting_block.1: 4091; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 4092; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4093; PROLOG: latch.1: 4094; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4095; PROLOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4096; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 4097; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4098; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 4099; PROLOG: for.exiting_block.2: 4100; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 4101; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 4102; PROLOG: latch.2: 4103; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 4104; PROLOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 4105; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 4106; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 4107; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 4108; PROLOG: for.exiting_block.3: 4109; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 4110; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 4111; PROLOG: latch.3: 4112; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 4113; PROLOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 4114; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 4115; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 4116; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 4117; PROLOG: for.exiting_block.4: 4118; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 4119; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 4120; PROLOG: latch.4: 4121; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 4122; PROLOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 4123; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 4124; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 4125; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 4126; PROLOG: for.exiting_block.5: 4127; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 4128; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 4129; PROLOG: latch.5: 4130; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 4131; PROLOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 4132; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 4133; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 4134; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 4135; PROLOG: for.exiting_block.6: 4136; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 4137; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 4138; PROLOG: latch.6: 4139; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 4140; PROLOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 4141; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 4142; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 4143; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 4144; PROLOG: for.exiting_block.7: 4145; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 4146; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 4147; PROLOG: latch.7: 4148; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 4149; PROLOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 4150; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 4151; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 4152; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 4153; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 4154; PROLOG: latch_exit.unr-lcssa: 4155; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 4156; PROLOG-NEXT: br label %latch_exit 4157; PROLOG: latch_exit: 4158; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4159; PROLOG-NEXT: ret i32 %sum.0.lcssa 4160; PROLOG: for.exit2.loopexit: 4161; 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 ] 4162; PROLOG-NEXT: br label %for.exit2 4163; PROLOG: for.exit2.loopexit1: 4164; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 4165; PROLOG-NEXT: br label %for.exit2 4166; PROLOG: for.exit2: 4167; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 4168; PROLOG-NEXT: %addx = add i32 %retval, %x 4169; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 4170; PROLOG: exit_true: 4171; PROLOG-NEXT: ret i32 %retval 4172; PROLOG: exit_false: 4173; PROLOG-NEXT: ret i32 %addx 4174; 4175; PROLOG-BLOCK-LABEL: @test6( 4176; PROLOG-BLOCK-NEXT: entry: 4177; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 4178; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 4179; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4180; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4181; PROLOG-BLOCK: header.prol.preheader: 4182; PROLOG-BLOCK-NEXT: br label %header.prol 4183; PROLOG-BLOCK: header.prol: 4184; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 4185; PROLOG-BLOCK: for.exiting_block.prol: 4186; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 4187; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 4188; PROLOG-BLOCK: latch.prol: 4189; PROLOG-BLOCK-NEXT: %load.prol = load i32, i32* %a, align 4 4190; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4191; PROLOG-BLOCK: header.prol.loopexit: 4192; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ] 4193; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 4194; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ] 4195; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 4196; PROLOG-BLOCK-NEXT: br i1 %1, label %latch_exit, label %entry.new 4197; PROLOG-BLOCK: entry.new: 4198; PROLOG-BLOCK-NEXT: br label %header 4199; PROLOG-BLOCK: header: 4200; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 4201; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 4202; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4203; PROLOG-BLOCK: for.exiting_block: 4204; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 4205; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4206; PROLOG-BLOCK: latch: 4207; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4208; PROLOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 4209; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 4210; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4211; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4212; PROLOG-BLOCK: for.exiting_block.1: 4213; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4214; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4215; PROLOG-BLOCK: latch.1: 4216; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4217; PROLOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4218; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4219; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4220; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 4221; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10 4222; PROLOG-BLOCK: latch_exit.unr-lcssa: 4223; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 4224; PROLOG-BLOCK-NEXT: br label %latch_exit 4225; PROLOG-BLOCK: latch_exit: 4226; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4227; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4228; PROLOG-BLOCK: for.exit2.loopexit: 4229; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4230; PROLOG-BLOCK-NEXT: br label %for.exit2 4231; PROLOG-BLOCK: for.exit2: 4232; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 4233; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4234; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4235; PROLOG-BLOCK: exit_true: 4236; PROLOG-BLOCK-NEXT: ret i32 %retval 4237; PROLOG-BLOCK: exit_false: 4238; PROLOG-BLOCK-NEXT: ret i32 %addx 4239; 4240 4241entry: 4242 br label %header 4243 4244header: 4245 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 4246 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 4247 br i1 false, label %for.exit2, label %for.exiting_block 4248 4249for.exiting_block: 4250 %cmp = icmp eq i64 %n, 42 4251 br i1 %cmp, label %for.exit2, label %latch 4252 4253latch: 4254 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4255 %load = load i32, i32* %arrayidx, align 4 4256 %add = add nsw i32 %load, %sum.02 4257 %indvars.iv.next = add i64 %indvars.iv, 1 4258 %exitcond = icmp eq i64 %indvars.iv.next, %n 4259 br i1 %exitcond, label %latch_exit, label %header 4260 4261latch_exit: 4262 %sum.0.lcssa = phi i32 [ %add, %latch ] 4263 ret i32 %sum.0.lcssa 4264 4265for.exit2: 4266 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 4267 %addx = add i32 %retval, %x 4268 br i1 %cond, label %exit_true, label %exit_false 4269 4270exit_true: 4271 ret i32 %retval 4272 4273exit_false: 4274 ret i32 %addx 4275} 4276 4277; test when value in exit block does not have VMap. 4278define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 4279; EPILOG-LABEL: @test7( 4280; EPILOG-NEXT: bb: 4281; EPILOG-NEXT: %i = icmp slt i32 undef, 2 4282; EPILOG-NEXT: %sext = sext i32 undef to i64 4283; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 4284; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4285; EPILOG: preheader: 4286; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 4287; EPILOG-NEXT: %1 = add nsw i64 %sext, -2 4288; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4289; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4290; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4291; EPILOG: preheader.new: 4292; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4293; EPILOG-NEXT: br label %header 4294; EPILOG: header: 4295; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 4296; EPILOG-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4297; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4298; EPILOG: latch: 4299; EPILOG-NEXT: %add = add nuw nsw i64 %i6, 1 4300; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4301; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4302; EPILOG: latch.1: 4303; EPILOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4304; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 4305; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4306; EPILOG: latch.2: 4307; EPILOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4308; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 4309; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4310; EPILOG: latch.3: 4311; EPILOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4312; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 4313; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4314; EPILOG: latch.4: 4315; EPILOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4316; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 4317; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4318; EPILOG: latch.5: 4319; EPILOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4320; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 4321; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4322; EPILOG: latch.6: 4323; EPILOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4324; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 4325; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4326; EPILOG: latch.7: 4327; EPILOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4328; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 4329; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4330; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 4331; EPILOG: latchexit.unr-lcssa.loopexit: 4332; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 4333; EPILOG-NEXT: br label %latchexit.unr-lcssa 4334; EPILOG: latchexit.unr-lcssa: 4335; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4336; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4337; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4338; EPILOG: header.epil.preheader: 4339; EPILOG-NEXT: br label %header.epil 4340; EPILOG: header.epil: 4341; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 4342; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4343; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 4344; EPILOG: latch.epil: 4345; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4346; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 4347; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4348; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4349; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11 4350; EPILOG: latchexit.epilog-lcssa: 4351; EPILOG-NEXT: br label %latchexit 4352; EPILOG: latchexit: 4353; EPILOG-NEXT: unreachable 4354; EPILOG: loopexit2: 4355; EPILOG-NEXT: ret i32 %shft 4356; EPILOG: loopexit1.loopexit: 4357; 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 ] 4358; EPILOG-NEXT: br label %loopexit1 4359; EPILOG: loopexit1.loopexit1: 4360; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 4361; EPILOG-NEXT: br label %loopexit1 4362; EPILOG: loopexit1: 4363; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4364; EPILOG-NEXT: ret i32 %sext3 4365; 4366; EPILOG-BLOCK-LABEL: @test7( 4367; EPILOG-BLOCK-NEXT: bb: 4368; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4369; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4370; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4371; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4372; EPILOG-BLOCK: preheader: 4373; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4374; EPILOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4375; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4376; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4377; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4378; EPILOG-BLOCK: preheader.new: 4379; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4380; EPILOG-BLOCK-NEXT: br label %header 4381; EPILOG-BLOCK: header: 4382; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 4383; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 4384; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4385; EPILOG-BLOCK: latch: 4386; EPILOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4387; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4388; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4389; EPILOG-BLOCK: latch.1: 4390; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4391; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 4392; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4393; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11 4394; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 4395; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 4396; EPILOG-BLOCK: latchexit.unr-lcssa: 4397; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4398; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4399; EPILOG-BLOCK: header.epil.preheader: 4400; EPILOG-BLOCK-NEXT: br label %header.epil 4401; EPILOG-BLOCK: header.epil: 4402; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 4403; EPILOG-BLOCK: latch.epil: 4404; EPILOG-BLOCK-NEXT: br label %latchexit 4405; EPILOG-BLOCK: latchexit: 4406; EPILOG-BLOCK-NEXT: unreachable 4407; EPILOG-BLOCK: loopexit2: 4408; EPILOG-BLOCK-NEXT: ret i32 %shft 4409; EPILOG-BLOCK: loopexit1.loopexit: 4410; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4411; EPILOG-BLOCK-NEXT: br label %loopexit1 4412; EPILOG-BLOCK: loopexit1: 4413; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 4414; EPILOG-BLOCK-NEXT: ret i32 %sext3 4415; 4416; PROLOG-LABEL: @test7( 4417; PROLOG-NEXT: bb: 4418; PROLOG-NEXT: %i = icmp slt i32 undef, 2 4419; PROLOG-NEXT: %sext = sext i32 undef to i64 4420; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 4421; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4422; PROLOG: preheader: 4423; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 4424; PROLOG-NEXT: %1 = add nsw i64 %sext, -2 4425; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4426; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4427; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4428; PROLOG: header.prol.preheader: 4429; PROLOG-NEXT: br label %header.prol 4430; PROLOG: header.prol: 4431; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 4432; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4433; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 4434; PROLOG: latch.prol: 4435; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 4436; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 4437; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4438; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4439; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11 4440; PROLOG: header.prol.loopexit.unr-lcssa: 4441; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 4442; PROLOG-NEXT: br label %header.prol.loopexit 4443; PROLOG: header.prol.loopexit: 4444; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 4445; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4446; PROLOG-NEXT: br i1 %2, label %latchexit, label %preheader.new 4447; PROLOG: preheader.new: 4448; PROLOG-NEXT: br label %header 4449; PROLOG: header: 4450; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 4451; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4452; PROLOG: latch: 4453; PROLOG-NEXT: %add = add nuw nsw i64 %i6, 1 4454; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4455; PROLOG: latch.1: 4456; PROLOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4457; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4458; PROLOG: latch.2: 4459; PROLOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4460; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4461; PROLOG: latch.3: 4462; PROLOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4463; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4464; PROLOG: latch.4: 4465; PROLOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4466; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4467; PROLOG: latch.5: 4468; PROLOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4469; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4470; PROLOG: latch.6: 4471; PROLOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4472; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4473; PROLOG: latch.7: 4474; PROLOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4475; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 4476; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 4477; PROLOG: latchexit.unr-lcssa: 4478; PROLOG-NEXT: br label %latchexit 4479; PROLOG: latchexit: 4480; PROLOG-NEXT: unreachable 4481; PROLOG: loopexit2: 4482; PROLOG-NEXT: ret i32 %shft 4483; PROLOG: loopexit1.loopexit: 4484; 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 ] 4485; PROLOG-NEXT: br label %loopexit1 4486; PROLOG: loopexit1.loopexit1: 4487; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 4488; PROLOG-NEXT: br label %loopexit1 4489; PROLOG: loopexit1: 4490; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4491; PROLOG-NEXT: ret i32 %sext3 4492; 4493; PROLOG-BLOCK-LABEL: @test7( 4494; PROLOG-BLOCK-NEXT: bb: 4495; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4496; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4497; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4498; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4499; PROLOG-BLOCK: preheader: 4500; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4501; PROLOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4502; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4503; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4504; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4505; PROLOG-BLOCK: header.prol.preheader: 4506; PROLOG-BLOCK-NEXT: br label %header.prol 4507; PROLOG-BLOCK: header.prol: 4508; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 4509; PROLOG-BLOCK: latch.prol: 4510; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4511; PROLOG-BLOCK: header.prol.loopexit: 4512; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ] 4513; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4514; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %preheader.new 4515; PROLOG-BLOCK: preheader.new: 4516; PROLOG-BLOCK-NEXT: br label %header 4517; PROLOG-BLOCK: header: 4518; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 4519; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4520; PROLOG-BLOCK: latch: 4521; PROLOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4522; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4523; PROLOG-BLOCK: latch.1: 4524; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4525; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 4526; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11 4527; PROLOG-BLOCK: latchexit.unr-lcssa: 4528; PROLOG-BLOCK-NEXT: br label %latchexit 4529; PROLOG-BLOCK: latchexit: 4530; PROLOG-BLOCK-NEXT: unreachable 4531; PROLOG-BLOCK: loopexit2: 4532; PROLOG-BLOCK-NEXT: ret i32 %shft 4533; PROLOG-BLOCK: loopexit1.loopexit: 4534; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4535; PROLOG-BLOCK-NEXT: br label %loopexit1 4536; PROLOG-BLOCK: loopexit1: 4537; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 4538; PROLOG-BLOCK-NEXT: ret i32 %sext3 4539; 4540bb: 4541 %i = icmp slt i32 undef, 2 4542 %sext = sext i32 undef to i64 4543 %shft = ashr exact i32 %arg, 16 4544 br i1 %i, label %loopexit2, label %preheader 4545 4546preheader: ; preds = %bb2 4547 br label %header 4548 4549header: ; preds = %latch, %preheader 4550 %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4551 br i1 false, label %loopexit1, label %latch 4552 4553latch: ; preds = %header 4554 %add = add nuw nsw i64 %i6, 1 4555 %i9 = icmp slt i64 %add, %sext 4556 br i1 %i9, label %header, label %latchexit 4557 4558latchexit: ; preds = %latch 4559 unreachable 4560 4561loopexit2: ; preds = %bb2 4562 ret i32 %shft 4563 4564loopexit1: ; preds = %header 4565 %sext3 = phi i32 [ %shft, %header ] 4566 ret i32 %sext3 4567} 4568 4569; Nested loop and inner loop is unrolled. The tricky bit here is that 4570; several blocks in the inner loop fall out of the outer block when we 4571; use the epilogue block remainder strategy. 4572define void @test8() { 4573; EPILOG-LABEL: @test8( 4574; EPILOG-NEXT: bb: 4575; EPILOG-NEXT: br label %outerloop 4576; EPILOG: outerloop.loopexit.loopexit: 4577; EPILOG-NEXT: br label %outerloop.loopexit 4578; EPILOG: outerloop.loopexit.loopexit1: 4579; EPILOG-NEXT: br label %outerloop.loopexit 4580; EPILOG: outerloop.loopexit: 4581; EPILOG-NEXT: br label %outerloop 4582; EPILOG: outerloop: 4583; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4584; EPILOG-NEXT: %0 = sub i64 100, %i 4585; EPILOG-NEXT: %1 = sub i64 99, %i 4586; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4587; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4588; EPILOG-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4589; EPILOG: outerloop.new: 4590; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4591; EPILOG-NEXT: br label %innerH 4592; EPILOG: innerH: 4593; EPILOG-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ] 4594; EPILOG-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ] 4595; EPILOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4596; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4597; EPILOG: latch: 4598; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4599; EPILOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4600; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4601; EPILOG: latch.1: 4602; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 4603; EPILOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4604; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4605; EPILOG: latch.2: 4606; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 4607; EPILOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4608; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4609; EPILOG: latch.3: 4610; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 4611; EPILOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4612; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4613; EPILOG: latch.4: 4614; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 4615; EPILOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4616; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4617; EPILOG: latch.5: 4618; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 4619; EPILOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4620; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4621; EPILOG: latch.6: 4622; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 4623; EPILOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4624; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4625; EPILOG: latch.7: 4626; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 4627; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4628; EPILOG-NEXT: br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit 4629; EPILOG: exit.unr-lcssa.loopexit: 4630; EPILOG-NEXT: %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ] 4631; EPILOG-NEXT: br label %exit.unr-lcssa 4632; EPILOG: exit.unr-lcssa: 4633; EPILOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ] 4634; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4635; EPILOG-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4636; EPILOG: innerH.epil.preheader: 4637; EPILOG-NEXT: br label %innerH.epil 4638; EPILOG: innerH.epil: 4639; EPILOG-NEXT: %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ] 4640; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4641; EPILOG-NEXT: %i4.epil = add nuw nsw i64 %i3.epil, 1 4642; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil 4643; EPILOG: latch.epil: 4644; EPILOG-NEXT: %i6.epil = icmp ult i64 %i4.epil, 100 4645; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4646; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4647; EPILOG-NEXT: br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12 4648; EPILOG: exit.epilog-lcssa: 4649; EPILOG-NEXT: br label %exit 4650; EPILOG: exit.loopexit: 4651; EPILOG-NEXT: br label %exit 4652; EPILOG: exit: 4653; EPILOG-NEXT: ret void 4654; 4655; EPILOG-BLOCK-LABEL: @test8( 4656; EPILOG-BLOCK-NEXT: bb: 4657; EPILOG-BLOCK-NEXT: br label %outerloop 4658; EPILOG-BLOCK: outerloop.loopexit.loopexit: 4659; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit 4660; EPILOG-BLOCK: outerloop.loopexit: 4661; EPILOG-BLOCK-NEXT: br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1 4662; EPILOG-BLOCK: outerloop.new.1: 4663; EPILOG-BLOCK-NEXT: br label %innerH.1 4664; EPILOG-BLOCK: innerH.1: 4665; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4666; EPILOG-BLOCK-NEXT: %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 4667; EPILOG-BLOCK-NEXT: %i4.12 = add nuw nsw i64 %i3.1, 1 4668; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14 4669; EPILOG-BLOCK: latch.14: 4670; EPILOG-BLOCK-NEXT: %niter.next.13 = add nuw nsw i64 %niter.1, 1 4671; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.12, 1 4672; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4673; EPILOG-BLOCK: latch.1.1: 4674; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i64 %niter.next.13, 1 4675; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100 4676; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12 4677; EPILOG-BLOCK: exit.unr-lcssa.loopexit.1: 4678; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa.1 4679; EPILOG-BLOCK: outerloop.loopexit.loopexit.1: 4680; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4681; EPILOG-BLOCK: exit.unr-lcssa.1: 4682; EPILOG-BLOCK-NEXT: br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit 4683; EPILOG-BLOCK: innerH.epil.preheader.1: 4684; EPILOG-BLOCK-NEXT: br label %innerH.epil.1 4685; EPILOG-BLOCK: innerH.epil.1: 4686; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.epil 4687; EPILOG-BLOCK: outerloop.loopexit.1: 4688; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4689; EPILOG-BLOCK: outerloop: 4690; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4691; EPILOG-BLOCK-NEXT: %0 = sub i64 100, %i 4692; EPILOG-BLOCK-NEXT: %1 = sub i64 99, %i 4693; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4694; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4695; EPILOG-BLOCK-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4696; EPILOG-BLOCK: outerloop.new: 4697; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4698; EPILOG-BLOCK-NEXT: br label %innerH 4699; EPILOG-BLOCK: innerH: 4700; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ] 4701; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ] 4702; EPILOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4703; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4704; EPILOG-BLOCK: latch: 4705; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4706; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4707; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4708; EPILOG-BLOCK: latch.1: 4709; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 4710; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4711; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4712; EPILOG-BLOCK: exit.unr-lcssa.loopexit: 4713; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa 4714; EPILOG-BLOCK: exit.unr-lcssa: 4715; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4716; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4717; EPILOG-BLOCK: innerH.epil.preheader: 4718; EPILOG-BLOCK-NEXT: br label %innerH.epil 4719; EPILOG-BLOCK: innerH.epil: 4720; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.epil 4721; EPILOG-BLOCK: latch.epil: 4722; EPILOG-BLOCK-NEXT: br label %exit 4723; EPILOG-BLOCK: exit.loopexit: 4724; EPILOG-BLOCK-NEXT: br label %exit 4725; EPILOG-BLOCK: exit: 4726; EPILOG-BLOCK-NEXT: ret void 4727; 4728; PROLOG-LABEL: @test8( 4729; PROLOG-NEXT: bb: 4730; PROLOG-NEXT: br label %outerloop 4731; PROLOG: outerloop.loopexit.loopexit: 4732; PROLOG-NEXT: br label %outerloop.loopexit 4733; PROLOG: outerloop.loopexit.loopexit1: 4734; PROLOG-NEXT: br label %outerloop.loopexit 4735; PROLOG: outerloop.loopexit: 4736; PROLOG-NEXT: br label %outerloop 4737; PROLOG: outerloop: 4738; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4739; PROLOG-NEXT: %0 = sub i64 100, %i 4740; PROLOG-NEXT: %1 = sub i64 99, %i 4741; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4742; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4743; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4744; PROLOG: innerH.prol.preheader: 4745; PROLOG-NEXT: br label %innerH.prol 4746; PROLOG: innerH.prol: 4747; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 4748; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4749; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4750; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4751; PROLOG: latch.prol: 4752; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 4753; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4754; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4755; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12 4756; PROLOG: innerH.prol.loopexit.unr-lcssa: 4757; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4758; PROLOG-NEXT: br label %innerH.prol.loopexit 4759; PROLOG: innerH.prol.loopexit: 4760; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4761; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4762; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4763; PROLOG: outerloop.new: 4764; PROLOG-NEXT: br label %innerH 4765; PROLOG: innerH: 4766; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4767; PROLOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4768; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4769; PROLOG: latch: 4770; PROLOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4771; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4772; PROLOG: latch.1: 4773; PROLOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4774; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4775; PROLOG: latch.2: 4776; PROLOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4777; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4778; PROLOG: latch.3: 4779; PROLOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4780; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4781; PROLOG: latch.4: 4782; PROLOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4783; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4784; PROLOG: latch.5: 4785; PROLOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4786; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4787; PROLOG: latch.6: 4788; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4789; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4790; PROLOG: latch.7: 4791; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 4792; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4793; PROLOG: exit.unr-lcssa: 4794; PROLOG-NEXT: br label %exit 4795; PROLOG: exit.loopexit: 4796; PROLOG-NEXT: br label %exit 4797; PROLOG: exit: 4798; PROLOG-NEXT: ret void 4799; 4800; PROLOG-BLOCK-LABEL: @test8( 4801; PROLOG-BLOCK-NEXT: bb: 4802; PROLOG-BLOCK-NEXT: br label %outerloop 4803; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4804; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4805; PROLOG-BLOCK: outerloop.loopexit: 4806; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1 4807; PROLOG-BLOCK: innerH.prol.preheader.1: 4808; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4809; PROLOG-BLOCK: innerH.prol.1: 4810; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4811; PROLOG-BLOCK: latch.prol.1: 4812; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4813; PROLOG-BLOCK: innerH.prol.loopexit.1: 4814; PROLOG-BLOCK-NEXT: %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ] 4815; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4816; PROLOG-BLOCK: outerloop.new.1: 4817; PROLOG-BLOCK-NEXT: br label %innerH.1 4818; PROLOG-BLOCK: innerH.1: 4819; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4820; PROLOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4821; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4822; PROLOG-BLOCK: latch.12: 4823; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4824; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4825; PROLOG-BLOCK: latch.1.1: 4826; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4827; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12 4828; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4829; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4830; PROLOG-BLOCK: outerloop.loopexit.1: 4831; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4832; PROLOG-BLOCK: outerloop: 4833; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4834; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4835; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4836; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4837; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4838; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4839; PROLOG-BLOCK: innerH.prol.preheader: 4840; PROLOG-BLOCK-NEXT: br label %innerH.prol 4841; PROLOG-BLOCK: innerH.prol: 4842; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4843; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4844; PROLOG-BLOCK: latch.prol: 4845; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4846; PROLOG-BLOCK: innerH.prol.loopexit: 4847; PROLOG-BLOCK-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ] 4848; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4849; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4850; PROLOG-BLOCK: outerloop.new: 4851; PROLOG-BLOCK-NEXT: br label %innerH 4852; PROLOG-BLOCK: innerH: 4853; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ] 4854; PROLOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4855; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4856; PROLOG-BLOCK: latch: 4857; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4858; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4859; PROLOG-BLOCK: latch.1: 4860; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4861; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4862; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4863; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4864; PROLOG-BLOCK: exit.unr-lcssa.loopexit3: 4865; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4866; PROLOG-BLOCK: exit.unr-lcssa: 4867; PROLOG-BLOCK-NEXT: br label %exit 4868; PROLOG-BLOCK: exit.loopexit: 4869; PROLOG-BLOCK-NEXT: br label %exit 4870; PROLOG-BLOCK: exit: 4871; PROLOG-BLOCK-NEXT: ret void 4872; 4873 4874bb: 4875 br label %outerloop 4876 4877outerloop: ; preds = %innerH, %bb 4878 %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4879 br label %innerH 4880 4881innerH: ; preds = %latch, %outerloop 4882 %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4883 %i4 = add nuw nsw i64 %i3, 1 4884 br i1 false, label %outerloop, label %latch 4885 4886latch: ; preds = %innerH 4887 %i6 = icmp ult i64 %i4, 100 4888 br i1 %i6, label %innerH, label %exit 4889 4890exit: ; preds = %latch 4891 ret void 4892} 4893 4894declare i8 addrspace(1)* @foo(i32) 4895; inner loop prolog unrolled 4896; a value from outer loop is used in exit block of inner loop. 4897; Don't create VMap entries for such values (%trip). 4898define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { 4899; EPILOG-LABEL: @test9( 4900; EPILOG-NEXT: bb: 4901; EPILOG-NEXT: %0 = add i32 %n, -1 4902; EPILOG-NEXT: %1 = add i32 %n, -2 4903; EPILOG-NEXT: br label %outerloopHdr 4904; EPILOG: outerloopHdr: 4905; EPILOG-NEXT: %trip = add i32 %n, -1 4906; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4907; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4908; EPILOG: preheader: 4909; EPILOG-NEXT: %i4 = zext i32 0 to i64 4910; EPILOG-NEXT: %xtraiter = and i32 %0, 7 4911; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 4912; EPILOG-NEXT: br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 4913; EPILOG: preheader.new: 4914; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter 4915; EPILOG-NEXT: br label %header 4916; EPILOG: header: 4917; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ] 4918; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4919; EPILOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4920; EPILOG: innerexit.loopexit: 4921; 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 ] 4922; EPILOG-NEXT: br label %innerexit 4923; EPILOG: innerexit.loopexit1: 4924; EPILOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ] 4925; EPILOG-NEXT: br label %innerexit 4926; EPILOG: innerexit: 4927; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4928; EPILOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4929; EPILOG-NEXT: ret i8 addrspace(1)* %i9 4930; EPILOG: latch: 4931; EPILOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4932; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 4933; EPILOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4934; EPILOG: latch.1: 4935; EPILOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4936; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 4937; EPILOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4938; EPILOG: latch.2: 4939; EPILOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 4940; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 4941; EPILOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4942; EPILOG: latch.3: 4943; EPILOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 4944; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 4945; EPILOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4946; EPILOG: latch.4: 4947; EPILOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 4948; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 4949; EPILOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4950; EPILOG: latch.5: 4951; EPILOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 4952; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 4953; EPILOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4954; EPILOG: latch.6: 4955; EPILOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 4956; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 4957; EPILOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 4958; EPILOG: latch.7: 4959; EPILOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 4960; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 4961; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 4962; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit 4963; EPILOG: outerLatch.loopexit.unr-lcssa.loopexit: 4964; EPILOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ] 4965; EPILOG-NEXT: br label %outerLatch.loopexit.unr-lcssa 4966; EPILOG: outerLatch.loopexit.unr-lcssa: 4967; EPILOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ] 4968; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4969; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 4970; EPILOG: header.epil.preheader: 4971; EPILOG-NEXT: br label %header.epil 4972; EPILOG: header.epil: 4973; EPILOG-NEXT: %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ] 4974; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4975; EPILOG-NEXT: %i7.epil = trunc i64 %phi.epil to i32 4976; EPILOG-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 4977; EPILOG: latch.epil: 4978; EPILOG-NEXT: %i11.epil = add nsw i32 %i7.epil, 1 4979; EPILOG-NEXT: %innercnd.epil = icmp slt i32 %i11.epil, %trip 4980; EPILOG-NEXT: %iv.next.epil = add nuw nsw i64 %phi.epil, 1 4981; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 4982; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 4983; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13 4984; EPILOG: outerLatch.loopexit.epilog-lcssa: 4985; EPILOG-NEXT: br label %outerLatch.loopexit 4986; EPILOG: outerLatch.loopexit: 4987; EPILOG-NEXT: br label %outerLatch 4988; EPILOG: outerLatch: 4989; EPILOG-NEXT: br label %outerloopHdr 4990; 4991; EPILOG-BLOCK-LABEL: @test9( 4992; EPILOG-BLOCK-NEXT: bb: 4993; EPILOG-BLOCK-NEXT: %0 = add i32 %n, -1 4994; EPILOG-BLOCK-NEXT: %1 = add i32 %n, -2 4995; EPILOG-BLOCK-NEXT: br label %outerloopHdr 4996; EPILOG-BLOCK: outerloopHdr: 4997; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 4998; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4999; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5000; EPILOG-BLOCK: preheader: 5001; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 5002; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 5003; EPILOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 5004; EPILOG-BLOCK: preheader.new: 5005; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter 5006; EPILOG-BLOCK-NEXT: br label %header 5007; EPILOG-BLOCK: header: 5008; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ] 5009; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 5010; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5011; EPILOG-BLOCK: innerexit.loopexit.loopexit: 5012; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5013; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5014; EPILOG-BLOCK: innerexit.loopexit.loopexit6: 5015; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ] 5016; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5017; EPILOG-BLOCK: innerexit.loopexit: 5018; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ] 5019; EPILOG-BLOCK-NEXT: br label %innerexit 5020; EPILOG-BLOCK: innerexit.loopexit1: 5021; EPILOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ] 5022; EPILOG-BLOCK-NEXT: br label %innerexit 5023; EPILOG-BLOCK: innerexit: 5024; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5025; EPILOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5026; EPILOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5027; EPILOG-BLOCK: latch: 5028; EPILOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5029; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 5030; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5031; EPILOG-BLOCK: latch.1: 5032; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5033; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 5034; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 5035; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14 5036; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit: 5037; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa 5038; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5039; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5040; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 5041; EPILOG-BLOCK: header.epil.preheader: 5042; EPILOG-BLOCK-NEXT: br label %header.epil 5043; EPILOG-BLOCK: header.epil: 5044; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 5045; EPILOG-BLOCK: latch.epil: 5046; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit 5047; EPILOG-BLOCK: outerLatch.loopexit: 5048; EPILOG-BLOCK-NEXT: br label %outerLatch 5049; EPILOG-BLOCK: outerLatch: 5050; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5051; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5052; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5053; EPILOG-BLOCK: preheader.1: 5054; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 5055; EPILOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 5056; EPILOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 5057; EPILOG-BLOCK: preheader.new.1: 5058; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %0, %xtraiter.1 5059; EPILOG-BLOCK-NEXT: br label %header.1 5060; EPILOG-BLOCK: header.1: 5061; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5062; EPILOG-BLOCK-NEXT: %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 5063; EPILOG-BLOCK-NEXT: br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6 5064; EPILOG-BLOCK: latch.15: 5065; EPILOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5066; EPILOG-BLOCK-NEXT: %niter.next.14 = add nuw nsw i32 %niter.1, 1 5067; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6 5068; EPILOG-BLOCK: latch.1.1: 5069; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 5070; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i32 %niter.next.14, 1 5071; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1 5072; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14 5073; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit.1: 5074; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa.1 5075; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5076; EPILOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5077; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1 5078; EPILOG-BLOCK: header.epil.preheader.1: 5079; EPILOG-BLOCK-NEXT: br label %header.epil.1 5080; EPILOG-BLOCK: header.epil.1: 5081; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil.1, label %innerexit.loopexit1 5082; EPILOG-BLOCK: latch.epil.1: 5083; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5084; EPILOG-BLOCK: outerLatch.loopexit.1: 5085; EPILOG-BLOCK-NEXT: br label %outerLatch.1 5086; EPILOG-BLOCK: outerLatch.1: 5087; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5088; 5089; PROLOG-LABEL: @test9( 5090; PROLOG-NEXT: bb: 5091; PROLOG-NEXT: %0 = add i32 %n, -1 5092; PROLOG-NEXT: %1 = add i32 %n, -2 5093; PROLOG-NEXT: br label %outerloopHdr 5094; PROLOG: outerloopHdr: 5095; PROLOG-NEXT: %trip = add i32 %n, -1 5096; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 5097; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5098; PROLOG: preheader: 5099; PROLOG-NEXT: %i4 = zext i32 0 to i64 5100; PROLOG-NEXT: %xtraiter = and i32 %0, 7 5101; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5102; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5103; PROLOG: header.prol.preheader: 5104; PROLOG-NEXT: br label %header.prol 5105; PROLOG: header.prol: 5106; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 5107; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 5108; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 5109; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5110; PROLOG: latch.prol: 5111; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 5112; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 5113; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 5114; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 5115; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 5116; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13 5117; PROLOG: header.prol.loopexit.unr-lcssa: 5118; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 5119; PROLOG-NEXT: br label %header.prol.loopexit 5120; PROLOG: header.prol.loopexit: 5121; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 5122; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 5123; PROLOG-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 5124; PROLOG: preheader.new: 5125; PROLOG-NEXT: br label %header 5126; PROLOG: header: 5127; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 5128; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 5129; PROLOG: innerexit.loopexit: 5130; 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 ] 5131; PROLOG-NEXT: br label %innerexit 5132; PROLOG: innerexit.loopexit1: 5133; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 5134; PROLOG-NEXT: br label %innerexit 5135; PROLOG: innerexit: 5136; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5137; PROLOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5138; PROLOG-NEXT: ret i8 addrspace(1)* %i9 5139; PROLOG: latch: 5140; PROLOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5141; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 5142; PROLOG: latch.1: 5143; PROLOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5144; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 5145; PROLOG: latch.2: 5146; PROLOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 5147; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 5148; PROLOG: latch.3: 5149; PROLOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 5150; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 5151; PROLOG: latch.4: 5152; PROLOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 5153; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 5154; PROLOG: latch.5: 5155; PROLOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 5156; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 5157; PROLOG: latch.6: 5158; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 5159; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 5160; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 5161; PROLOG: latch.7: 5162; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 5163; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 5164; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 5165; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 5166; PROLOG: outerLatch.loopexit.unr-lcssa: 5167; PROLOG-NEXT: br label %outerLatch.loopexit 5168; PROLOG: outerLatch.loopexit: 5169; PROLOG-NEXT: br label %outerLatch 5170; PROLOG: outerLatch: 5171; PROLOG-NEXT: br label %outerloopHdr 5172; 5173; PROLOG-BLOCK-LABEL: @test9( 5174; PROLOG-BLOCK-NEXT: bb: 5175; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 5176; PROLOG-BLOCK-NEXT: %1 = add i32 %n, -2 5177; PROLOG-BLOCK-NEXT: br label %outerloopHdr 5178; PROLOG-BLOCK: outerloopHdr: 5179; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 5180; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 5181; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5182; PROLOG-BLOCK: preheader: 5183; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 5184; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5185; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5186; PROLOG-BLOCK: header.prol.preheader: 5187; PROLOG-BLOCK-NEXT: br label %header.prol 5188; PROLOG-BLOCK: header.prol: 5189; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5190; PROLOG-BLOCK: latch.prol: 5191; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 5192; PROLOG-BLOCK: header.prol.loopexit: 5193; PROLOG-BLOCK-NEXT: %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ] 5194; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 5195; PROLOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 5196; PROLOG-BLOCK: preheader.new: 5197; PROLOG-BLOCK-NEXT: br label %header 5198; PROLOG-BLOCK: header: 5199; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ] 5200; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5201; PROLOG-BLOCK: innerexit.loopexit.loopexit: 5202; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5203; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5204; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 5205; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 5206; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5207; PROLOG-BLOCK: innerexit.loopexit: 5208; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 5209; PROLOG-BLOCK-NEXT: br label %innerexit 5210; PROLOG-BLOCK: innerexit.loopexit1: 5211; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 5212; PROLOG-BLOCK-NEXT: br label %innerexit 5213; PROLOG-BLOCK: innerexit: 5214; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5215; PROLOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5216; PROLOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5217; PROLOG-BLOCK: latch: 5218; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5219; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 5220; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5221; PROLOG-BLOCK: latch.1: 5222; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 5223; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 5224; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5225; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14 5226; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5227; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 5228; PROLOG-BLOCK: outerLatch.loopexit: 5229; PROLOG-BLOCK-NEXT: br label %outerLatch 5230; PROLOG-BLOCK: outerLatch: 5231; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5232; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5233; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5234; PROLOG-BLOCK: preheader.1: 5235; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 5236; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5237; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1 5238; PROLOG-BLOCK: header.prol.preheader.1: 5239; PROLOG-BLOCK-NEXT: br label %header.prol.1 5240; PROLOG-BLOCK: header.prol.1: 5241; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 5242; PROLOG-BLOCK: latch.prol.1: 5243; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 5244; PROLOG-BLOCK: header.prol.loopexit.1: 5245; PROLOG-BLOCK-NEXT: %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ] 5246; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 5247; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1 5248; PROLOG-BLOCK: preheader.new.1: 5249; PROLOG-BLOCK-NEXT: br label %header.1 5250; PROLOG-BLOCK: header.1: 5251; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5252; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 5253; PROLOG-BLOCK: latch.14: 5254; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5255; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 5256; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 5257; PROLOG-BLOCK: latch.1.1: 5258; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 5259; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 5260; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 5261; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14 5262; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5263; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5264; PROLOG-BLOCK: outerLatch.loopexit.1: 5265; PROLOG-BLOCK-NEXT: br label %outerLatch.1 5266; PROLOG-BLOCK: outerLatch.1: 5267; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5268; 5269bb: 5270 br label %outerloopHdr 5271 5272outerloopHdr: ; preds = %outerLatch, %bb 5273 %trip = add i32 %n, -1 5274 %outercnd = icmp slt i32 0, %trip 5275 br i1 %outercnd, label %preheader, label %outerLatch 5276 5277preheader: ; preds = %outerloopHdr 5278 %i4 = zext i32 0 to i64 5279 br label %header 5280 5281header: ; preds = %latch, %preheader 5282 %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 5283 %i7 = trunc i64 %phi to i32 5284 br i1 true, label %latch, label %innerexit 5285 5286innerexit: ; preds = %header 5287 %i9 = call i8 addrspace(1)* @foo(i32 %trip) 5288 ret i8 addrspace(1)* %i9 5289 5290latch: ; preds = %header 5291 %i11 = add nsw i32 %i7, 1 5292 %innercnd = icmp slt i32 %i11, %trip 5293 %iv.next = add nuw nsw i64 %phi, 1 5294 br i1 %innercnd, label %header, label %outerLatch 5295 5296outerLatch: ; preds = %latch, %outerloopHdr 5297 br label %outerloopHdr 5298} 5299 5300declare void @bar() 5301 5302; This is a case where we should be able to eliminate N-1 copies 5303; of the early exit test in the main loop when runtime unrolling 5304; by N. 5305define void @test10(i64 %trip, i64 %trip2) { 5306; EPILOG-LABEL: @test10( 5307; EPILOG-NEXT: entry: 5308; EPILOG-NEXT: %0 = add i64 %trip, -1 5309; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5310; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5311; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5312; EPILOG: entry.new: 5313; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5314; EPILOG-NEXT: br label %loop_header 5315; EPILOG: loop_header: 5316; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5317; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5318; EPILOG-NEXT: call void @bar() 5319; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5320; EPILOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5321; EPILOG: loop_latch: 5322; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5323; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5324; EPILOG-NEXT: call void @bar() 5325; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5326; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5327; EPILOG: loop_latch.1: 5328; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5329; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5330; EPILOG-NEXT: call void @bar() 5331; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5332; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5333; EPILOG: loop_latch.2: 5334; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5335; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5336; EPILOG-NEXT: call void @bar() 5337; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5338; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5339; EPILOG: loop_latch.3: 5340; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5341; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5342; EPILOG-NEXT: call void @bar() 5343; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5344; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5345; EPILOG: loop_latch.4: 5346; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5347; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5348; EPILOG-NEXT: call void @bar() 5349; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5350; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5351; EPILOG: loop_latch.5: 5352; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5353; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5354; EPILOG-NEXT: call void @bar() 5355; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5356; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5357; EPILOG: loop_latch.6: 5358; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5359; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5360; EPILOG-NEXT: call void @bar() 5361; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5362; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5363; EPILOG: loop_latch.7: 5364; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5365; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5366; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5367; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5368; EPILOG: exit1.loopexit: 5369; EPILOG-NEXT: br label %exit1 5370; EPILOG: exit1.loopexit1: 5371; EPILOG-NEXT: br label %exit1 5372; EPILOG: exit1: 5373; EPILOG-NEXT: ret void 5374; EPILOG: exit2.unr-lcssa.loopexit: 5375; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5376; EPILOG-NEXT: br label %exit2.unr-lcssa 5377; EPILOG: exit2.unr-lcssa: 5378; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5379; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5380; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5381; EPILOG: loop_header.epil.preheader: 5382; EPILOG-NEXT: br label %loop_header.epil 5383; EPILOG: loop_header.epil: 5384; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5385; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5386; EPILOG-NEXT: call void @bar() 5387; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5388; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1 5389; EPILOG: loop_latch.epil: 5390; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5391; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5392; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5393; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5394; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14 5395; EPILOG: exit2.epilog-lcssa: 5396; EPILOG-NEXT: br label %exit2 5397; EPILOG: exit2: 5398; EPILOG-NEXT: ret void 5399; 5400; EPILOG-BLOCK-LABEL: @test10( 5401; EPILOG-BLOCK-NEXT: entry: 5402; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5403; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5404; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5405; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5406; EPILOG-BLOCK: entry.new: 5407; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5408; EPILOG-BLOCK-NEXT: br label %loop_header 5409; EPILOG-BLOCK: loop_header: 5410; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5411; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5412; EPILOG-BLOCK-NEXT: call void @bar() 5413; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5414; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5415; EPILOG-BLOCK: loop_latch: 5416; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5417; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5418; EPILOG-BLOCK-NEXT: call void @bar() 5419; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5420; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5421; EPILOG-BLOCK: loop_latch.1: 5422; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5423; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 5424; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5425; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16 5426; EPILOG-BLOCK: exit1.loopexit: 5427; EPILOG-BLOCK-NEXT: br label %exit1 5428; EPILOG-BLOCK: exit1: 5429; EPILOG-BLOCK-NEXT: ret void 5430; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5431; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 5432; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5433; EPILOG-BLOCK: exit2.unr-lcssa: 5434; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5435; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5436; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5437; EPILOG-BLOCK: loop_header.epil.preheader: 5438; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5439; EPILOG-BLOCK: loop_header.epil: 5440; EPILOG-BLOCK-NEXT: call void @bar() 5441; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 5442; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1 5443; EPILOG-BLOCK: loop_latch.epil: 5444; EPILOG-BLOCK-NEXT: br label %exit2 5445; EPILOG-BLOCK: exit2: 5446; EPILOG-BLOCK-NEXT: ret void 5447; 5448; PROLOG-LABEL: @test10( 5449; PROLOG-NEXT: entry: 5450; PROLOG-NEXT: %0 = add i64 %trip, -1 5451; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 5452; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5453; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5454; PROLOG: loop_header.prol.preheader: 5455; PROLOG-NEXT: br label %loop_header.prol 5456; PROLOG: loop_header.prol: 5457; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5458; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5459; PROLOG-NEXT: call void @bar() 5460; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 5461; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1 5462; PROLOG: loop_latch.prol: 5463; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5464; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5465; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5466; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5467; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14 5468; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5469; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5470; PROLOG-NEXT: br label %loop_header.prol.loopexit 5471; PROLOG: loop_header.prol.loopexit: 5472; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5473; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 5474; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new 5475; PROLOG: entry.new: 5476; PROLOG-NEXT: br label %loop_header 5477; PROLOG: loop_header: 5478; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5479; PROLOG-NEXT: call void @bar() 5480; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5481; PROLOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5482; PROLOG: loop_latch: 5483; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5484; PROLOG-NEXT: call void @bar() 5485; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5486; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5487; PROLOG: loop_latch.1: 5488; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5489; PROLOG-NEXT: call void @bar() 5490; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5491; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5492; PROLOG: loop_latch.2: 5493; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5494; PROLOG-NEXT: call void @bar() 5495; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5496; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5497; PROLOG: loop_latch.3: 5498; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5499; PROLOG-NEXT: call void @bar() 5500; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5501; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5502; PROLOG: loop_latch.4: 5503; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5504; PROLOG-NEXT: call void @bar() 5505; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5506; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5507; PROLOG: loop_latch.5: 5508; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5509; PROLOG-NEXT: call void @bar() 5510; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5511; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5512; PROLOG: loop_latch.6: 5513; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5514; PROLOG-NEXT: call void @bar() 5515; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5516; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5517; PROLOG: loop_latch.7: 5518; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5519; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5520; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5521; PROLOG: exit1.loopexit: 5522; PROLOG-NEXT: br label %exit1 5523; PROLOG: exit1.loopexit1: 5524; PROLOG-NEXT: br label %exit1 5525; PROLOG: exit1: 5526; PROLOG-NEXT: ret void 5527; PROLOG: exit2.unr-lcssa: 5528; PROLOG-NEXT: br label %exit2 5529; PROLOG: exit2: 5530; PROLOG-NEXT: ret void 5531; 5532; PROLOG-BLOCK-LABEL: @test10( 5533; PROLOG-BLOCK-NEXT: entry: 5534; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5535; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5536; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5537; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5538; PROLOG-BLOCK: loop_header.prol.preheader: 5539; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5540; PROLOG-BLOCK: loop_header.prol: 5541; PROLOG-BLOCK-NEXT: call void @bar() 5542; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 5543; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1 5544; PROLOG-BLOCK: loop_latch.prol: 5545; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5546; PROLOG-BLOCK: loop_header.prol.loopexit: 5547; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5548; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5549; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new 5550; PROLOG-BLOCK: entry.new: 5551; PROLOG-BLOCK-NEXT: br label %loop_header 5552; PROLOG-BLOCK: loop_header: 5553; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5554; PROLOG-BLOCK-NEXT: call void @bar() 5555; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5556; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5557; PROLOG-BLOCK: loop_latch: 5558; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5559; PROLOG-BLOCK-NEXT: call void @bar() 5560; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5561; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5562; PROLOG-BLOCK: loop_latch.1: 5563; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5564; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5565; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16 5566; PROLOG-BLOCK: exit1.loopexit: 5567; PROLOG-BLOCK-NEXT: br label %exit1 5568; PROLOG-BLOCK: exit1: 5569; PROLOG-BLOCK-NEXT: ret void 5570; PROLOG-BLOCK: exit2.unr-lcssa: 5571; PROLOG-BLOCK-NEXT: br label %exit2 5572; PROLOG-BLOCK: exit2: 5573; PROLOG-BLOCK-NEXT: ret void 5574; 5575entry: 5576 br label %loop_header 5577 5578loop_header: 5579 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5580 call void @bar() 5581 %cmp_early = icmp ne i64 %iv, %trip2 5582 br i1 %cmp_early, label %loop_latch, label %exit1 5583 5584loop_latch: 5585 %iv_next = add i64 %iv, 1 5586 %cmp = icmp ne i64 %iv_next, %trip 5587 br i1 %cmp, label %loop_header, label %exit2 5588 5589exit1: 5590 ret void 5591 5592exit2: 5593 ret void 5594} 5595 5596; With a loop invariant, we can eliminate the last N-1 5597; copies of the exit test in the unrolled main loop body. 5598define void @test11(i64 %trip, i1 %cond) { 5599; EPILOG-LABEL: @test11( 5600; EPILOG-NEXT: entry: 5601; EPILOG-NEXT: %0 = add i64 %trip, -1 5602; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5603; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5604; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5605; EPILOG: entry.new: 5606; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5607; EPILOG-NEXT: br label %loop_header 5608; EPILOG: loop_header: 5609; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5610; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5611; EPILOG-NEXT: call void @bar() 5612; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5613; EPILOG: loop_latch: 5614; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5615; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5616; EPILOG-NEXT: call void @bar() 5617; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5618; EPILOG: loop_latch.1: 5619; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5620; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5621; EPILOG-NEXT: call void @bar() 5622; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5623; EPILOG: loop_latch.2: 5624; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5625; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5626; EPILOG-NEXT: call void @bar() 5627; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5628; EPILOG: loop_latch.3: 5629; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5630; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5631; EPILOG-NEXT: call void @bar() 5632; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5633; EPILOG: loop_latch.4: 5634; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5635; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5636; EPILOG-NEXT: call void @bar() 5637; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5638; EPILOG: loop_latch.5: 5639; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5640; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5641; EPILOG-NEXT: call void @bar() 5642; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5643; EPILOG: loop_latch.6: 5644; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5645; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5646; EPILOG-NEXT: call void @bar() 5647; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5648; EPILOG: loop_latch.7: 5649; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5650; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5651; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5652; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5653; EPILOG: exit1.loopexit: 5654; EPILOG-NEXT: br label %exit1 5655; EPILOG: exit1.loopexit1: 5656; EPILOG-NEXT: br label %exit1 5657; EPILOG: exit1: 5658; EPILOG-NEXT: ret void 5659; EPILOG: exit2.unr-lcssa.loopexit: 5660; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5661; EPILOG-NEXT: br label %exit2.unr-lcssa 5662; EPILOG: exit2.unr-lcssa: 5663; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5664; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5665; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5666; EPILOG: loop_header.epil.preheader: 5667; EPILOG-NEXT: br label %loop_header.epil 5668; EPILOG: loop_header.epil: 5669; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5670; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5671; EPILOG-NEXT: call void @bar() 5672; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1 5673; EPILOG: loop_latch.epil: 5674; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5675; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5676; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5677; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5678; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15 5679; EPILOG: exit2.epilog-lcssa: 5680; EPILOG-NEXT: br label %exit2 5681; EPILOG: exit2: 5682; EPILOG-NEXT: ret void 5683; 5684; EPILOG-BLOCK-LABEL: @test11( 5685; EPILOG-BLOCK-NEXT: entry: 5686; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5687; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5688; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5689; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5690; EPILOG-BLOCK: entry.new: 5691; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5692; EPILOG-BLOCK-NEXT: br label %loop_header 5693; EPILOG-BLOCK: loop_header: 5694; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5695; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5696; EPILOG-BLOCK-NEXT: call void @bar() 5697; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5698; EPILOG-BLOCK: loop_latch: 5699; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5700; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5701; EPILOG-BLOCK-NEXT: call void @bar() 5702; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5703; EPILOG-BLOCK: loop_latch.1: 5704; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5705; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 5706; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5707; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17 5708; EPILOG-BLOCK: exit1.loopexit: 5709; EPILOG-BLOCK-NEXT: br label %exit1 5710; EPILOG-BLOCK: exit1: 5711; EPILOG-BLOCK-NEXT: ret void 5712; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5713; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5714; EPILOG-BLOCK: exit2.unr-lcssa: 5715; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5716; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5717; EPILOG-BLOCK: loop_header.epil.preheader: 5718; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5719; EPILOG-BLOCK: loop_header.epil: 5720; EPILOG-BLOCK-NEXT: call void @bar() 5721; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1 5722; EPILOG-BLOCK: loop_latch.epil: 5723; EPILOG-BLOCK-NEXT: br label %exit2 5724; EPILOG-BLOCK: exit2: 5725; EPILOG-BLOCK-NEXT: ret void 5726; 5727; PROLOG-LABEL: @test11( 5728; PROLOG-NEXT: entry: 5729; PROLOG-NEXT: %0 = add i64 %trip, -1 5730; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 5731; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5732; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5733; PROLOG: loop_header.prol.preheader: 5734; PROLOG-NEXT: br label %loop_header.prol 5735; PROLOG: loop_header.prol: 5736; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5737; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5738; PROLOG-NEXT: call void @bar() 5739; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1 5740; PROLOG: loop_latch.prol: 5741; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5742; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5743; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5744; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5745; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15 5746; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5747; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5748; PROLOG-NEXT: br label %loop_header.prol.loopexit 5749; PROLOG: loop_header.prol.loopexit: 5750; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5751; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 5752; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new 5753; PROLOG: entry.new: 5754; PROLOG-NEXT: br label %loop_header 5755; PROLOG: loop_header: 5756; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5757; PROLOG-NEXT: call void @bar() 5758; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5759; PROLOG: loop_latch: 5760; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5761; PROLOG-NEXT: call void @bar() 5762; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5763; PROLOG: loop_latch.1: 5764; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5765; PROLOG-NEXT: call void @bar() 5766; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5767; PROLOG: loop_latch.2: 5768; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5769; PROLOG-NEXT: call void @bar() 5770; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5771; PROLOG: loop_latch.3: 5772; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5773; PROLOG-NEXT: call void @bar() 5774; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5775; PROLOG: loop_latch.4: 5776; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5777; PROLOG-NEXT: call void @bar() 5778; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5779; PROLOG: loop_latch.5: 5780; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5781; PROLOG-NEXT: call void @bar() 5782; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5783; PROLOG: loop_latch.6: 5784; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5785; PROLOG-NEXT: call void @bar() 5786; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5787; PROLOG: loop_latch.7: 5788; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5789; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5790; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5791; PROLOG: exit1.loopexit: 5792; PROLOG-NEXT: br label %exit1 5793; PROLOG: exit1.loopexit1: 5794; PROLOG-NEXT: br label %exit1 5795; PROLOG: exit1: 5796; PROLOG-NEXT: ret void 5797; PROLOG: exit2.unr-lcssa: 5798; PROLOG-NEXT: br label %exit2 5799; PROLOG: exit2: 5800; PROLOG-NEXT: ret void 5801; 5802; PROLOG-BLOCK-LABEL: @test11( 5803; PROLOG-BLOCK-NEXT: entry: 5804; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5805; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5806; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5807; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5808; PROLOG-BLOCK: loop_header.prol.preheader: 5809; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5810; PROLOG-BLOCK: loop_header.prol: 5811; PROLOG-BLOCK-NEXT: call void @bar() 5812; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1 5813; PROLOG-BLOCK: loop_latch.prol: 5814; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5815; PROLOG-BLOCK: loop_header.prol.loopexit: 5816; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5817; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5818; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new 5819; PROLOG-BLOCK: entry.new: 5820; PROLOG-BLOCK-NEXT: br label %loop_header 5821; PROLOG-BLOCK: loop_header: 5822; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5823; PROLOG-BLOCK-NEXT: call void @bar() 5824; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5825; PROLOG-BLOCK: loop_latch: 5826; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5827; PROLOG-BLOCK-NEXT: call void @bar() 5828; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5829; PROLOG-BLOCK: loop_latch.1: 5830; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5831; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5832; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17 5833; PROLOG-BLOCK: exit1.loopexit: 5834; PROLOG-BLOCK-NEXT: br label %exit1 5835; PROLOG-BLOCK: exit1: 5836; PROLOG-BLOCK-NEXT: ret void 5837; PROLOG-BLOCK: exit2.unr-lcssa: 5838; PROLOG-BLOCK-NEXT: br label %exit2 5839; PROLOG-BLOCK: exit2: 5840; PROLOG-BLOCK-NEXT: ret void 5841; 5842entry: 5843 br label %loop_header 5844 5845loop_header: 5846 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5847 call void @bar() 5848 br i1 %cond, label %loop_latch, label %exit1 5849 5850loop_latch: 5851 %iv_next = add i64 %iv, 1 5852 %cmp = icmp ne i64 %iv_next, %trip 5853 br i1 %cmp, label %loop_header, label %exit2 5854 5855exit1: 5856 ret void 5857 5858exit2: 5859 ret void 5860} 5861 5862; Combine a computeable and invariant test to make sure 5863; the interaction of both doesn't do anything weird 5864define void @test12(i64 %trip, i64 %trip2, i1 %cond) { 5865; EPILOG-LABEL: @test12( 5866; EPILOG-NEXT: entry: 5867; EPILOG-NEXT: %0 = add i64 %trip, -1 5868; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5869; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5870; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 5871; EPILOG: entry.new: 5872; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5873; EPILOG-NEXT: br label %loop_header 5874; EPILOG: loop_header: 5875; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5876; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5877; EPILOG-NEXT: call void @bar() 5878; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5879; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5880; EPILOG: loop_exiting_bb2: 5881; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5882; EPILOG: loop_latch: 5883; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5884; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5885; EPILOG-NEXT: call void @bar() 5886; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5887; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5888; EPILOG: loop_exiting_bb2.1: 5889; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5890; EPILOG: loop_latch.1: 5891; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5892; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5893; EPILOG-NEXT: call void @bar() 5894; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5895; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 5896; EPILOG: loop_exiting_bb2.2: 5897; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 5898; EPILOG: loop_latch.2: 5899; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5900; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5901; EPILOG-NEXT: call void @bar() 5902; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5903; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 5904; EPILOG: loop_exiting_bb2.3: 5905; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 5906; EPILOG: loop_latch.3: 5907; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5908; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5909; EPILOG-NEXT: call void @bar() 5910; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5911; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 5912; EPILOG: loop_exiting_bb2.4: 5913; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 5914; EPILOG: loop_latch.4: 5915; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5916; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5917; EPILOG-NEXT: call void @bar() 5918; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5919; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 5920; EPILOG: loop_exiting_bb2.5: 5921; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 5922; EPILOG: loop_latch.5: 5923; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5924; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5925; EPILOG-NEXT: call void @bar() 5926; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5927; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 5928; EPILOG: loop_exiting_bb2.6: 5929; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 5930; EPILOG: loop_latch.6: 5931; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5932; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5933; EPILOG-NEXT: call void @bar() 5934; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5935; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 5936; EPILOG: loop_exiting_bb2.7: 5937; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 5938; EPILOG: loop_latch.7: 5939; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5940; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5941; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5942; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 5943; EPILOG: exit1.unr-lcssa.loopexit: 5944; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5945; EPILOG-NEXT: br label %exit1.unr-lcssa 5946; EPILOG: exit1.unr-lcssa: 5947; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 5948; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5949; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 5950; EPILOG: loop_header.epil.preheader: 5951; EPILOG-NEXT: br label %loop_header.epil 5952; EPILOG: loop_header.epil: 5953; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5954; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5955; EPILOG-NEXT: call void @bar() 5956; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5957; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 5958; EPILOG: loop_exiting_bb2.epil: 5959; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 5960; EPILOG: loop_latch.epil: 5961; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5962; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5963; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5964; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5965; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16 5966; EPILOG: exit1.epilog-lcssa.loopexit: 5967; EPILOG-NEXT: br label %exit1.epilog-lcssa 5968; EPILOG: exit1.epilog-lcssa.loopexit1: 5969; EPILOG-NEXT: br label %exit1.epilog-lcssa 5970; EPILOG: exit1.epilog-lcssa: 5971; EPILOG-NEXT: br label %exit1 5972; EPILOG: exit1: 5973; EPILOG-NEXT: ret void 5974; 5975; EPILOG-BLOCK-LABEL: @test12( 5976; EPILOG-BLOCK-NEXT: entry: 5977; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5978; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5979; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5980; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 5981; EPILOG-BLOCK: entry.new: 5982; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5983; EPILOG-BLOCK-NEXT: br label %loop_header 5984; EPILOG-BLOCK: loop_header: 5985; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5986; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5987; EPILOG-BLOCK-NEXT: call void @bar() 5988; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5989; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5990; EPILOG-BLOCK: loop_exiting_bb2: 5991; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5992; EPILOG-BLOCK: loop_latch: 5993; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5994; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5995; EPILOG-BLOCK-NEXT: call void @bar() 5996; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5997; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5998; EPILOG-BLOCK: loop_exiting_bb2.1: 5999; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6000; EPILOG-BLOCK: loop_latch.1: 6001; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6002; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6003; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6004; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6005; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6006; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6007; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6008; EPILOG-BLOCK: exit1.unr-lcssa: 6009; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6010; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6011; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6012; EPILOG-BLOCK: loop_header.epil.preheader: 6013; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6014; EPILOG-BLOCK: loop_header.epil: 6015; EPILOG-BLOCK-NEXT: call void @bar() 6016; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6017; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6018; EPILOG-BLOCK: loop_exiting_bb2.epil: 6019; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa 6020; EPILOG-BLOCK: loop_latch.epil: 6021; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6022; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6023; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6024; EPILOG-BLOCK: exit1.epilog-lcssa: 6025; EPILOG-BLOCK-NEXT: br label %exit1 6026; EPILOG-BLOCK: exit1: 6027; EPILOG-BLOCK-NEXT: ret void 6028; 6029; PROLOG-LABEL: @test12( 6030; PROLOG-NEXT: entry: 6031; PROLOG-NEXT: %0 = add i64 %trip, -1 6032; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6033; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6034; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6035; PROLOG: loop_header.prol.preheader: 6036; PROLOG-NEXT: br label %loop_header.prol 6037; PROLOG: loop_header.prol: 6038; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6039; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6040; PROLOG-NEXT: call void @bar() 6041; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6042; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6043; PROLOG: loop_exiting_bb2.prol: 6044; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6045; PROLOG: loop_latch.prol: 6046; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6047; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6048; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6049; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6050; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16 6051; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6052; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6053; PROLOG-NEXT: br label %loop_header.prol.loopexit 6054; PROLOG: loop_header.prol.loopexit: 6055; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6056; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6057; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6058; PROLOG: entry.new: 6059; PROLOG-NEXT: br label %loop_header 6060; PROLOG: loop_header: 6061; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6062; PROLOG-NEXT: call void @bar() 6063; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6064; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6065; PROLOG: loop_exiting_bb2: 6066; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6067; PROLOG: loop_latch: 6068; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6069; PROLOG-NEXT: call void @bar() 6070; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6071; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6072; PROLOG: loop_exiting_bb2.1: 6073; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6074; PROLOG: loop_latch.1: 6075; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6076; PROLOG-NEXT: call void @bar() 6077; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6078; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6079; PROLOG: loop_exiting_bb2.2: 6080; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6081; PROLOG: loop_latch.2: 6082; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6083; PROLOG-NEXT: call void @bar() 6084; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6085; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6086; PROLOG: loop_exiting_bb2.3: 6087; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6088; PROLOG: loop_latch.3: 6089; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6090; PROLOG-NEXT: call void @bar() 6091; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6092; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6093; PROLOG: loop_exiting_bb2.4: 6094; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6095; PROLOG: loop_latch.4: 6096; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6097; PROLOG-NEXT: call void @bar() 6098; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6099; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6100; PROLOG: loop_exiting_bb2.5: 6101; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6102; PROLOG: loop_latch.5: 6103; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6104; PROLOG-NEXT: call void @bar() 6105; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6106; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6107; PROLOG: loop_exiting_bb2.6: 6108; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6109; PROLOG: loop_latch.6: 6110; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6111; PROLOG-NEXT: call void @bar() 6112; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6113; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6114; PROLOG: loop_exiting_bb2.7: 6115; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6116; PROLOG: loop_latch.7: 6117; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6118; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6119; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6120; PROLOG: exit1.unr-lcssa.loopexit: 6121; PROLOG-NEXT: br label %exit1.unr-lcssa 6122; PROLOG: exit1.unr-lcssa.loopexit1: 6123; PROLOG-NEXT: br label %exit1.unr-lcssa 6124; PROLOG: exit1.unr-lcssa: 6125; PROLOG-NEXT: br label %exit1 6126; PROLOG: exit1: 6127; PROLOG-NEXT: ret void 6128; 6129; PROLOG-BLOCK-LABEL: @test12( 6130; PROLOG-BLOCK-NEXT: entry: 6131; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6132; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6133; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6134; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6135; PROLOG-BLOCK: loop_header.prol.preheader: 6136; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6137; PROLOG-BLOCK: loop_header.prol: 6138; PROLOG-BLOCK-NEXT: call void @bar() 6139; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6140; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6141; PROLOG-BLOCK: loop_exiting_bb2.prol: 6142; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa 6143; PROLOG-BLOCK: loop_latch.prol: 6144; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6145; PROLOG-BLOCK: loop_header.prol.loopexit: 6146; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6147; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6148; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6149; PROLOG-BLOCK: entry.new: 6150; PROLOG-BLOCK-NEXT: br label %loop_header 6151; PROLOG-BLOCK: loop_header: 6152; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6153; PROLOG-BLOCK-NEXT: call void @bar() 6154; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6155; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6156; PROLOG-BLOCK: loop_exiting_bb2: 6157; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6158; PROLOG-BLOCK: loop_latch: 6159; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6160; PROLOG-BLOCK-NEXT: call void @bar() 6161; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6162; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6163; PROLOG-BLOCK: loop_exiting_bb2.1: 6164; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6165; PROLOG-BLOCK: loop_latch.1: 6166; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6167; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6168; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6169; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6170; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6171; PROLOG-BLOCK: exit1.unr-lcssa: 6172; PROLOG-BLOCK-NEXT: br label %exit1 6173; PROLOG-BLOCK: exit1: 6174; PROLOG-BLOCK-NEXT: ret void 6175; 6176entry: 6177 br label %loop_header 6178 6179loop_header: 6180 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6181 call void @bar() 6182 %cmp_early = icmp ne i64 %iv, %trip2 6183 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6184 6185loop_exiting_bb2: 6186 br i1 %cond, label %loop_latch, label %exit1 6187 6188loop_latch: 6189 %iv_next = add i64 %iv, 1 6190 %cmp = icmp ne i64 %iv_next, %trip 6191 br i1 %cmp, label %loop_header, label %exit1 6192 6193exit1: 6194 ret void 6195} 6196 6197declare i1 @unknown_cond() 6198 6199; Mix of computable and uncompatable exits 6200define void @test13(i64 %trip, i64 %trip2) { 6201; EPILOG-LABEL: @test13( 6202; EPILOG-NEXT: entry: 6203; EPILOG-NEXT: %0 = add i64 %trip, -1 6204; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 6205; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 6206; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6207; EPILOG: entry.new: 6208; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6209; EPILOG-NEXT: br label %loop_header 6210; EPILOG: loop_header: 6211; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6212; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6213; EPILOG-NEXT: call void @bar() 6214; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6215; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6216; EPILOG: loop_exiting_bb2: 6217; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6218; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6219; EPILOG: loop_latch: 6220; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6221; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6222; EPILOG-NEXT: call void @bar() 6223; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6224; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6225; EPILOG: loop_exiting_bb2.1: 6226; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6227; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6228; EPILOG: loop_latch.1: 6229; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 6230; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6231; EPILOG-NEXT: call void @bar() 6232; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6233; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6234; EPILOG: loop_exiting_bb2.2: 6235; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6236; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6237; EPILOG: loop_latch.2: 6238; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 6239; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6240; EPILOG-NEXT: call void @bar() 6241; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6242; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6243; EPILOG: loop_exiting_bb2.3: 6244; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6245; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6246; EPILOG: loop_latch.3: 6247; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 6248; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6249; EPILOG-NEXT: call void @bar() 6250; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6251; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6252; EPILOG: loop_exiting_bb2.4: 6253; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6254; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6255; EPILOG: loop_latch.4: 6256; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 6257; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6258; EPILOG-NEXT: call void @bar() 6259; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6260; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6261; EPILOG: loop_exiting_bb2.5: 6262; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6263; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6264; EPILOG: loop_latch.5: 6265; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 6266; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6267; EPILOG-NEXT: call void @bar() 6268; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6269; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6270; EPILOG: loop_exiting_bb2.6: 6271; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6272; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6273; EPILOG: loop_latch.6: 6274; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 6275; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6276; EPILOG-NEXT: call void @bar() 6277; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6278; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6279; EPILOG: loop_exiting_bb2.7: 6280; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6281; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6282; EPILOG: loop_latch.7: 6283; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6284; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 6285; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6286; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6287; EPILOG: exit1.unr-lcssa.loopexit: 6288; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6289; EPILOG-NEXT: br label %exit1.unr-lcssa 6290; EPILOG: exit1.unr-lcssa: 6291; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6292; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6293; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6294; EPILOG: loop_header.epil.preheader: 6295; EPILOG-NEXT: br label %loop_header.epil 6296; EPILOG: loop_header.epil: 6297; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6298; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6299; EPILOG-NEXT: call void @bar() 6300; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 6301; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6302; EPILOG: loop_exiting_bb2.epil: 6303; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6304; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6305; EPILOG: loop_latch.epil: 6306; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6307; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6308; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6309; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6310; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17 6311; EPILOG: exit1.epilog-lcssa.loopexit: 6312; EPILOG-NEXT: br label %exit1.epilog-lcssa 6313; EPILOG: exit1.epilog-lcssa.loopexit1: 6314; EPILOG-NEXT: br label %exit1.epilog-lcssa 6315; EPILOG: exit1.epilog-lcssa: 6316; EPILOG-NEXT: br label %exit1 6317; EPILOG: exit1: 6318; EPILOG-NEXT: ret void 6319; 6320; EPILOG-BLOCK-LABEL: @test13( 6321; EPILOG-BLOCK-NEXT: entry: 6322; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6323; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6324; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6325; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6326; EPILOG-BLOCK: entry.new: 6327; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6328; EPILOG-BLOCK-NEXT: br label %loop_header 6329; EPILOG-BLOCK: loop_header: 6330; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6331; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6332; EPILOG-BLOCK-NEXT: call void @bar() 6333; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6334; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6335; EPILOG-BLOCK: loop_exiting_bb2: 6336; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6337; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6338; EPILOG-BLOCK: loop_latch: 6339; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6340; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6341; EPILOG-BLOCK-NEXT: call void @bar() 6342; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6343; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6344; EPILOG-BLOCK: loop_exiting_bb2.1: 6345; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6346; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6347; EPILOG-BLOCK: loop_latch.1: 6348; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6349; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6350; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6351; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6352; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6353; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6354; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6355; EPILOG-BLOCK: exit1.unr-lcssa: 6356; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6357; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6358; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6359; EPILOG-BLOCK: loop_header.epil.preheader: 6360; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6361; EPILOG-BLOCK: loop_header.epil: 6362; EPILOG-BLOCK-NEXT: call void @bar() 6363; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6364; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6365; EPILOG-BLOCK: loop_exiting_bb2.epil: 6366; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6367; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6368; EPILOG-BLOCK: loop_latch.epil: 6369; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6370; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6371; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6372; EPILOG-BLOCK: exit1.epilog-lcssa: 6373; EPILOG-BLOCK-NEXT: br label %exit1 6374; EPILOG-BLOCK: exit1: 6375; EPILOG-BLOCK-NEXT: ret void 6376; 6377; PROLOG-LABEL: @test13( 6378; PROLOG-NEXT: entry: 6379; PROLOG-NEXT: %0 = add i64 %trip, -1 6380; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6381; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6382; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6383; PROLOG: loop_header.prol.preheader: 6384; PROLOG-NEXT: br label %loop_header.prol 6385; PROLOG: loop_header.prol: 6386; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6387; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6388; PROLOG-NEXT: call void @bar() 6389; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6390; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6391; PROLOG: loop_exiting_bb2.prol: 6392; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6393; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6394; PROLOG: loop_latch.prol: 6395; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6396; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6397; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6398; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6399; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17 6400; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6401; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6402; PROLOG-NEXT: br label %loop_header.prol.loopexit 6403; PROLOG: loop_header.prol.loopexit: 6404; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6405; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6406; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6407; PROLOG: entry.new: 6408; PROLOG-NEXT: br label %loop_header 6409; PROLOG: loop_header: 6410; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6411; PROLOG-NEXT: call void @bar() 6412; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6413; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6414; PROLOG: loop_exiting_bb2: 6415; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6416; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6417; PROLOG: loop_latch: 6418; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6419; PROLOG-NEXT: call void @bar() 6420; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6421; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6422; PROLOG: loop_exiting_bb2.1: 6423; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6424; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6425; PROLOG: loop_latch.1: 6426; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6427; PROLOG-NEXT: call void @bar() 6428; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6429; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6430; PROLOG: loop_exiting_bb2.2: 6431; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6432; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6433; PROLOG: loop_latch.2: 6434; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6435; PROLOG-NEXT: call void @bar() 6436; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6437; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6438; PROLOG: loop_exiting_bb2.3: 6439; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6440; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6441; PROLOG: loop_latch.3: 6442; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6443; PROLOG-NEXT: call void @bar() 6444; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6445; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6446; PROLOG: loop_exiting_bb2.4: 6447; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6448; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6449; PROLOG: loop_latch.4: 6450; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6451; PROLOG-NEXT: call void @bar() 6452; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6453; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6454; PROLOG: loop_exiting_bb2.5: 6455; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6456; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6457; PROLOG: loop_latch.5: 6458; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6459; PROLOG-NEXT: call void @bar() 6460; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6461; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6462; PROLOG: loop_exiting_bb2.6: 6463; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6464; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6465; PROLOG: loop_latch.6: 6466; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6467; PROLOG-NEXT: call void @bar() 6468; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6469; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6470; PROLOG: loop_exiting_bb2.7: 6471; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6472; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6473; PROLOG: loop_latch.7: 6474; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6475; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6476; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6477; PROLOG: exit1.unr-lcssa.loopexit: 6478; PROLOG-NEXT: br label %exit1.unr-lcssa 6479; PROLOG: exit1.unr-lcssa.loopexit1: 6480; PROLOG-NEXT: br label %exit1.unr-lcssa 6481; PROLOG: exit1.unr-lcssa: 6482; PROLOG-NEXT: br label %exit1 6483; PROLOG: exit1: 6484; PROLOG-NEXT: ret void 6485; 6486; PROLOG-BLOCK-LABEL: @test13( 6487; PROLOG-BLOCK-NEXT: entry: 6488; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6489; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6490; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6491; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6492; PROLOG-BLOCK: loop_header.prol.preheader: 6493; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6494; PROLOG-BLOCK: loop_header.prol: 6495; PROLOG-BLOCK-NEXT: call void @bar() 6496; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6497; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6498; PROLOG-BLOCK: loop_exiting_bb2.prol: 6499; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6500; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6501; PROLOG-BLOCK: loop_latch.prol: 6502; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6503; PROLOG-BLOCK: loop_header.prol.loopexit: 6504; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6505; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6506; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6507; PROLOG-BLOCK: entry.new: 6508; PROLOG-BLOCK-NEXT: br label %loop_header 6509; PROLOG-BLOCK: loop_header: 6510; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6511; PROLOG-BLOCK-NEXT: call void @bar() 6512; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6513; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6514; PROLOG-BLOCK: loop_exiting_bb2: 6515; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6516; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6517; PROLOG-BLOCK: loop_latch: 6518; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6519; PROLOG-BLOCK-NEXT: call void @bar() 6520; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6521; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6522; PROLOG-BLOCK: loop_exiting_bb2.1: 6523; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6524; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6525; PROLOG-BLOCK: loop_latch.1: 6526; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6527; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6528; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6529; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6530; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6531; PROLOG-BLOCK: exit1.unr-lcssa: 6532; PROLOG-BLOCK-NEXT: br label %exit1 6533; PROLOG-BLOCK: exit1: 6534; PROLOG-BLOCK-NEXT: ret void 6535; 6536entry: 6537 br label %loop_header 6538 6539loop_header: 6540 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6541 call void @bar() 6542 %cmp_early = icmp ne i64 %iv, %trip2 6543 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6544 6545loop_exiting_bb2: 6546 %unknown = call i1 @unknown_cond() 6547 br i1 %unknown, label %loop_latch, label %exit1 6548 6549loop_latch: 6550 %iv_next = add i64 %iv, 1 6551 %cmp = icmp ne i64 %iv_next, %trip 6552 br i1 %cmp, label %loop_header, label %exit1 6553 6554exit1: 6555 ret void 6556} 6557 6558; Mix of invariant and (even in theory) uncomputable exits 6559define void @test14(i64 %trip, i1 %cond) { 6560; EPILOG-LABEL: @test14( 6561; EPILOG-NEXT: entry: 6562; EPILOG-NEXT: %0 = add i64 %trip, -1 6563; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 6564; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 6565; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6566; EPILOG: entry.new: 6567; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6568; EPILOG-NEXT: br label %loop_header 6569; EPILOG: loop_header: 6570; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6571; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6572; EPILOG-NEXT: call void @bar() 6573; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6574; EPILOG: loop_exiting_bb2: 6575; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6576; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6577; EPILOG: loop_latch: 6578; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6579; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6580; EPILOG-NEXT: call void @bar() 6581; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6582; EPILOG: loop_exiting_bb2.1: 6583; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6584; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6585; EPILOG: loop_latch.1: 6586; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 6587; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6588; EPILOG-NEXT: call void @bar() 6589; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6590; EPILOG: loop_exiting_bb2.2: 6591; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6592; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6593; EPILOG: loop_latch.2: 6594; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 6595; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6596; EPILOG-NEXT: call void @bar() 6597; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6598; EPILOG: loop_exiting_bb2.3: 6599; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6600; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6601; EPILOG: loop_latch.3: 6602; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 6603; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6604; EPILOG-NEXT: call void @bar() 6605; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6606; EPILOG: loop_exiting_bb2.4: 6607; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6608; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6609; EPILOG: loop_latch.4: 6610; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 6611; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6612; EPILOG-NEXT: call void @bar() 6613; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6614; EPILOG: loop_exiting_bb2.5: 6615; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6616; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6617; EPILOG: loop_latch.5: 6618; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 6619; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6620; EPILOG-NEXT: call void @bar() 6621; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6622; EPILOG: loop_exiting_bb2.6: 6623; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6624; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6625; EPILOG: loop_latch.6: 6626; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 6627; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6628; EPILOG-NEXT: call void @bar() 6629; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6630; EPILOG: loop_exiting_bb2.7: 6631; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6632; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6633; EPILOG: loop_latch.7: 6634; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6635; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 6636; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6637; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6638; EPILOG: exit1.unr-lcssa.loopexit: 6639; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6640; EPILOG-NEXT: br label %exit1.unr-lcssa 6641; EPILOG: exit1.unr-lcssa: 6642; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6643; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6644; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6645; EPILOG: loop_header.epil.preheader: 6646; EPILOG-NEXT: br label %loop_header.epil 6647; EPILOG: loop_header.epil: 6648; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6649; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6650; EPILOG-NEXT: call void @bar() 6651; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6652; EPILOG: loop_exiting_bb2.epil: 6653; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6654; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6655; EPILOG: loop_latch.epil: 6656; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6657; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6658; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6659; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6660; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18 6661; EPILOG: exit1.epilog-lcssa.loopexit: 6662; EPILOG-NEXT: br label %exit1.epilog-lcssa 6663; EPILOG: exit1.epilog-lcssa.loopexit1: 6664; EPILOG-NEXT: br label %exit1.epilog-lcssa 6665; EPILOG: exit1.epilog-lcssa: 6666; EPILOG-NEXT: br label %exit1 6667; EPILOG: exit1: 6668; EPILOG-NEXT: ret void 6669; 6670; EPILOG-BLOCK-LABEL: @test14( 6671; EPILOG-BLOCK-NEXT: entry: 6672; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6673; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6674; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6675; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6676; EPILOG-BLOCK: entry.new: 6677; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6678; EPILOG-BLOCK-NEXT: br label %loop_header 6679; EPILOG-BLOCK: loop_header: 6680; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6681; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6682; EPILOG-BLOCK-NEXT: call void @bar() 6683; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6684; EPILOG-BLOCK: loop_exiting_bb2: 6685; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6686; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6687; EPILOG-BLOCK: loop_latch: 6688; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6689; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6690; EPILOG-BLOCK-NEXT: call void @bar() 6691; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6692; EPILOG-BLOCK: loop_exiting_bb2.1: 6693; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6694; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6695; EPILOG-BLOCK: loop_latch.1: 6696; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6697; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6698; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6699; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6700; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6701; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6702; EPILOG-BLOCK: exit1.unr-lcssa: 6703; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6704; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6705; EPILOG-BLOCK: loop_header.epil.preheader: 6706; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6707; EPILOG-BLOCK: loop_header.epil: 6708; EPILOG-BLOCK-NEXT: call void @bar() 6709; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6710; EPILOG-BLOCK: loop_exiting_bb2.epil: 6711; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6712; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6713; EPILOG-BLOCK: loop_latch.epil: 6714; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6715; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6716; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6717; EPILOG-BLOCK: exit1.epilog-lcssa: 6718; EPILOG-BLOCK-NEXT: br label %exit1 6719; EPILOG-BLOCK: exit1: 6720; EPILOG-BLOCK-NEXT: ret void 6721; 6722; PROLOG-LABEL: @test14( 6723; PROLOG-NEXT: entry: 6724; PROLOG-NEXT: %0 = add i64 %trip, -1 6725; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6726; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6727; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6728; PROLOG: loop_header.prol.preheader: 6729; PROLOG-NEXT: br label %loop_header.prol 6730; PROLOG: loop_header.prol: 6731; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6732; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6733; PROLOG-NEXT: call void @bar() 6734; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6735; PROLOG: loop_exiting_bb2.prol: 6736; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6737; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6738; PROLOG: loop_latch.prol: 6739; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6740; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6741; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6742; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6743; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18 6744; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6745; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6746; PROLOG-NEXT: br label %loop_header.prol.loopexit 6747; PROLOG: loop_header.prol.loopexit: 6748; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6749; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6750; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6751; PROLOG: entry.new: 6752; PROLOG-NEXT: br label %loop_header 6753; PROLOG: loop_header: 6754; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6755; PROLOG-NEXT: call void @bar() 6756; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6757; PROLOG: loop_exiting_bb2: 6758; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6759; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6760; PROLOG: loop_latch: 6761; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6762; PROLOG-NEXT: call void @bar() 6763; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6764; PROLOG: loop_exiting_bb2.1: 6765; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6766; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6767; PROLOG: loop_latch.1: 6768; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6769; PROLOG-NEXT: call void @bar() 6770; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6771; PROLOG: loop_exiting_bb2.2: 6772; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6773; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6774; PROLOG: loop_latch.2: 6775; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6776; PROLOG-NEXT: call void @bar() 6777; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6778; PROLOG: loop_exiting_bb2.3: 6779; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6780; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6781; PROLOG: loop_latch.3: 6782; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6783; PROLOG-NEXT: call void @bar() 6784; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6785; PROLOG: loop_exiting_bb2.4: 6786; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6787; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6788; PROLOG: loop_latch.4: 6789; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6790; PROLOG-NEXT: call void @bar() 6791; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6792; PROLOG: loop_exiting_bb2.5: 6793; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6794; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6795; PROLOG: loop_latch.5: 6796; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6797; PROLOG-NEXT: call void @bar() 6798; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6799; PROLOG: loop_exiting_bb2.6: 6800; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6801; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6802; PROLOG: loop_latch.6: 6803; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6804; PROLOG-NEXT: call void @bar() 6805; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6806; PROLOG: loop_exiting_bb2.7: 6807; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6808; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6809; PROLOG: loop_latch.7: 6810; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6811; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6812; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6813; PROLOG: exit1.unr-lcssa.loopexit: 6814; PROLOG-NEXT: br label %exit1.unr-lcssa 6815; PROLOG: exit1.unr-lcssa.loopexit1: 6816; PROLOG-NEXT: br label %exit1.unr-lcssa 6817; PROLOG: exit1.unr-lcssa: 6818; PROLOG-NEXT: br label %exit1 6819; PROLOG: exit1: 6820; PROLOG-NEXT: ret void 6821; 6822; PROLOG-BLOCK-LABEL: @test14( 6823; PROLOG-BLOCK-NEXT: entry: 6824; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6825; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6826; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6827; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6828; PROLOG-BLOCK: loop_header.prol.preheader: 6829; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6830; PROLOG-BLOCK: loop_header.prol: 6831; PROLOG-BLOCK-NEXT: call void @bar() 6832; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6833; PROLOG-BLOCK: loop_exiting_bb2.prol: 6834; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6835; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6836; PROLOG-BLOCK: loop_latch.prol: 6837; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6838; PROLOG-BLOCK: loop_header.prol.loopexit: 6839; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6840; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6841; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6842; PROLOG-BLOCK: entry.new: 6843; PROLOG-BLOCK-NEXT: br label %loop_header 6844; PROLOG-BLOCK: loop_header: 6845; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6846; PROLOG-BLOCK-NEXT: call void @bar() 6847; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6848; PROLOG-BLOCK: loop_exiting_bb2: 6849; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6850; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6851; PROLOG-BLOCK: loop_latch: 6852; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6853; PROLOG-BLOCK-NEXT: call void @bar() 6854; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6855; PROLOG-BLOCK: loop_exiting_bb2.1: 6856; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6857; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6858; PROLOG-BLOCK: loop_latch.1: 6859; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6860; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6861; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6862; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6863; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6864; PROLOG-BLOCK: exit1.unr-lcssa: 6865; PROLOG-BLOCK-NEXT: br label %exit1 6866; PROLOG-BLOCK: exit1: 6867; PROLOG-BLOCK-NEXT: ret void 6868; 6869entry: 6870 br label %loop_header 6871 6872loop_header: 6873 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6874 call void @bar() 6875 br i1 %cond, label %loop_exiting_bb2, label %exit1 6876 6877loop_exiting_bb2: 6878 %unknown = call i1 @unknown_cond() 6879 br i1 %unknown, label %loop_latch, label %exit1 6880 6881loop_latch: 6882 %iv_next = add i64 %iv, 1 6883 %cmp = icmp ne i64 %iv_next, %trip 6884 br i1 %cmp, label %loop_header, label %exit1 6885 6886exit1: 6887 ret void 6888} 6889