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 i32 %M, 3 3071; EPILOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3072; EPILOG-NEXT: %0 = add i32 %umax, -1 3073; EPILOG-NEXT: %xtraiter = and i32 %umax, 7 3074; EPILOG-NEXT: %1 = icmp ult i32 %0, 7 3075; EPILOG-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %preheader.new 3076; EPILOG: preheader.new: 3077; EPILOG-NEXT: %unroll_iter = sub i32 %umax, %xtraiter 3078; EPILOG-NEXT: br label %header 3079; EPILOG: header: 3080; EPILOG-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ] 3081; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 3082; EPILOG-NEXT: %inc = add nuw nsw i32 %i4, 1 3083; EPILOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3084; EPILOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3085; EPILOG: latch: 3086; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3087; EPILOG-NEXT: %inc.1 = add nuw nsw i32 %inc, 1 3088; EPILOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3089; EPILOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3090; EPILOG: latch.1: 3091; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 3092; EPILOG-NEXT: %inc.2 = add nuw nsw i32 %inc.1, 1 3093; EPILOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3094; EPILOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit 3095; EPILOG: latch.2: 3096; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 3097; EPILOG-NEXT: %inc.3 = add nuw nsw i32 %inc.2, 1 3098; EPILOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3099; EPILOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit 3100; EPILOG: latch.3: 3101; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 3102; EPILOG-NEXT: %inc.4 = add nuw nsw i32 %inc.3, 1 3103; EPILOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3104; EPILOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit 3105; EPILOG: latch.4: 3106; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 3107; EPILOG-NEXT: %inc.5 = add nuw nsw i32 %inc.4, 1 3108; EPILOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3109; EPILOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit 3110; EPILOG: latch.5: 3111; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 3112; EPILOG-NEXT: %inc.6 = add nuw nsw i32 %inc.5, 1 3113; EPILOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3114; EPILOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit 3115; EPILOG: latch.6: 3116; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 3117; EPILOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3118; EPILOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3119; EPILOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit 3120; EPILOG: latch.7: 3121; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 3122; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 3123; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3124; EPILOG: latchExit.unr-lcssa.loopexit: 3125; EPILOG-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ] 3126; EPILOG-NEXT: %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ] 3127; EPILOG-NEXT: br label %latchExit.unr-lcssa 3128; EPILOG: latchExit.unr-lcssa: 3129; EPILOG-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3130; EPILOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3131; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3132; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3133; EPILOG: header.epil.preheader: 3134; EPILOG-NEXT: br label %header.epil 3135; EPILOG: header.epil: 3136; EPILOG-NEXT: %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ] 3137; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3138; EPILOG-NEXT: %inc.epil = add nuw i32 %i4.epil, 1 3139; EPILOG-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3140; EPILOG-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2 3141; EPILOG: latch.epil: 3142; EPILOG-NEXT: %cmp.epil = icmp ult i32 %inc.epil, %M.shifted 3143; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 3144; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 3145; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8 3146; EPILOG: latchExit.epilog-lcssa.loopexit: 3147; 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 ] 3148; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3149; EPILOG: latchExit.epilog-lcssa.loopexit2: 3150; EPILOG-NEXT: %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ] 3151; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3152; EPILOG: latchExit.epilog-lcssa: 3153; EPILOG-NEXT: %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 3154; EPILOG-NEXT: br label %latchExit 3155; EPILOG: latchExit: 3156; EPILOG-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3157; EPILOG-NEXT: ret void 3158; 3159; EPILOG-BLOCK-LABEL: @unique_exit( 3160; EPILOG-BLOCK-NEXT: preheader: 3161; EPILOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 3162; EPILOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3163; EPILOG-BLOCK-NEXT: %0 = add i32 %umax, -1 3164; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 3165; EPILOG-BLOCK-NEXT: %1 = icmp ult i32 %0, 1 3166; EPILOG-BLOCK-NEXT: br i1 %1, label %latchExit.unr-lcssa, label %preheader.new 3167; EPILOG-BLOCK: preheader.new: 3168; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %umax, %xtraiter 3169; EPILOG-BLOCK-NEXT: br label %header 3170; EPILOG-BLOCK: header: 3171; EPILOG-BLOCK-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ] 3172; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 3173; EPILOG-BLOCK-NEXT: %inc = add nuw nsw i32 %i4, 1 3174; EPILOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3175; EPILOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3176; EPILOG-BLOCK: latch: 3177; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3178; EPILOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3179; EPILOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3180; EPILOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3181; EPILOG-BLOCK: latch.1: 3182; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 3183; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 3184; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3185; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 3186; EPILOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ] 3187; EPILOG-BLOCK-NEXT: %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ] 3188; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3189; EPILOG-BLOCK: latchExit.unr-lcssa: 3190; EPILOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3191; EPILOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3192; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3193; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3194; EPILOG-BLOCK: header.epil.preheader: 3195; EPILOG-BLOCK-NEXT: br label %header.epil 3196; EPILOG-BLOCK: header.epil: 3197; EPILOG-BLOCK-NEXT: %inc.epil = add nuw i32 %i4.unr, 1 3198; EPILOG-BLOCK-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3199; EPILOG-BLOCK-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa 3200; EPILOG-BLOCK: latch.epil: 3201; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3202; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 3203; EPILOG-BLOCK-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ] 3204; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3205; EPILOG-BLOCK: latchExit.epilog-lcssa: 3206; EPILOG-BLOCK-NEXT: %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 3207; EPILOG-BLOCK-NEXT: br label %latchExit 3208; EPILOG-BLOCK: latchExit: 3209; EPILOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3210; EPILOG-BLOCK-NEXT: ret void 3211; 3212; PROLOG-LABEL: @unique_exit( 3213; PROLOG-NEXT: preheader: 3214; PROLOG-NEXT: %M.shifted = shl i32 %M, 3 3215; PROLOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3216; PROLOG-NEXT: %0 = add i32 %umax, -1 3217; PROLOG-NEXT: %xtraiter = and i32 %umax, 7 3218; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3219; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3220; PROLOG: header.prol.preheader: 3221; PROLOG-NEXT: br label %header.prol 3222; PROLOG: header.prol: 3223; PROLOG-NEXT: %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3224; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 3225; PROLOG-NEXT: %inc.prol = add nuw i32 %i4.prol, 1 3226; PROLOG-NEXT: %cmp1.prol = icmp ult i32 %inc.prol, %N 3227; PROLOG-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1 3228; PROLOG: latch.prol: 3229; PROLOG-NEXT: %cmp.prol = icmp ult i32 %inc.prol, %M.shifted 3230; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 3231; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 3232; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8 3233; PROLOG: header.prol.loopexit.unr-lcssa: 3234; PROLOG-NEXT: %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ] 3235; PROLOG-NEXT: %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ] 3236; PROLOG-NEXT: br label %header.prol.loopexit 3237; PROLOG: header.prol.loopexit: 3238; PROLOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ] 3239; PROLOG-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ] 3240; PROLOG-NEXT: %1 = icmp ult i32 %0, 7 3241; PROLOG-NEXT: br i1 %1, label %latchExit, label %preheader.new 3242; PROLOG: preheader.new: 3243; PROLOG-NEXT: br label %header 3244; PROLOG: header: 3245; PROLOG-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ] 3246; PROLOG-NEXT: %inc = add nuw i32 %i4, 1 3247; PROLOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3248; PROLOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3249; PROLOG: latch: 3250; PROLOG-NEXT: %inc.1 = add nuw i32 %inc, 1 3251; PROLOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3252; PROLOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3253; PROLOG: latch.1: 3254; PROLOG-NEXT: %inc.2 = add nuw i32 %inc.1, 1 3255; PROLOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3256; PROLOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit 3257; PROLOG: latch.2: 3258; PROLOG-NEXT: %inc.3 = add nuw i32 %inc.2, 1 3259; PROLOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3260; PROLOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit 3261; PROLOG: latch.3: 3262; PROLOG-NEXT: %inc.4 = add nuw i32 %inc.3, 1 3263; PROLOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3264; PROLOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit 3265; PROLOG: latch.4: 3266; PROLOG-NEXT: %inc.5 = add nuw i32 %inc.4, 1 3267; PROLOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3268; PROLOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit 3269; PROLOG: latch.5: 3270; PROLOG-NEXT: %inc.6 = add nuw i32 %inc.5, 1 3271; PROLOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3272; PROLOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit 3273; PROLOG: latch.6: 3274; PROLOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3275; PROLOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3276; PROLOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit 3277; PROLOG: latch.7: 3278; PROLOG-NEXT: %cmp.7 = icmp ult i32 %inc.7, %M.shifted 3279; PROLOG-NEXT: br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3280; PROLOG: latchExit.unr-lcssa.loopexit: 3281; 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 ] 3282; PROLOG-NEXT: br label %latchExit.unr-lcssa 3283; PROLOG: latchExit.unr-lcssa.loopexit1: 3284; PROLOG-NEXT: %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ] 3285; PROLOG-NEXT: br label %latchExit.unr-lcssa 3286; PROLOG: latchExit.unr-lcssa: 3287; PROLOG-NEXT: %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 3288; PROLOG-NEXT: br label %latchExit 3289; PROLOG: latchExit: 3290; PROLOG-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3291; PROLOG-NEXT: ret void 3292; 3293; PROLOG-BLOCK-LABEL: @unique_exit( 3294; PROLOG-BLOCK-NEXT: preheader: 3295; PROLOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 3296; PROLOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3297; PROLOG-BLOCK-NEXT: %0 = add i32 %umax, -1 3298; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 3299; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3300; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3301; PROLOG-BLOCK: header.prol.preheader: 3302; PROLOG-BLOCK-NEXT: br label %header.prol 3303; PROLOG-BLOCK: header.prol: 3304; PROLOG-BLOCK-NEXT: %cmp1.prol = icmp ult i32 1, %N 3305; PROLOG-BLOCK-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa 3306; PROLOG-BLOCK: latch.prol: 3307; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3308; PROLOG-BLOCK: header.prol.loopexit: 3309; PROLOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ] 3310; PROLOG-BLOCK-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ] 3311; PROLOG-BLOCK-NEXT: %1 = icmp ult i32 %0, 1 3312; PROLOG-BLOCK-NEXT: br i1 %1, label %latchExit, label %preheader.new 3313; PROLOG-BLOCK: preheader.new: 3314; PROLOG-BLOCK-NEXT: br label %header 3315; PROLOG-BLOCK: header: 3316; PROLOG-BLOCK-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ] 3317; PROLOG-BLOCK-NEXT: %inc = add nuw i32 %i4, 1 3318; PROLOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3319; PROLOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3320; PROLOG-BLOCK: latch: 3321; PROLOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3322; PROLOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3323; PROLOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3324; PROLOG-BLOCK: latch.1: 3325; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ult i32 %inc.1, %M.shifted 3326; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3327; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 3328; PROLOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ] 3329; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3330; PROLOG-BLOCK: latchExit.unr-lcssa: 3331; PROLOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3332; PROLOG-BLOCK-NEXT: br label %latchExit 3333; PROLOG-BLOCK: latchExit: 3334; PROLOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3335; PROLOG-BLOCK-NEXT: ret void 3336; 3337 3338preheader: 3339 %M.shifted = shl nuw i32 %M, 3 3340 br label %header 3341 3342header: ; preds = %preheader, %latch 3343 %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ] 3344 %inc = add nuw i32 %i4, 1 3345 %cmp1 = icmp ult i32 %inc, %N 3346 br i1 %cmp1, label %latch, label %latchExit 3347 3348latch: ; preds = %header 3349 %cmp = icmp ult i32 %inc, %M.shifted 3350 br i1 %cmp, label %header, label %latchExit 3351 3352latchExit: ; preds = %header, %latch 3353 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3354 ret void 3355} 3356 3357 3358; two exiting and two exit blocks. 3359; the non-latch exiting block has duplicate edges to the non-latch exit block. 3360define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 3361; EPILOG-LABEL: @test5( 3362; EPILOG-NEXT: entry: 3363; EPILOG-NEXT: %0 = add i64 %trip, -1 3364; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 3365; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3366; EPILOG-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3367; EPILOG: entry.new: 3368; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3369; EPILOG-NEXT: br label %loop_header 3370; EPILOG: loop_header: 3371; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3372; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3373; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 3374; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3375; EPILOG: loop_exiting: 3376; EPILOG-NEXT: %ivy = add i64 %iv, %add 3377; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 3378; EPILOG-NEXT: i64 24, label %exit1.loopexit 3379; EPILOG-NEXT: i64 42, label %exit1.loopexit 3380; EPILOG-NEXT: ] 3381; EPILOG: loop_latch: 3382; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3383; EPILOG-NEXT: %sum.next = add i64 %sum, %add 3384; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3385; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3386; EPILOG: loop_exiting.1: 3387; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3388; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3389; EPILOG-NEXT: i64 24, label %exit1.loopexit 3390; EPILOG-NEXT: i64 42, label %exit1.loopexit 3391; EPILOG-NEXT: ] 3392; EPILOG: loop_latch.1: 3393; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3394; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3395; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 3396; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3397; EPILOG: loop_exiting.2: 3398; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3399; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3400; EPILOG-NEXT: i64 24, label %exit1.loopexit 3401; EPILOG-NEXT: i64 42, label %exit1.loopexit 3402; EPILOG-NEXT: ] 3403; EPILOG: loop_latch.2: 3404; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3405; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3406; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 3407; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3408; EPILOG: loop_exiting.3: 3409; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3410; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3411; EPILOG-NEXT: i64 24, label %exit1.loopexit 3412; EPILOG-NEXT: i64 42, label %exit1.loopexit 3413; EPILOG-NEXT: ] 3414; EPILOG: loop_latch.3: 3415; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3416; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3417; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 3418; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3419; EPILOG: loop_exiting.4: 3420; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3421; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3422; EPILOG-NEXT: i64 24, label %exit1.loopexit 3423; EPILOG-NEXT: i64 42, label %exit1.loopexit 3424; EPILOG-NEXT: ] 3425; EPILOG: loop_latch.4: 3426; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3427; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3428; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 3429; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3430; EPILOG: loop_exiting.5: 3431; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3432; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3433; EPILOG-NEXT: i64 24, label %exit1.loopexit 3434; EPILOG-NEXT: i64 42, label %exit1.loopexit 3435; EPILOG-NEXT: ] 3436; EPILOG: loop_latch.5: 3437; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3438; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3439; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 3440; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3441; EPILOG: loop_exiting.6: 3442; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3443; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3444; EPILOG-NEXT: i64 24, label %exit1.loopexit 3445; EPILOG-NEXT: i64 42, label %exit1.loopexit 3446; EPILOG-NEXT: ] 3447; EPILOG: loop_latch.6: 3448; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3449; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3450; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 3451; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3452; EPILOG: loop_exiting.7: 3453; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3454; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3455; EPILOG-NEXT: i64 24, label %exit1.loopexit 3456; EPILOG-NEXT: i64 42, label %exit1.loopexit 3457; EPILOG-NEXT: ] 3458; EPILOG: loop_latch.7: 3459; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3460; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3461; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 3462; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 3463; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 3464; EPILOG: exit1.loopexit: 3465; 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 ] 3466; EPILOG-NEXT: br label %exit1 3467; EPILOG: exit1.loopexit2: 3468; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 3469; EPILOG-NEXT: br label %exit1 3470; EPILOG: exit1: 3471; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 3472; EPILOG-NEXT: ret i64 %result 3473; EPILOG: latchexit.unr-lcssa.loopexit: 3474; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3475; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 3476; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3477; EPILOG-NEXT: br label %latchexit.unr-lcssa 3478; EPILOG: latchexit.unr-lcssa: 3479; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3480; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3481; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3482; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3483; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3484; EPILOG: loop_header.epil.preheader: 3485; EPILOG-NEXT: br label %loop_header.epil 3486; EPILOG: loop_header.epil: 3487; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 3488; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 3489; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 3490; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3491; EPILOG: loop_exiting.epil: 3492; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 3493; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3494; EPILOG-NEXT: i64 24, label %exit1.loopexit2 3495; EPILOG-NEXT: i64 42, label %exit1.loopexit2 3496; EPILOG-NEXT: ] 3497; EPILOG: loop_latch.epil: 3498; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3499; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3500; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 3501; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3502; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3503; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9 3504; EPILOG: latchexit.epilog-lcssa: 3505; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 3506; EPILOG-NEXT: br label %latchexit 3507; EPILOG: latchexit: 3508; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 3509; EPILOG-NEXT: ret i64 %sum.next.lcssa 3510; 3511; EPILOG-BLOCK-LABEL: @test5( 3512; EPILOG-BLOCK-NEXT: entry: 3513; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3514; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3515; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3516; EPILOG-BLOCK-NEXT: br i1 %1, label %latchexit.unr-lcssa, label %entry.new 3517; EPILOG-BLOCK: entry.new: 3518; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 3519; EPILOG-BLOCK-NEXT: br label %loop_header 3520; EPILOG-BLOCK: loop_header: 3521; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3522; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3523; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 3524; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3525; EPILOG-BLOCK: loop_exiting: 3526; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3527; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3528; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3529; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3530; EPILOG-BLOCK-NEXT: ] 3531; EPILOG-BLOCK: loop_latch: 3532; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3533; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3534; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3535; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3536; EPILOG-BLOCK: loop_exiting.1: 3537; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3538; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3539; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3540; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3541; EPILOG-BLOCK-NEXT: ] 3542; EPILOG-BLOCK: loop_latch.1: 3543; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3544; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3545; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 3546; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 3547; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9 3548; EPILOG-BLOCK: exit1.loopexit: 3549; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3550; EPILOG-BLOCK-NEXT: br label %exit1 3551; EPILOG-BLOCK: exit1: 3552; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 3553; EPILOG-BLOCK-NEXT: ret i64 %result 3554; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3555; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3556; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 3557; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3558; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3559; EPILOG-BLOCK: latchexit.unr-lcssa: 3560; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3561; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3562; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3563; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3564; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3565; EPILOG-BLOCK: loop_header.epil.preheader: 3566; EPILOG-BLOCK-NEXT: br label %loop_header.epil 3567; EPILOG-BLOCK: loop_header.epil: 3568; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3569; EPILOG-BLOCK: loop_exiting.epil: 3570; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.unr, %add 3571; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 3572; EPILOG-BLOCK-NEXT: i64 24, label %exit1 3573; EPILOG-BLOCK-NEXT: i64 42, label %exit1 3574; EPILOG-BLOCK-NEXT: ] 3575; EPILOG-BLOCK: loop_latch.epil: 3576; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.unr, %add 3577; EPILOG-BLOCK-NEXT: br label %latchexit 3578; EPILOG-BLOCK: latchexit: 3579; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ] 3580; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3581; 3582; PROLOG-LABEL: @test5( 3583; PROLOG-NEXT: entry: 3584; PROLOG-NEXT: %0 = add i64 %trip, -1 3585; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 3586; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3587; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3588; PROLOG: loop_header.prol.preheader: 3589; PROLOG-NEXT: br label %loop_header.prol 3590; PROLOG: loop_header.prol: 3591; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 3592; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 3593; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 3594; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3595; PROLOG: loop_exiting.prol: 3596; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 3597; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 3598; PROLOG-NEXT: i64 24, label %exit1.loopexit1 3599; PROLOG-NEXT: i64 42, label %exit1.loopexit1 3600; PROLOG-NEXT: ] 3601; PROLOG: loop_latch.prol: 3602; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 3603; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 3604; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 3605; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 3606; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 3607; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9 3608; PROLOG: loop_header.prol.loopexit.unr-lcssa: 3609; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 3610; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3611; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3612; PROLOG-NEXT: br label %loop_header.prol.loopexit 3613; PROLOG: loop_header.prol.loopexit: 3614; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3615; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3616; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3617; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 3618; PROLOG-NEXT: br i1 %1, label %latchexit, label %entry.new 3619; PROLOG: entry.new: 3620; PROLOG-NEXT: br label %loop_header 3621; PROLOG: loop_header: 3622; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3623; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3624; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3625; PROLOG: loop_exiting: 3626; PROLOG-NEXT: %ivy = add i64 %iv, %add 3627; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 3628; PROLOG-NEXT: i64 24, label %exit1.loopexit 3629; PROLOG-NEXT: i64 42, label %exit1.loopexit 3630; PROLOG-NEXT: ] 3631; PROLOG: loop_latch: 3632; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3633; PROLOG-NEXT: %sum.next = add i64 %sum, %add 3634; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3635; PROLOG: loop_exiting.1: 3636; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3637; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3638; PROLOG-NEXT: i64 24, label %exit1.loopexit 3639; PROLOG-NEXT: i64 42, label %exit1.loopexit 3640; PROLOG-NEXT: ] 3641; PROLOG: loop_latch.1: 3642; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3643; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3644; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3645; PROLOG: loop_exiting.2: 3646; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3647; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3648; PROLOG-NEXT: i64 24, label %exit1.loopexit 3649; PROLOG-NEXT: i64 42, label %exit1.loopexit 3650; PROLOG-NEXT: ] 3651; PROLOG: loop_latch.2: 3652; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3653; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3654; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3655; PROLOG: loop_exiting.3: 3656; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3657; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3658; PROLOG-NEXT: i64 24, label %exit1.loopexit 3659; PROLOG-NEXT: i64 42, label %exit1.loopexit 3660; PROLOG-NEXT: ] 3661; PROLOG: loop_latch.3: 3662; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3663; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3664; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3665; PROLOG: loop_exiting.4: 3666; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3667; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3668; PROLOG-NEXT: i64 24, label %exit1.loopexit 3669; PROLOG-NEXT: i64 42, label %exit1.loopexit 3670; PROLOG-NEXT: ] 3671; PROLOG: loop_latch.4: 3672; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3673; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3674; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3675; PROLOG: loop_exiting.5: 3676; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3677; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3678; PROLOG-NEXT: i64 24, label %exit1.loopexit 3679; PROLOG-NEXT: i64 42, label %exit1.loopexit 3680; PROLOG-NEXT: ] 3681; PROLOG: loop_latch.5: 3682; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3683; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3684; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3685; PROLOG: loop_exiting.6: 3686; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3687; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3688; PROLOG-NEXT: i64 24, label %exit1.loopexit 3689; PROLOG-NEXT: i64 42, label %exit1.loopexit 3690; PROLOG-NEXT: ] 3691; PROLOG: loop_latch.6: 3692; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3693; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3694; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3695; PROLOG: loop_exiting.7: 3696; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3697; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3698; PROLOG-NEXT: i64 24, label %exit1.loopexit 3699; PROLOG-NEXT: i64 42, label %exit1.loopexit 3700; PROLOG-NEXT: ] 3701; PROLOG: loop_latch.7: 3702; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3703; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3704; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 3705; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 3706; PROLOG: exit1.loopexit: 3707; 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 ] 3708; PROLOG-NEXT: br label %exit1 3709; PROLOG: exit1.loopexit1: 3710; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 3711; PROLOG-NEXT: br label %exit1 3712; PROLOG: exit1: 3713; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 3714; PROLOG-NEXT: ret i64 %result 3715; PROLOG: latchexit.unr-lcssa: 3716; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3717; PROLOG-NEXT: br label %latchexit 3718; PROLOG: latchexit: 3719; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3720; PROLOG-NEXT: ret i64 %sum.next.lcssa 3721; 3722; PROLOG-BLOCK-LABEL: @test5( 3723; PROLOG-BLOCK-NEXT: entry: 3724; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 3725; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 3726; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3727; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3728; PROLOG-BLOCK: loop_header.prol.preheader: 3729; PROLOG-BLOCK-NEXT: br label %loop_header.prol 3730; PROLOG-BLOCK: loop_header.prol: 3731; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3732; PROLOG-BLOCK: loop_exiting.prol: 3733; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 3734; PROLOG-BLOCK-NEXT: i64 24, label %exit1 3735; PROLOG-BLOCK-NEXT: i64 42, label %exit1 3736; PROLOG-BLOCK-NEXT: ] 3737; PROLOG-BLOCK: loop_latch.prol: 3738; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 3739; PROLOG-BLOCK: loop_header.prol.loopexit: 3740; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 3741; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 3742; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ] 3743; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3744; PROLOG-BLOCK-NEXT: br i1 %1, label %latchexit, label %entry.new 3745; PROLOG-BLOCK: entry.new: 3746; PROLOG-BLOCK-NEXT: br label %loop_header 3747; PROLOG-BLOCK: loop_header: 3748; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3749; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3750; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3751; PROLOG-BLOCK: loop_exiting: 3752; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3753; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3754; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3755; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3756; PROLOG-BLOCK-NEXT: ] 3757; PROLOG-BLOCK: loop_latch: 3758; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3759; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3760; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3761; PROLOG-BLOCK: loop_exiting.1: 3762; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3763; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3764; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3765; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3766; PROLOG-BLOCK-NEXT: ] 3767; PROLOG-BLOCK: loop_latch.1: 3768; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3769; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3770; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 3771; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9 3772; PROLOG-BLOCK: exit1.loopexit: 3773; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3774; PROLOG-BLOCK-NEXT: br label %exit1 3775; PROLOG-BLOCK: exit1: 3776; PROLOG-BLOCK-NEXT: %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 3777; PROLOG-BLOCK-NEXT: ret i64 %result 3778; PROLOG-BLOCK: latchexit.unr-lcssa: 3779; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3780; PROLOG-BLOCK-NEXT: br label %latchexit 3781; PROLOG-BLOCK: latchexit: 3782; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3783; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3784; 3785 3786entry: 3787 br label %loop_header 3788 3789loop_header: 3790 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3791 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3792 br i1 %cond, label %loop_latch, label %loop_exiting 3793 3794loop_exiting: 3795 %ivy = add i64 %iv, %add 3796 switch i64 %sum, label %loop_latch [ 3797 i64 24, label %exit1 3798 i64 42, label %exit1 3799 ] 3800 3801loop_latch: 3802 %iv_next = add nuw nsw i64 %iv, 1 3803 %sum.next = add i64 %sum, %add 3804 %cmp = icmp ne i64 %iv_next, %trip 3805 br i1 %cmp, label %loop_header, label %latchexit 3806 3807exit1: 3808 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3809 ret i64 %result 3810 3811latchexit: 3812 ret i64 %sum.next 3813} 3814 3815; test when exit blocks have successors. 3816define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 3817; EPILOG-LABEL: @test6( 3818; EPILOG-NEXT: entry: 3819; EPILOG-NEXT: %0 = add i64 %n, -1 3820; EPILOG-NEXT: %xtraiter = and i64 %n, 7 3821; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 3822; EPILOG-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3823; EPILOG: entry.new: 3824; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3825; EPILOG-NEXT: br label %header 3826; EPILOG: header: 3827; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3828; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3829; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 3830; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3831; EPILOG: for.exiting_block: 3832; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3833; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3834; EPILOG: latch: 3835; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3836; EPILOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3837; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3838; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3839; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3840; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3841; EPILOG: for.exiting_block.1: 3842; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3843; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3844; EPILOG: latch.1: 3845; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3846; EPILOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3847; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3848; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 3849; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 3850; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3851; EPILOG: for.exiting_block.2: 3852; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3853; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3854; EPILOG: latch.2: 3855; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3856; EPILOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3857; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3858; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 3859; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 3860; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3861; EPILOG: for.exiting_block.3: 3862; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3863; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3864; EPILOG: latch.3: 3865; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3866; EPILOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3867; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3868; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 3869; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 3870; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3871; EPILOG: for.exiting_block.4: 3872; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3873; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3874; EPILOG: latch.4: 3875; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3876; EPILOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3877; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3878; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 3879; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 3880; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3881; EPILOG: for.exiting_block.5: 3882; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3883; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3884; EPILOG: latch.5: 3885; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3886; EPILOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3887; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3888; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 3889; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 3890; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3891; EPILOG: for.exiting_block.6: 3892; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3893; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3894; EPILOG: latch.6: 3895; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3896; EPILOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3897; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3898; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 3899; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 3900; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3901; EPILOG: for.exiting_block.7: 3902; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3903; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3904; EPILOG: latch.7: 3905; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3906; EPILOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3907; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3908; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 3909; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 3910; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 3911; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3912; EPILOG: latch_exit.unr-lcssa.loopexit: 3913; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3914; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3915; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3916; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3917; EPILOG: latch_exit.unr-lcssa: 3918; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3919; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3920; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3921; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3922; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3923; EPILOG: header.epil.preheader: 3924; EPILOG-NEXT: br label %header.epil 3925; EPILOG: header.epil: 3926; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3927; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3928; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3929; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3930; EPILOG: for.exiting_block.epil: 3931; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3932; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3933; EPILOG: latch.epil: 3934; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3935; EPILOG-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3936; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3937; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3938; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3939; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3940; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3941; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10 3942; EPILOG: latch_exit.epilog-lcssa: 3943; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3944; EPILOG-NEXT: br label %latch_exit 3945; EPILOG: latch_exit: 3946; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3947; EPILOG-NEXT: ret i32 %sum.0.lcssa 3948; EPILOG: for.exit2.loopexit: 3949; 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 ] 3950; EPILOG-NEXT: br label %for.exit2 3951; EPILOG: for.exit2.loopexit2: 3952; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3953; EPILOG-NEXT: br label %for.exit2 3954; EPILOG: for.exit2: 3955; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3956; EPILOG-NEXT: %addx = add i32 %retval, %x 3957; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3958; EPILOG: exit_true: 3959; EPILOG-NEXT: ret i32 %retval 3960; EPILOG: exit_false: 3961; EPILOG-NEXT: ret i32 %addx 3962; 3963; EPILOG-BLOCK-LABEL: @test6( 3964; EPILOG-BLOCK-NEXT: entry: 3965; EPILOG-BLOCK-NEXT: %0 = add i64 %n, -1 3966; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 3967; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 3968; EPILOG-BLOCK-NEXT: br i1 %1, label %latch_exit.unr-lcssa, label %entry.new 3969; EPILOG-BLOCK: entry.new: 3970; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter 3971; EPILOG-BLOCK-NEXT: br label %header 3972; EPILOG-BLOCK: header: 3973; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3974; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 3975; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 3976; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3977; EPILOG-BLOCK: for.exiting_block: 3978; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3979; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3980; EPILOG-BLOCK: latch: 3981; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3982; EPILOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 3983; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3984; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3985; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3986; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3987; EPILOG-BLOCK: for.exiting_block.1: 3988; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3989; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3990; EPILOG-BLOCK: latch.1: 3991; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3992; EPILOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3993; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3994; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3995; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 3996; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 3997; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10 3998; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 3999; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 4000; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 4001; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 4002; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 4003; EPILOG-BLOCK: latch_exit.unr-lcssa: 4004; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 4005; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4006; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4007; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4008; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 4009; EPILOG-BLOCK: header.epil.preheader: 4010; EPILOG-BLOCK-NEXT: br label %header.epil 4011; EPILOG-BLOCK: header.epil: 4012; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 4013; EPILOG-BLOCK: for.exiting_block.epil: 4014; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 4015; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 4016; EPILOG-BLOCK: latch.epil: 4017; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 4018; EPILOG-BLOCK-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 4019; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.unr 4020; EPILOG-BLOCK-NEXT: br label %latch_exit 4021; EPILOG-BLOCK: latch_exit: 4022; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ] 4023; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4024; EPILOG-BLOCK: for.exit2.loopexit: 4025; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4026; EPILOG-BLOCK-NEXT: br label %for.exit2 4027; EPILOG-BLOCK: for.exit2: 4028; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 4029; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4030; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4031; EPILOG-BLOCK: exit_true: 4032; EPILOG-BLOCK-NEXT: ret i32 %retval 4033; EPILOG-BLOCK: exit_false: 4034; EPILOG-BLOCK-NEXT: ret i32 %addx 4035; 4036; PROLOG-LABEL: @test6( 4037; PROLOG-NEXT: entry: 4038; PROLOG-NEXT: %0 = add i64 %n, -1 4039; PROLOG-NEXT: %xtraiter = and i64 %n, 7 4040; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4041; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4042; PROLOG: header.prol.preheader: 4043; PROLOG-NEXT: br label %header.prol 4044; PROLOG: header.prol: 4045; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 4046; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 4047; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4048; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 4049; PROLOG: for.exiting_block.prol: 4050; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 4051; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 4052; PROLOG: latch.prol: 4053; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 4054; PROLOG-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 4055; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 4056; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 4057; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 4058; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4059; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4060; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10 4061; PROLOG: header.prol.loopexit.unr-lcssa: 4062; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4063; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 4064; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4065; PROLOG-NEXT: br label %header.prol.loopexit 4066; PROLOG: header.prol.loopexit: 4067; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 4068; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 4069; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 4070; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 4071; PROLOG-NEXT: br i1 %1, label %latch_exit, label %entry.new 4072; PROLOG: entry.new: 4073; PROLOG-NEXT: br label %header 4074; PROLOG: header: 4075; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 4076; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 4077; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4078; PROLOG: for.exiting_block: 4079; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 4080; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4081; PROLOG: latch: 4082; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4083; PROLOG-NEXT: %load = load i32, i32* %arrayidx, align 4 4084; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 4085; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4086; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4087; PROLOG: for.exiting_block.1: 4088; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 4089; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4090; PROLOG: latch.1: 4091; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4092; PROLOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4093; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 4094; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4095; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 4096; PROLOG: for.exiting_block.2: 4097; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 4098; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 4099; PROLOG: latch.2: 4100; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 4101; PROLOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 4102; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 4103; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 4104; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 4105; PROLOG: for.exiting_block.3: 4106; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 4107; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 4108; PROLOG: latch.3: 4109; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 4110; PROLOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 4111; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 4112; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 4113; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 4114; PROLOG: for.exiting_block.4: 4115; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 4116; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 4117; PROLOG: latch.4: 4118; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 4119; PROLOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 4120; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 4121; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 4122; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 4123; PROLOG: for.exiting_block.5: 4124; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 4125; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 4126; PROLOG: latch.5: 4127; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 4128; PROLOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 4129; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 4130; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 4131; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 4132; PROLOG: for.exiting_block.6: 4133; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 4134; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 4135; PROLOG: latch.6: 4136; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 4137; PROLOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 4138; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 4139; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 4140; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 4141; PROLOG: for.exiting_block.7: 4142; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 4143; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 4144; PROLOG: latch.7: 4145; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 4146; PROLOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 4147; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 4148; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 4149; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 4150; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 4151; PROLOG: latch_exit.unr-lcssa: 4152; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 4153; PROLOG-NEXT: br label %latch_exit 4154; PROLOG: latch_exit: 4155; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4156; PROLOG-NEXT: ret i32 %sum.0.lcssa 4157; PROLOG: for.exit2.loopexit: 4158; 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 ] 4159; PROLOG-NEXT: br label %for.exit2 4160; PROLOG: for.exit2.loopexit1: 4161; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 4162; PROLOG-NEXT: br label %for.exit2 4163; PROLOG: for.exit2: 4164; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 4165; PROLOG-NEXT: %addx = add i32 %retval, %x 4166; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 4167; PROLOG: exit_true: 4168; PROLOG-NEXT: ret i32 %retval 4169; PROLOG: exit_false: 4170; PROLOG-NEXT: ret i32 %addx 4171; 4172; PROLOG-BLOCK-LABEL: @test6( 4173; PROLOG-BLOCK-NEXT: entry: 4174; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 4175; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 4176; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4177; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4178; PROLOG-BLOCK: header.prol.preheader: 4179; PROLOG-BLOCK-NEXT: br label %header.prol 4180; PROLOG-BLOCK: header.prol: 4181; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 4182; PROLOG-BLOCK: for.exiting_block.prol: 4183; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 4184; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 4185; PROLOG-BLOCK: latch.prol: 4186; PROLOG-BLOCK-NEXT: %load.prol = load i32, i32* %a, align 4 4187; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4188; PROLOG-BLOCK: header.prol.loopexit: 4189; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ] 4190; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 4191; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ] 4192; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 4193; PROLOG-BLOCK-NEXT: br i1 %1, label %latch_exit, label %entry.new 4194; PROLOG-BLOCK: entry.new: 4195; PROLOG-BLOCK-NEXT: br label %header 4196; PROLOG-BLOCK: header: 4197; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 4198; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 4199; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4200; PROLOG-BLOCK: for.exiting_block: 4201; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 4202; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4203; PROLOG-BLOCK: latch: 4204; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4205; PROLOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 4206; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 4207; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4208; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4209; PROLOG-BLOCK: for.exiting_block.1: 4210; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4211; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4212; PROLOG-BLOCK: latch.1: 4213; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4214; PROLOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4215; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4216; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4217; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 4218; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10 4219; PROLOG-BLOCK: latch_exit.unr-lcssa: 4220; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 4221; PROLOG-BLOCK-NEXT: br label %latch_exit 4222; PROLOG-BLOCK: latch_exit: 4223; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4224; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4225; PROLOG-BLOCK: for.exit2.loopexit: 4226; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4227; PROLOG-BLOCK-NEXT: br label %for.exit2 4228; PROLOG-BLOCK: for.exit2: 4229; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 4230; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4231; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4232; PROLOG-BLOCK: exit_true: 4233; PROLOG-BLOCK-NEXT: ret i32 %retval 4234; PROLOG-BLOCK: exit_false: 4235; PROLOG-BLOCK-NEXT: ret i32 %addx 4236; 4237 4238entry: 4239 br label %header 4240 4241header: 4242 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 4243 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 4244 br i1 false, label %for.exit2, label %for.exiting_block 4245 4246for.exiting_block: 4247 %cmp = icmp eq i64 %n, 42 4248 br i1 %cmp, label %for.exit2, label %latch 4249 4250latch: 4251 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4252 %load = load i32, i32* %arrayidx, align 4 4253 %add = add nsw i32 %load, %sum.02 4254 %indvars.iv.next = add i64 %indvars.iv, 1 4255 %exitcond = icmp eq i64 %indvars.iv.next, %n 4256 br i1 %exitcond, label %latch_exit, label %header 4257 4258latch_exit: 4259 %sum.0.lcssa = phi i32 [ %add, %latch ] 4260 ret i32 %sum.0.lcssa 4261 4262for.exit2: 4263 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 4264 %addx = add i32 %retval, %x 4265 br i1 %cond, label %exit_true, label %exit_false 4266 4267exit_true: 4268 ret i32 %retval 4269 4270exit_false: 4271 ret i32 %addx 4272} 4273 4274; test when value in exit block does not have VMap. 4275define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 4276; EPILOG-LABEL: @test7( 4277; EPILOG-NEXT: bb: 4278; EPILOG-NEXT: %i = icmp slt i32 undef, 2 4279; EPILOG-NEXT: %sext = sext i32 undef to i64 4280; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 4281; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4282; EPILOG: preheader: 4283; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 4284; EPILOG-NEXT: %1 = add nsw i64 %sext, -2 4285; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4286; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4287; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4288; EPILOG: preheader.new: 4289; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4290; EPILOG-NEXT: br label %header 4291; EPILOG: header: 4292; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 4293; EPILOG-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4294; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4295; EPILOG: latch: 4296; EPILOG-NEXT: %add = add nuw nsw i64 %i6, 1 4297; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4298; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4299; EPILOG: latch.1: 4300; EPILOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4301; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 4302; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4303; EPILOG: latch.2: 4304; EPILOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4305; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 4306; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4307; EPILOG: latch.3: 4308; EPILOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4309; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 4310; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4311; EPILOG: latch.4: 4312; EPILOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4313; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 4314; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4315; EPILOG: latch.5: 4316; EPILOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4317; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 4318; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4319; EPILOG: latch.6: 4320; EPILOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4321; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 4322; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4323; EPILOG: latch.7: 4324; EPILOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4325; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 4326; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4327; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 4328; EPILOG: latchexit.unr-lcssa.loopexit: 4329; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 4330; EPILOG-NEXT: br label %latchexit.unr-lcssa 4331; EPILOG: latchexit.unr-lcssa: 4332; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4333; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4334; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4335; EPILOG: header.epil.preheader: 4336; EPILOG-NEXT: br label %header.epil 4337; EPILOG: header.epil: 4338; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 4339; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4340; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 4341; EPILOG: latch.epil: 4342; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4343; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 4344; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4345; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4346; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11 4347; EPILOG: latchexit.epilog-lcssa: 4348; EPILOG-NEXT: br label %latchexit 4349; EPILOG: latchexit: 4350; EPILOG-NEXT: unreachable 4351; EPILOG: loopexit2: 4352; EPILOG-NEXT: ret i32 %shft 4353; EPILOG: loopexit1.loopexit: 4354; 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 ] 4355; EPILOG-NEXT: br label %loopexit1 4356; EPILOG: loopexit1.loopexit1: 4357; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 4358; EPILOG-NEXT: br label %loopexit1 4359; EPILOG: loopexit1: 4360; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4361; EPILOG-NEXT: ret i32 %sext3 4362; 4363; EPILOG-BLOCK-LABEL: @test7( 4364; EPILOG-BLOCK-NEXT: bb: 4365; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4366; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4367; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4368; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4369; EPILOG-BLOCK: preheader: 4370; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4371; EPILOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4372; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4373; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4374; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %preheader.new 4375; EPILOG-BLOCK: preheader.new: 4376; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4377; EPILOG-BLOCK-NEXT: br label %header 4378; EPILOG-BLOCK: header: 4379; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 4380; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 4381; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4382; EPILOG-BLOCK: latch: 4383; EPILOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4384; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4385; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4386; EPILOG-BLOCK: latch.1: 4387; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4388; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 4389; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4390; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11 4391; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 4392; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 4393; EPILOG-BLOCK: latchexit.unr-lcssa: 4394; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4395; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4396; EPILOG-BLOCK: header.epil.preheader: 4397; EPILOG-BLOCK-NEXT: br label %header.epil 4398; EPILOG-BLOCK: header.epil: 4399; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 4400; EPILOG-BLOCK: latch.epil: 4401; EPILOG-BLOCK-NEXT: br label %latchexit 4402; EPILOG-BLOCK: latchexit: 4403; EPILOG-BLOCK-NEXT: unreachable 4404; EPILOG-BLOCK: loopexit2: 4405; EPILOG-BLOCK-NEXT: ret i32 %shft 4406; EPILOG-BLOCK: loopexit1.loopexit: 4407; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4408; EPILOG-BLOCK-NEXT: br label %loopexit1 4409; EPILOG-BLOCK: loopexit1: 4410; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 4411; EPILOG-BLOCK-NEXT: ret i32 %sext3 4412; 4413; PROLOG-LABEL: @test7( 4414; PROLOG-NEXT: bb: 4415; PROLOG-NEXT: %i = icmp slt i32 undef, 2 4416; PROLOG-NEXT: %sext = sext i32 undef to i64 4417; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 4418; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4419; PROLOG: preheader: 4420; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 4421; PROLOG-NEXT: %1 = add nsw i64 %sext, -2 4422; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4423; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4424; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4425; PROLOG: header.prol.preheader: 4426; PROLOG-NEXT: br label %header.prol 4427; PROLOG: header.prol: 4428; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 4429; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4430; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 4431; PROLOG: latch.prol: 4432; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 4433; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 4434; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4435; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4436; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11 4437; PROLOG: header.prol.loopexit.unr-lcssa: 4438; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 4439; PROLOG-NEXT: br label %header.prol.loopexit 4440; PROLOG: header.prol.loopexit: 4441; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 4442; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4443; PROLOG-NEXT: br i1 %2, label %latchexit, label %preheader.new 4444; PROLOG: preheader.new: 4445; PROLOG-NEXT: br label %header 4446; PROLOG: header: 4447; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 4448; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4449; PROLOG: latch: 4450; PROLOG-NEXT: %add = add nuw nsw i64 %i6, 1 4451; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4452; PROLOG: latch.1: 4453; PROLOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 4454; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4455; PROLOG: latch.2: 4456; PROLOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 4457; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4458; PROLOG: latch.3: 4459; PROLOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 4460; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4461; PROLOG: latch.4: 4462; PROLOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 4463; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4464; PROLOG: latch.5: 4465; PROLOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 4466; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4467; PROLOG: latch.6: 4468; PROLOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 4469; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4470; PROLOG: latch.7: 4471; PROLOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4472; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 4473; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 4474; PROLOG: latchexit.unr-lcssa: 4475; PROLOG-NEXT: br label %latchexit 4476; PROLOG: latchexit: 4477; PROLOG-NEXT: unreachable 4478; PROLOG: loopexit2: 4479; PROLOG-NEXT: ret i32 %shft 4480; PROLOG: loopexit1.loopexit: 4481; 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 ] 4482; PROLOG-NEXT: br label %loopexit1 4483; PROLOG: loopexit1.loopexit1: 4484; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 4485; PROLOG-NEXT: br label %loopexit1 4486; PROLOG: loopexit1: 4487; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4488; PROLOG-NEXT: ret i32 %sext3 4489; 4490; PROLOG-BLOCK-LABEL: @test7( 4491; PROLOG-BLOCK-NEXT: bb: 4492; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4493; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4494; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4495; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4496; PROLOG-BLOCK: preheader: 4497; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4498; PROLOG-BLOCK-NEXT: %1 = add nsw i64 %sext, -2 4499; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4500; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4501; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4502; PROLOG-BLOCK: header.prol.preheader: 4503; PROLOG-BLOCK-NEXT: br label %header.prol 4504; PROLOG-BLOCK: header.prol: 4505; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 4506; PROLOG-BLOCK: latch.prol: 4507; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4508; PROLOG-BLOCK: header.prol.loopexit: 4509; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ] 4510; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4511; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %preheader.new 4512; PROLOG-BLOCK: preheader.new: 4513; PROLOG-BLOCK-NEXT: br label %header 4514; PROLOG-BLOCK: header: 4515; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 4516; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4517; PROLOG-BLOCK: latch: 4518; PROLOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 4519; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4520; PROLOG-BLOCK: latch.1: 4521; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4522; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 4523; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11 4524; PROLOG-BLOCK: latchexit.unr-lcssa: 4525; PROLOG-BLOCK-NEXT: br label %latchexit 4526; PROLOG-BLOCK: latchexit: 4527; PROLOG-BLOCK-NEXT: unreachable 4528; PROLOG-BLOCK: loopexit2: 4529; PROLOG-BLOCK-NEXT: ret i32 %shft 4530; PROLOG-BLOCK: loopexit1.loopexit: 4531; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4532; PROLOG-BLOCK-NEXT: br label %loopexit1 4533; PROLOG-BLOCK: loopexit1: 4534; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 4535; PROLOG-BLOCK-NEXT: ret i32 %sext3 4536; 4537bb: 4538 %i = icmp slt i32 undef, 2 4539 %sext = sext i32 undef to i64 4540 %shft = ashr exact i32 %arg, 16 4541 br i1 %i, label %loopexit2, label %preheader 4542 4543preheader: ; preds = %bb2 4544 br label %header 4545 4546header: ; preds = %latch, %preheader 4547 %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4548 br i1 false, label %loopexit1, label %latch 4549 4550latch: ; preds = %header 4551 %add = add nuw nsw i64 %i6, 1 4552 %i9 = icmp slt i64 %add, %sext 4553 br i1 %i9, label %header, label %latchexit 4554 4555latchexit: ; preds = %latch 4556 unreachable 4557 4558loopexit2: ; preds = %bb2 4559 ret i32 %shft 4560 4561loopexit1: ; preds = %header 4562 %sext3 = phi i32 [ %shft, %header ] 4563 ret i32 %sext3 4564} 4565 4566; Nested loop and inner loop is unrolled. The tricky bit here is that 4567; several blocks in the inner loop fall out of the outer block when we 4568; use the epilogue block remainder strategy. 4569define void @test8() { 4570; EPILOG-LABEL: @test8( 4571; EPILOG-NEXT: bb: 4572; EPILOG-NEXT: br label %outerloop 4573; EPILOG: outerloop.loopexit.loopexit: 4574; EPILOG-NEXT: br label %outerloop.loopexit 4575; EPILOG: outerloop.loopexit.loopexit1: 4576; EPILOG-NEXT: br label %outerloop.loopexit 4577; EPILOG: outerloop.loopexit: 4578; EPILOG-NEXT: br label %outerloop 4579; EPILOG: outerloop: 4580; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4581; EPILOG-NEXT: %0 = sub i64 100, %i 4582; EPILOG-NEXT: %1 = sub i64 99, %i 4583; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4584; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4585; EPILOG-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4586; EPILOG: outerloop.new: 4587; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4588; EPILOG-NEXT: br label %innerH 4589; EPILOG: innerH: 4590; EPILOG-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ] 4591; EPILOG-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ] 4592; EPILOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4593; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4594; EPILOG: latch: 4595; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4596; EPILOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4597; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4598; EPILOG: latch.1: 4599; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 4600; EPILOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4601; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4602; EPILOG: latch.2: 4603; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 4604; EPILOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4605; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4606; EPILOG: latch.3: 4607; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 4608; EPILOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4609; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4610; EPILOG: latch.4: 4611; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 4612; EPILOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4613; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4614; EPILOG: latch.5: 4615; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 4616; EPILOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4617; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4618; EPILOG: latch.6: 4619; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 4620; EPILOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4621; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4622; EPILOG: latch.7: 4623; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 4624; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4625; EPILOG-NEXT: br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit 4626; EPILOG: exit.unr-lcssa.loopexit: 4627; EPILOG-NEXT: %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ] 4628; EPILOG-NEXT: br label %exit.unr-lcssa 4629; EPILOG: exit.unr-lcssa: 4630; EPILOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ] 4631; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4632; EPILOG-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4633; EPILOG: innerH.epil.preheader: 4634; EPILOG-NEXT: br label %innerH.epil 4635; EPILOG: innerH.epil: 4636; EPILOG-NEXT: %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ] 4637; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4638; EPILOG-NEXT: %i4.epil = add nuw nsw i64 %i3.epil, 1 4639; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil 4640; EPILOG: latch.epil: 4641; EPILOG-NEXT: %i6.epil = icmp ult i64 %i4.epil, 100 4642; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4643; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4644; EPILOG-NEXT: br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12 4645; EPILOG: exit.epilog-lcssa: 4646; EPILOG-NEXT: br label %exit 4647; EPILOG: exit.loopexit: 4648; EPILOG-NEXT: br label %exit 4649; EPILOG: exit: 4650; EPILOG-NEXT: ret void 4651; 4652; EPILOG-BLOCK-LABEL: @test8( 4653; EPILOG-BLOCK-NEXT: bb: 4654; EPILOG-BLOCK-NEXT: br label %outerloop 4655; EPILOG-BLOCK: outerloop.loopexit.loopexit: 4656; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit 4657; EPILOG-BLOCK: outerloop.loopexit: 4658; EPILOG-BLOCK-NEXT: br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1 4659; EPILOG-BLOCK: outerloop.new.1: 4660; EPILOG-BLOCK-NEXT: br label %innerH.1 4661; EPILOG-BLOCK: innerH.1: 4662; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4663; EPILOG-BLOCK-NEXT: %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 4664; EPILOG-BLOCK-NEXT: %i4.12 = add nuw nsw i64 %i3.1, 1 4665; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14 4666; EPILOG-BLOCK: latch.14: 4667; EPILOG-BLOCK-NEXT: %niter.next.13 = add nuw nsw i64 %niter.1, 1 4668; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.12, 1 4669; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4670; EPILOG-BLOCK: latch.1.1: 4671; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i64 %niter.next.13, 1 4672; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100 4673; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12 4674; EPILOG-BLOCK: exit.unr-lcssa.loopexit.1: 4675; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa.1 4676; EPILOG-BLOCK: outerloop.loopexit.loopexit.1: 4677; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4678; EPILOG-BLOCK: exit.unr-lcssa.1: 4679; EPILOG-BLOCK-NEXT: br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit 4680; EPILOG-BLOCK: innerH.epil.preheader.1: 4681; EPILOG-BLOCK-NEXT: br label %innerH.epil.1 4682; EPILOG-BLOCK: innerH.epil.1: 4683; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.epil 4684; EPILOG-BLOCK: outerloop.loopexit.1: 4685; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4686; EPILOG-BLOCK: outerloop: 4687; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4688; EPILOG-BLOCK-NEXT: %0 = sub i64 100, %i 4689; EPILOG-BLOCK-NEXT: %1 = sub i64 99, %i 4690; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4691; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4692; EPILOG-BLOCK-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4693; EPILOG-BLOCK: outerloop.new: 4694; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4695; EPILOG-BLOCK-NEXT: br label %innerH 4696; EPILOG-BLOCK: innerH: 4697; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ] 4698; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ] 4699; EPILOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4700; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4701; EPILOG-BLOCK: latch: 4702; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4703; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4704; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4705; EPILOG-BLOCK: latch.1: 4706; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 4707; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4708; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4709; EPILOG-BLOCK: exit.unr-lcssa.loopexit: 4710; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa 4711; EPILOG-BLOCK: exit.unr-lcssa: 4712; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4713; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4714; EPILOG-BLOCK: innerH.epil.preheader: 4715; EPILOG-BLOCK-NEXT: br label %innerH.epil 4716; EPILOG-BLOCK: innerH.epil: 4717; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.epil 4718; EPILOG-BLOCK: latch.epil: 4719; EPILOG-BLOCK-NEXT: br label %exit 4720; EPILOG-BLOCK: exit.loopexit: 4721; EPILOG-BLOCK-NEXT: br label %exit 4722; EPILOG-BLOCK: exit: 4723; EPILOG-BLOCK-NEXT: ret void 4724; 4725; PROLOG-LABEL: @test8( 4726; PROLOG-NEXT: bb: 4727; PROLOG-NEXT: br label %outerloop 4728; PROLOG: outerloop.loopexit.loopexit: 4729; PROLOG-NEXT: br label %outerloop.loopexit 4730; PROLOG: outerloop.loopexit.loopexit1: 4731; PROLOG-NEXT: br label %outerloop.loopexit 4732; PROLOG: outerloop.loopexit: 4733; PROLOG-NEXT: br label %outerloop 4734; PROLOG: outerloop: 4735; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4736; PROLOG-NEXT: %0 = sub i64 100, %i 4737; PROLOG-NEXT: %1 = sub i64 99, %i 4738; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4739; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4740; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4741; PROLOG: innerH.prol.preheader: 4742; PROLOG-NEXT: br label %innerH.prol 4743; PROLOG: innerH.prol: 4744; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 4745; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4746; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4747; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4748; PROLOG: latch.prol: 4749; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 4750; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4751; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4752; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12 4753; PROLOG: innerH.prol.loopexit.unr-lcssa: 4754; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4755; PROLOG-NEXT: br label %innerH.prol.loopexit 4756; PROLOG: innerH.prol.loopexit: 4757; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4758; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4759; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4760; PROLOG: outerloop.new: 4761; PROLOG-NEXT: br label %innerH 4762; PROLOG: innerH: 4763; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4764; PROLOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4765; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4766; PROLOG: latch: 4767; PROLOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4768; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4769; PROLOG: latch.1: 4770; PROLOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 4771; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4772; PROLOG: latch.2: 4773; PROLOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 4774; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4775; PROLOG: latch.3: 4776; PROLOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 4777; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4778; PROLOG: latch.4: 4779; PROLOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 4780; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4781; PROLOG: latch.5: 4782; PROLOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 4783; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4784; PROLOG: latch.6: 4785; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 4786; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4787; PROLOG: latch.7: 4788; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 4789; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4790; PROLOG: exit.unr-lcssa: 4791; PROLOG-NEXT: br label %exit 4792; PROLOG: exit.loopexit: 4793; PROLOG-NEXT: br label %exit 4794; PROLOG: exit: 4795; PROLOG-NEXT: ret void 4796; 4797; PROLOG-BLOCK-LABEL: @test8( 4798; PROLOG-BLOCK-NEXT: bb: 4799; PROLOG-BLOCK-NEXT: br label %outerloop 4800; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4801; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4802; PROLOG-BLOCK: outerloop.loopexit: 4803; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1 4804; PROLOG-BLOCK: innerH.prol.preheader.1: 4805; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4806; PROLOG-BLOCK: innerH.prol.1: 4807; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4808; PROLOG-BLOCK: latch.prol.1: 4809; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4810; PROLOG-BLOCK: innerH.prol.loopexit.1: 4811; PROLOG-BLOCK-NEXT: %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ] 4812; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4813; PROLOG-BLOCK: outerloop.new.1: 4814; PROLOG-BLOCK-NEXT: br label %innerH.1 4815; PROLOG-BLOCK: innerH.1: 4816; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4817; PROLOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4818; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4819; PROLOG-BLOCK: latch.12: 4820; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 4821; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4822; PROLOG-BLOCK: latch.1.1: 4823; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4824; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12 4825; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4826; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4827; PROLOG-BLOCK: outerloop.loopexit.1: 4828; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4829; PROLOG-BLOCK: outerloop: 4830; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4831; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4832; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4833; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4834; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4835; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4836; PROLOG-BLOCK: innerH.prol.preheader: 4837; PROLOG-BLOCK-NEXT: br label %innerH.prol 4838; PROLOG-BLOCK: innerH.prol: 4839; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4840; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4841; PROLOG-BLOCK: latch.prol: 4842; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4843; PROLOG-BLOCK: innerH.prol.loopexit: 4844; PROLOG-BLOCK-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ] 4845; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4846; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4847; PROLOG-BLOCK: outerloop.new: 4848; PROLOG-BLOCK-NEXT: br label %innerH 4849; PROLOG-BLOCK: innerH: 4850; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ] 4851; PROLOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4852; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4853; PROLOG-BLOCK: latch: 4854; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 4855; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4856; PROLOG-BLOCK: latch.1: 4857; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4858; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4859; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4860; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4861; PROLOG-BLOCK: exit.unr-lcssa.loopexit3: 4862; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4863; PROLOG-BLOCK: exit.unr-lcssa: 4864; PROLOG-BLOCK-NEXT: br label %exit 4865; PROLOG-BLOCK: exit.loopexit: 4866; PROLOG-BLOCK-NEXT: br label %exit 4867; PROLOG-BLOCK: exit: 4868; PROLOG-BLOCK-NEXT: ret void 4869; 4870 4871bb: 4872 br label %outerloop 4873 4874outerloop: ; preds = %innerH, %bb 4875 %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4876 br label %innerH 4877 4878innerH: ; preds = %latch, %outerloop 4879 %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4880 %i4 = add nuw nsw i64 %i3, 1 4881 br i1 false, label %outerloop, label %latch 4882 4883latch: ; preds = %innerH 4884 %i6 = icmp ult i64 %i4, 100 4885 br i1 %i6, label %innerH, label %exit 4886 4887exit: ; preds = %latch 4888 ret void 4889} 4890 4891declare i8 addrspace(1)* @foo(i32) 4892; inner loop prolog unrolled 4893; a value from outer loop is used in exit block of inner loop. 4894; Don't create VMap entries for such values (%trip). 4895define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { 4896; EPILOG-LABEL: @test9( 4897; EPILOG-NEXT: bb: 4898; EPILOG-NEXT: %0 = add i32 %n, -1 4899; EPILOG-NEXT: %1 = add i32 %n, -2 4900; EPILOG-NEXT: br label %outerloopHdr 4901; EPILOG: outerloopHdr: 4902; EPILOG-NEXT: %trip = add i32 %n, -1 4903; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4904; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4905; EPILOG: preheader: 4906; EPILOG-NEXT: %i4 = zext i32 0 to i64 4907; EPILOG-NEXT: %xtraiter = and i32 %0, 7 4908; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 4909; EPILOG-NEXT: br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 4910; EPILOG: preheader.new: 4911; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter 4912; EPILOG-NEXT: br label %header 4913; EPILOG: header: 4914; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ] 4915; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4916; EPILOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4917; EPILOG: innerexit.loopexit: 4918; 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 ] 4919; EPILOG-NEXT: br label %innerexit 4920; EPILOG: innerexit.loopexit1: 4921; EPILOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ] 4922; EPILOG-NEXT: br label %innerexit 4923; EPILOG: innerexit: 4924; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4925; EPILOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4926; EPILOG-NEXT: ret i8 addrspace(1)* %i9 4927; EPILOG: latch: 4928; EPILOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 4929; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 4930; EPILOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4931; EPILOG: latch.1: 4932; EPILOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 4933; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 4934; EPILOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4935; EPILOG: latch.2: 4936; EPILOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 4937; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 4938; EPILOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4939; EPILOG: latch.3: 4940; EPILOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 4941; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 4942; EPILOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4943; EPILOG: latch.4: 4944; EPILOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 4945; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 4946; EPILOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4947; EPILOG: latch.5: 4948; EPILOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 4949; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 4950; EPILOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4951; EPILOG: latch.6: 4952; EPILOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 4953; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 4954; EPILOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 4955; EPILOG: latch.7: 4956; EPILOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 4957; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 4958; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 4959; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit 4960; EPILOG: outerLatch.loopexit.unr-lcssa.loopexit: 4961; EPILOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ] 4962; EPILOG-NEXT: br label %outerLatch.loopexit.unr-lcssa 4963; EPILOG: outerLatch.loopexit.unr-lcssa: 4964; EPILOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ] 4965; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4966; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 4967; EPILOG: header.epil.preheader: 4968; EPILOG-NEXT: br label %header.epil 4969; EPILOG: header.epil: 4970; EPILOG-NEXT: %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ] 4971; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4972; EPILOG-NEXT: %i7.epil = trunc i64 %phi.epil to i32 4973; EPILOG-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 4974; EPILOG: latch.epil: 4975; EPILOG-NEXT: %i11.epil = add nsw i32 %i7.epil, 1 4976; EPILOG-NEXT: %innercnd.epil = icmp slt i32 %i11.epil, %trip 4977; EPILOG-NEXT: %iv.next.epil = add nuw nsw i64 %phi.epil, 1 4978; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 4979; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 4980; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13 4981; EPILOG: outerLatch.loopexit.epilog-lcssa: 4982; EPILOG-NEXT: br label %outerLatch.loopexit 4983; EPILOG: outerLatch.loopexit: 4984; EPILOG-NEXT: br label %outerLatch 4985; EPILOG: outerLatch: 4986; EPILOG-NEXT: br label %outerloopHdr 4987; 4988; EPILOG-BLOCK-LABEL: @test9( 4989; EPILOG-BLOCK-NEXT: bb: 4990; EPILOG-BLOCK-NEXT: %0 = add i32 %n, -1 4991; EPILOG-BLOCK-NEXT: %1 = add i32 %n, -2 4992; EPILOG-BLOCK-NEXT: br label %outerloopHdr 4993; EPILOG-BLOCK: outerloopHdr: 4994; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 4995; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4996; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4997; EPILOG-BLOCK: preheader: 4998; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 4999; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 5000; EPILOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 5001; EPILOG-BLOCK: preheader.new: 5002; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter 5003; EPILOG-BLOCK-NEXT: br label %header 5004; EPILOG-BLOCK: header: 5005; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ] 5006; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 5007; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5008; EPILOG-BLOCK: innerexit.loopexit.loopexit: 5009; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5010; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5011; EPILOG-BLOCK: innerexit.loopexit.loopexit6: 5012; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ] 5013; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5014; EPILOG-BLOCK: innerexit.loopexit: 5015; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ] 5016; EPILOG-BLOCK-NEXT: br label %innerexit 5017; EPILOG-BLOCK: innerexit.loopexit1: 5018; EPILOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ] 5019; EPILOG-BLOCK-NEXT: br label %innerexit 5020; EPILOG-BLOCK: innerexit: 5021; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5022; EPILOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5023; EPILOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5024; EPILOG-BLOCK: latch: 5025; EPILOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5026; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 5027; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5028; EPILOG-BLOCK: latch.1: 5029; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5030; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 5031; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 5032; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14 5033; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit: 5034; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa 5035; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5036; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5037; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 5038; EPILOG-BLOCK: header.epil.preheader: 5039; EPILOG-BLOCK-NEXT: br label %header.epil 5040; EPILOG-BLOCK: header.epil: 5041; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 5042; EPILOG-BLOCK: latch.epil: 5043; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit 5044; EPILOG-BLOCK: outerLatch.loopexit: 5045; EPILOG-BLOCK-NEXT: br label %outerLatch 5046; EPILOG-BLOCK: outerLatch: 5047; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5048; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5049; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5050; EPILOG-BLOCK: preheader.1: 5051; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 5052; EPILOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 5053; EPILOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 5054; EPILOG-BLOCK: preheader.new.1: 5055; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %0, %xtraiter.1 5056; EPILOG-BLOCK-NEXT: br label %header.1 5057; EPILOG-BLOCK: header.1: 5058; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5059; EPILOG-BLOCK-NEXT: %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 5060; EPILOG-BLOCK-NEXT: br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6 5061; EPILOG-BLOCK: latch.15: 5062; EPILOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5063; EPILOG-BLOCK-NEXT: %niter.next.14 = add nuw nsw i32 %niter.1, 1 5064; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6 5065; EPILOG-BLOCK: latch.1.1: 5066; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 5067; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i32 %niter.next.14, 1 5068; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1 5069; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14 5070; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit.1: 5071; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa.1 5072; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5073; EPILOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5074; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1 5075; EPILOG-BLOCK: header.epil.preheader.1: 5076; EPILOG-BLOCK-NEXT: br label %header.epil.1 5077; EPILOG-BLOCK: header.epil.1: 5078; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil.1, label %innerexit.loopexit1 5079; EPILOG-BLOCK: latch.epil.1: 5080; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5081; EPILOG-BLOCK: outerLatch.loopexit.1: 5082; EPILOG-BLOCK-NEXT: br label %outerLatch.1 5083; EPILOG-BLOCK: outerLatch.1: 5084; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5085; 5086; PROLOG-LABEL: @test9( 5087; PROLOG-NEXT: bb: 5088; PROLOG-NEXT: %0 = add i32 %n, -1 5089; PROLOG-NEXT: %1 = add i32 %n, -2 5090; PROLOG-NEXT: br label %outerloopHdr 5091; PROLOG: outerloopHdr: 5092; PROLOG-NEXT: %trip = add i32 %n, -1 5093; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 5094; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5095; PROLOG: preheader: 5096; PROLOG-NEXT: %i4 = zext i32 0 to i64 5097; PROLOG-NEXT: %xtraiter = and i32 %0, 7 5098; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5099; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5100; PROLOG: header.prol.preheader: 5101; PROLOG-NEXT: br label %header.prol 5102; PROLOG: header.prol: 5103; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 5104; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 5105; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 5106; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5107; PROLOG: latch.prol: 5108; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 5109; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 5110; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 5111; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 5112; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 5113; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13 5114; PROLOG: header.prol.loopexit.unr-lcssa: 5115; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 5116; PROLOG-NEXT: br label %header.prol.loopexit 5117; PROLOG: header.prol.loopexit: 5118; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 5119; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 5120; PROLOG-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 5121; PROLOG: preheader.new: 5122; PROLOG-NEXT: br label %header 5123; PROLOG: header: 5124; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 5125; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 5126; PROLOG: innerexit.loopexit: 5127; 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 ] 5128; PROLOG-NEXT: br label %innerexit 5129; PROLOG: innerexit.loopexit1: 5130; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 5131; PROLOG-NEXT: br label %innerexit 5132; PROLOG: innerexit: 5133; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5134; PROLOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5135; PROLOG-NEXT: ret i8 addrspace(1)* %i9 5136; PROLOG: latch: 5137; PROLOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5138; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 5139; PROLOG: latch.1: 5140; PROLOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5141; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 5142; PROLOG: latch.2: 5143; PROLOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 5144; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 5145; PROLOG: latch.3: 5146; PROLOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 5147; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 5148; PROLOG: latch.4: 5149; PROLOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 5150; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 5151; PROLOG: latch.5: 5152; PROLOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 5153; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 5154; PROLOG: latch.6: 5155; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 5156; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 5157; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 5158; PROLOG: latch.7: 5159; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 5160; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 5161; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 5162; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 5163; PROLOG: outerLatch.loopexit.unr-lcssa: 5164; PROLOG-NEXT: br label %outerLatch.loopexit 5165; PROLOG: outerLatch.loopexit: 5166; PROLOG-NEXT: br label %outerLatch 5167; PROLOG: outerLatch: 5168; PROLOG-NEXT: br label %outerloopHdr 5169; 5170; PROLOG-BLOCK-LABEL: @test9( 5171; PROLOG-BLOCK-NEXT: bb: 5172; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 5173; PROLOG-BLOCK-NEXT: %1 = add i32 %n, -2 5174; PROLOG-BLOCK-NEXT: br label %outerloopHdr 5175; PROLOG-BLOCK: outerloopHdr: 5176; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 5177; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 5178; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5179; PROLOG-BLOCK: preheader: 5180; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 5181; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5182; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5183; PROLOG-BLOCK: header.prol.preheader: 5184; PROLOG-BLOCK-NEXT: br label %header.prol 5185; PROLOG-BLOCK: header.prol: 5186; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5187; PROLOG-BLOCK: latch.prol: 5188; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 5189; PROLOG-BLOCK: header.prol.loopexit: 5190; PROLOG-BLOCK-NEXT: %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ] 5191; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 5192; PROLOG-BLOCK-NEXT: br i1 %2, label %outerLatch.loopexit, label %preheader.new 5193; PROLOG-BLOCK: preheader.new: 5194; PROLOG-BLOCK-NEXT: br label %header 5195; PROLOG-BLOCK: header: 5196; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ] 5197; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5198; PROLOG-BLOCK: innerexit.loopexit.loopexit: 5199; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5200; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5201; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 5202; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 5203; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5204; PROLOG-BLOCK: innerexit.loopexit: 5205; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 5206; PROLOG-BLOCK-NEXT: br label %innerexit 5207; PROLOG-BLOCK: innerexit.loopexit1: 5208; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 5209; PROLOG-BLOCK-NEXT: br label %innerexit 5210; PROLOG-BLOCK: innerexit: 5211; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5212; PROLOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5213; PROLOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5214; PROLOG-BLOCK: latch: 5215; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5216; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 5217; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5218; PROLOG-BLOCK: latch.1: 5219; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 5220; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 5221; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5222; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14 5223; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5224; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 5225; PROLOG-BLOCK: outerLatch.loopexit: 5226; PROLOG-BLOCK-NEXT: br label %outerLatch 5227; PROLOG-BLOCK: outerLatch: 5228; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5229; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5230; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5231; PROLOG-BLOCK: preheader.1: 5232; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 5233; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5234; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1 5235; PROLOG-BLOCK: header.prol.preheader.1: 5236; PROLOG-BLOCK-NEXT: br label %header.prol.1 5237; PROLOG-BLOCK: header.prol.1: 5238; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 5239; PROLOG-BLOCK: latch.prol.1: 5240; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 5241; PROLOG-BLOCK: header.prol.loopexit.1: 5242; PROLOG-BLOCK-NEXT: %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ] 5243; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 5244; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1 5245; PROLOG-BLOCK: preheader.new.1: 5246; PROLOG-BLOCK-NEXT: br label %header.1 5247; PROLOG-BLOCK: header.1: 5248; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5249; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 5250; PROLOG-BLOCK: latch.14: 5251; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5252; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 5253; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 5254; PROLOG-BLOCK: latch.1.1: 5255; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 5256; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 5257; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 5258; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14 5259; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5260; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5261; PROLOG-BLOCK: outerLatch.loopexit.1: 5262; PROLOG-BLOCK-NEXT: br label %outerLatch.1 5263; PROLOG-BLOCK: outerLatch.1: 5264; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5265; 5266bb: 5267 br label %outerloopHdr 5268 5269outerloopHdr: ; preds = %outerLatch, %bb 5270 %trip = add i32 %n, -1 5271 %outercnd = icmp slt i32 0, %trip 5272 br i1 %outercnd, label %preheader, label %outerLatch 5273 5274preheader: ; preds = %outerloopHdr 5275 %i4 = zext i32 0 to i64 5276 br label %header 5277 5278header: ; preds = %latch, %preheader 5279 %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 5280 %i7 = trunc i64 %phi to i32 5281 br i1 true, label %latch, label %innerexit 5282 5283innerexit: ; preds = %header 5284 %i9 = call i8 addrspace(1)* @foo(i32 %trip) 5285 ret i8 addrspace(1)* %i9 5286 5287latch: ; preds = %header 5288 %i11 = add nsw i32 %i7, 1 5289 %innercnd = icmp slt i32 %i11, %trip 5290 %iv.next = add nuw nsw i64 %phi, 1 5291 br i1 %innercnd, label %header, label %outerLatch 5292 5293outerLatch: ; preds = %latch, %outerloopHdr 5294 br label %outerloopHdr 5295} 5296 5297declare void @bar() 5298 5299; This is a case where we should be able to eliminate N-1 copies 5300; of the early exit test in the main loop when runtime unrolling 5301; by N. 5302define void @test10(i64 %trip, i64 %trip2) { 5303; EPILOG-LABEL: @test10( 5304; EPILOG-NEXT: entry: 5305; EPILOG-NEXT: %0 = add i64 %trip, -1 5306; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5307; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5308; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5309; EPILOG: entry.new: 5310; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5311; EPILOG-NEXT: br label %loop_header 5312; EPILOG: loop_header: 5313; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5314; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5315; EPILOG-NEXT: call void @bar() 5316; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5317; EPILOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5318; EPILOG: loop_latch: 5319; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5320; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5321; EPILOG-NEXT: call void @bar() 5322; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5323; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5324; EPILOG: loop_latch.1: 5325; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5326; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5327; EPILOG-NEXT: call void @bar() 5328; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5329; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5330; EPILOG: loop_latch.2: 5331; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5332; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5333; EPILOG-NEXT: call void @bar() 5334; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5335; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5336; EPILOG: loop_latch.3: 5337; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5338; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5339; EPILOG-NEXT: call void @bar() 5340; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5341; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5342; EPILOG: loop_latch.4: 5343; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5344; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5345; EPILOG-NEXT: call void @bar() 5346; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5347; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5348; EPILOG: loop_latch.5: 5349; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5350; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5351; EPILOG-NEXT: call void @bar() 5352; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5353; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5354; EPILOG: loop_latch.6: 5355; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5356; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5357; EPILOG-NEXT: call void @bar() 5358; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5359; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5360; EPILOG: loop_latch.7: 5361; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5362; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5363; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5364; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5365; EPILOG: exit1.loopexit: 5366; EPILOG-NEXT: br label %exit1 5367; EPILOG: exit1.loopexit1: 5368; EPILOG-NEXT: br label %exit1 5369; EPILOG: exit1: 5370; EPILOG-NEXT: ret void 5371; EPILOG: exit2.unr-lcssa.loopexit: 5372; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5373; EPILOG-NEXT: br label %exit2.unr-lcssa 5374; EPILOG: exit2.unr-lcssa: 5375; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5376; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5377; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5378; EPILOG: loop_header.epil.preheader: 5379; EPILOG-NEXT: br label %loop_header.epil 5380; EPILOG: loop_header.epil: 5381; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5382; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5383; EPILOG-NEXT: call void @bar() 5384; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5385; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1 5386; EPILOG: loop_latch.epil: 5387; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5388; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5389; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5390; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5391; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14 5392; EPILOG: exit2.epilog-lcssa: 5393; EPILOG-NEXT: br label %exit2 5394; EPILOG: exit2: 5395; EPILOG-NEXT: ret void 5396; 5397; EPILOG-BLOCK-LABEL: @test10( 5398; EPILOG-BLOCK-NEXT: entry: 5399; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5400; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5401; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5402; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5403; EPILOG-BLOCK: entry.new: 5404; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5405; EPILOG-BLOCK-NEXT: br label %loop_header 5406; EPILOG-BLOCK: loop_header: 5407; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5408; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5409; EPILOG-BLOCK-NEXT: call void @bar() 5410; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5411; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5412; EPILOG-BLOCK: loop_latch: 5413; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5414; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5415; EPILOG-BLOCK-NEXT: call void @bar() 5416; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5417; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5418; EPILOG-BLOCK: loop_latch.1: 5419; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5420; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 5421; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5422; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16 5423; EPILOG-BLOCK: exit1.loopexit: 5424; EPILOG-BLOCK-NEXT: br label %exit1 5425; EPILOG-BLOCK: exit1: 5426; EPILOG-BLOCK-NEXT: ret void 5427; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5428; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 5429; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5430; EPILOG-BLOCK: exit2.unr-lcssa: 5431; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5432; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5433; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5434; EPILOG-BLOCK: loop_header.epil.preheader: 5435; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5436; EPILOG-BLOCK: loop_header.epil: 5437; EPILOG-BLOCK-NEXT: call void @bar() 5438; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 5439; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1 5440; EPILOG-BLOCK: loop_latch.epil: 5441; EPILOG-BLOCK-NEXT: br label %exit2 5442; EPILOG-BLOCK: exit2: 5443; EPILOG-BLOCK-NEXT: ret void 5444; 5445; PROLOG-LABEL: @test10( 5446; PROLOG-NEXT: entry: 5447; PROLOG-NEXT: %0 = add i64 %trip, -1 5448; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 5449; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5450; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5451; PROLOG: loop_header.prol.preheader: 5452; PROLOG-NEXT: br label %loop_header.prol 5453; PROLOG: loop_header.prol: 5454; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5455; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5456; PROLOG-NEXT: call void @bar() 5457; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 5458; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1 5459; PROLOG: loop_latch.prol: 5460; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5461; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5462; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5463; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5464; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14 5465; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5466; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5467; PROLOG-NEXT: br label %loop_header.prol.loopexit 5468; PROLOG: loop_header.prol.loopexit: 5469; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5470; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 5471; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new 5472; PROLOG: entry.new: 5473; PROLOG-NEXT: br label %loop_header 5474; PROLOG: loop_header: 5475; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5476; PROLOG-NEXT: call void @bar() 5477; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5478; PROLOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5479; PROLOG: loop_latch: 5480; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5481; PROLOG-NEXT: call void @bar() 5482; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5483; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5484; PROLOG: loop_latch.1: 5485; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5486; PROLOG-NEXT: call void @bar() 5487; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5488; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5489; PROLOG: loop_latch.2: 5490; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5491; PROLOG-NEXT: call void @bar() 5492; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5493; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5494; PROLOG: loop_latch.3: 5495; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5496; PROLOG-NEXT: call void @bar() 5497; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5498; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5499; PROLOG: loop_latch.4: 5500; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5501; PROLOG-NEXT: call void @bar() 5502; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5503; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5504; PROLOG: loop_latch.5: 5505; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5506; PROLOG-NEXT: call void @bar() 5507; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5508; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5509; PROLOG: loop_latch.6: 5510; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5511; PROLOG-NEXT: call void @bar() 5512; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5513; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5514; PROLOG: loop_latch.7: 5515; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5516; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5517; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5518; PROLOG: exit1.loopexit: 5519; PROLOG-NEXT: br label %exit1 5520; PROLOG: exit1.loopexit1: 5521; PROLOG-NEXT: br label %exit1 5522; PROLOG: exit1: 5523; PROLOG-NEXT: ret void 5524; PROLOG: exit2.unr-lcssa: 5525; PROLOG-NEXT: br label %exit2 5526; PROLOG: exit2: 5527; PROLOG-NEXT: ret void 5528; 5529; PROLOG-BLOCK-LABEL: @test10( 5530; PROLOG-BLOCK-NEXT: entry: 5531; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5532; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5533; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5534; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5535; PROLOG-BLOCK: loop_header.prol.preheader: 5536; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5537; PROLOG-BLOCK: loop_header.prol: 5538; PROLOG-BLOCK-NEXT: call void @bar() 5539; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 5540; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1 5541; PROLOG-BLOCK: loop_latch.prol: 5542; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5543; PROLOG-BLOCK: loop_header.prol.loopexit: 5544; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5545; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5546; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new 5547; PROLOG-BLOCK: entry.new: 5548; PROLOG-BLOCK-NEXT: br label %loop_header 5549; PROLOG-BLOCK: loop_header: 5550; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5551; PROLOG-BLOCK-NEXT: call void @bar() 5552; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5553; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5554; PROLOG-BLOCK: loop_latch: 5555; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5556; PROLOG-BLOCK-NEXT: call void @bar() 5557; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5558; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5559; PROLOG-BLOCK: loop_latch.1: 5560; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5561; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5562; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16 5563; PROLOG-BLOCK: exit1.loopexit: 5564; PROLOG-BLOCK-NEXT: br label %exit1 5565; PROLOG-BLOCK: exit1: 5566; PROLOG-BLOCK-NEXT: ret void 5567; PROLOG-BLOCK: exit2.unr-lcssa: 5568; PROLOG-BLOCK-NEXT: br label %exit2 5569; PROLOG-BLOCK: exit2: 5570; PROLOG-BLOCK-NEXT: ret void 5571; 5572entry: 5573 br label %loop_header 5574 5575loop_header: 5576 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5577 call void @bar() 5578 %cmp_early = icmp ne i64 %iv, %trip2 5579 br i1 %cmp_early, label %loop_latch, label %exit1 5580 5581loop_latch: 5582 %iv_next = add i64 %iv, 1 5583 %cmp = icmp ne i64 %iv_next, %trip 5584 br i1 %cmp, label %loop_header, label %exit2 5585 5586exit1: 5587 ret void 5588 5589exit2: 5590 ret void 5591} 5592 5593; With a loop invariant, we can eliminate the last N-1 5594; copies of the exit test in the unrolled main loop body. 5595define void @test11(i64 %trip, i1 %cond) { 5596; EPILOG-LABEL: @test11( 5597; EPILOG-NEXT: entry: 5598; EPILOG-NEXT: %0 = add i64 %trip, -1 5599; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5600; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5601; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5602; EPILOG: entry.new: 5603; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5604; EPILOG-NEXT: br label %loop_header 5605; EPILOG: loop_header: 5606; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5607; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5608; EPILOG-NEXT: call void @bar() 5609; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5610; EPILOG: loop_latch: 5611; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5612; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5613; EPILOG-NEXT: call void @bar() 5614; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5615; EPILOG: loop_latch.1: 5616; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5617; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5618; EPILOG-NEXT: call void @bar() 5619; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5620; EPILOG: loop_latch.2: 5621; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5622; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5623; EPILOG-NEXT: call void @bar() 5624; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5625; EPILOG: loop_latch.3: 5626; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5627; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5628; EPILOG-NEXT: call void @bar() 5629; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5630; EPILOG: loop_latch.4: 5631; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5632; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5633; EPILOG-NEXT: call void @bar() 5634; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5635; EPILOG: loop_latch.5: 5636; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5637; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5638; EPILOG-NEXT: call void @bar() 5639; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5640; EPILOG: loop_latch.6: 5641; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5642; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5643; EPILOG-NEXT: call void @bar() 5644; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5645; EPILOG: loop_latch.7: 5646; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5647; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5648; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5649; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5650; EPILOG: exit1.loopexit: 5651; EPILOG-NEXT: br label %exit1 5652; EPILOG: exit1.loopexit1: 5653; EPILOG-NEXT: br label %exit1 5654; EPILOG: exit1: 5655; EPILOG-NEXT: ret void 5656; EPILOG: exit2.unr-lcssa.loopexit: 5657; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5658; EPILOG-NEXT: br label %exit2.unr-lcssa 5659; EPILOG: exit2.unr-lcssa: 5660; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5661; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5662; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5663; EPILOG: loop_header.epil.preheader: 5664; EPILOG-NEXT: br label %loop_header.epil 5665; EPILOG: loop_header.epil: 5666; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5667; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5668; EPILOG-NEXT: call void @bar() 5669; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1 5670; EPILOG: loop_latch.epil: 5671; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5672; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5673; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5674; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5675; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15 5676; EPILOG: exit2.epilog-lcssa: 5677; EPILOG-NEXT: br label %exit2 5678; EPILOG: exit2: 5679; EPILOG-NEXT: ret void 5680; 5681; EPILOG-BLOCK-LABEL: @test11( 5682; EPILOG-BLOCK-NEXT: entry: 5683; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5684; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5685; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5686; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new 5687; EPILOG-BLOCK: entry.new: 5688; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5689; EPILOG-BLOCK-NEXT: br label %loop_header 5690; EPILOG-BLOCK: loop_header: 5691; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5692; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5693; EPILOG-BLOCK-NEXT: call void @bar() 5694; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5695; EPILOG-BLOCK: loop_latch: 5696; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5697; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5698; EPILOG-BLOCK-NEXT: call void @bar() 5699; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5700; EPILOG-BLOCK: loop_latch.1: 5701; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5702; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 5703; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5704; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17 5705; EPILOG-BLOCK: exit1.loopexit: 5706; EPILOG-BLOCK-NEXT: br label %exit1 5707; EPILOG-BLOCK: exit1: 5708; EPILOG-BLOCK-NEXT: ret void 5709; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5710; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5711; EPILOG-BLOCK: exit2.unr-lcssa: 5712; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5713; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5714; EPILOG-BLOCK: loop_header.epil.preheader: 5715; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5716; EPILOG-BLOCK: loop_header.epil: 5717; EPILOG-BLOCK-NEXT: call void @bar() 5718; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1 5719; EPILOG-BLOCK: loop_latch.epil: 5720; EPILOG-BLOCK-NEXT: br label %exit2 5721; EPILOG-BLOCK: exit2: 5722; EPILOG-BLOCK-NEXT: ret void 5723; 5724; PROLOG-LABEL: @test11( 5725; PROLOG-NEXT: entry: 5726; PROLOG-NEXT: %0 = add i64 %trip, -1 5727; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 5728; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5729; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5730; PROLOG: loop_header.prol.preheader: 5731; PROLOG-NEXT: br label %loop_header.prol 5732; PROLOG: loop_header.prol: 5733; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5734; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5735; PROLOG-NEXT: call void @bar() 5736; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1 5737; PROLOG: loop_latch.prol: 5738; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5739; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5740; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5741; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5742; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15 5743; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5744; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5745; PROLOG-NEXT: br label %loop_header.prol.loopexit 5746; PROLOG: loop_header.prol.loopexit: 5747; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5748; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 5749; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new 5750; PROLOG: entry.new: 5751; PROLOG-NEXT: br label %loop_header 5752; PROLOG: loop_header: 5753; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5754; PROLOG-NEXT: call void @bar() 5755; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5756; PROLOG: loop_latch: 5757; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5758; PROLOG-NEXT: call void @bar() 5759; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5760; PROLOG: loop_latch.1: 5761; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5762; PROLOG-NEXT: call void @bar() 5763; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5764; PROLOG: loop_latch.2: 5765; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5766; PROLOG-NEXT: call void @bar() 5767; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5768; PROLOG: loop_latch.3: 5769; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5770; PROLOG-NEXT: call void @bar() 5771; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5772; PROLOG: loop_latch.4: 5773; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5774; PROLOG-NEXT: call void @bar() 5775; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5776; PROLOG: loop_latch.5: 5777; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5778; PROLOG-NEXT: call void @bar() 5779; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5780; PROLOG: loop_latch.6: 5781; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5782; PROLOG-NEXT: call void @bar() 5783; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5784; PROLOG: loop_latch.7: 5785; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5786; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5787; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5788; PROLOG: exit1.loopexit: 5789; PROLOG-NEXT: br label %exit1 5790; PROLOG: exit1.loopexit1: 5791; PROLOG-NEXT: br label %exit1 5792; PROLOG: exit1: 5793; PROLOG-NEXT: ret void 5794; PROLOG: exit2.unr-lcssa: 5795; PROLOG-NEXT: br label %exit2 5796; PROLOG: exit2: 5797; PROLOG-NEXT: ret void 5798; 5799; PROLOG-BLOCK-LABEL: @test11( 5800; PROLOG-BLOCK-NEXT: entry: 5801; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5802; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5803; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5804; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5805; PROLOG-BLOCK: loop_header.prol.preheader: 5806; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5807; PROLOG-BLOCK: loop_header.prol: 5808; PROLOG-BLOCK-NEXT: call void @bar() 5809; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1 5810; PROLOG-BLOCK: loop_latch.prol: 5811; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5812; PROLOG-BLOCK: loop_header.prol.loopexit: 5813; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5814; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5815; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new 5816; PROLOG-BLOCK: entry.new: 5817; PROLOG-BLOCK-NEXT: br label %loop_header 5818; PROLOG-BLOCK: loop_header: 5819; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5820; PROLOG-BLOCK-NEXT: call void @bar() 5821; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5822; PROLOG-BLOCK: loop_latch: 5823; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5824; PROLOG-BLOCK-NEXT: call void @bar() 5825; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5826; PROLOG-BLOCK: loop_latch.1: 5827; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5828; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5829; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17 5830; PROLOG-BLOCK: exit1.loopexit: 5831; PROLOG-BLOCK-NEXT: br label %exit1 5832; PROLOG-BLOCK: exit1: 5833; PROLOG-BLOCK-NEXT: ret void 5834; PROLOG-BLOCK: exit2.unr-lcssa: 5835; PROLOG-BLOCK-NEXT: br label %exit2 5836; PROLOG-BLOCK: exit2: 5837; PROLOG-BLOCK-NEXT: ret void 5838; 5839entry: 5840 br label %loop_header 5841 5842loop_header: 5843 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5844 call void @bar() 5845 br i1 %cond, label %loop_latch, label %exit1 5846 5847loop_latch: 5848 %iv_next = add i64 %iv, 1 5849 %cmp = icmp ne i64 %iv_next, %trip 5850 br i1 %cmp, label %loop_header, label %exit2 5851 5852exit1: 5853 ret void 5854 5855exit2: 5856 ret void 5857} 5858 5859; Combine a computeable and invariant test to make sure 5860; the interaction of both doesn't do anything weird 5861define void @test12(i64 %trip, i64 %trip2, i1 %cond) { 5862; EPILOG-LABEL: @test12( 5863; EPILOG-NEXT: entry: 5864; EPILOG-NEXT: %0 = add i64 %trip, -1 5865; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 5866; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 5867; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 5868; EPILOG: entry.new: 5869; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5870; EPILOG-NEXT: br label %loop_header 5871; EPILOG: loop_header: 5872; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5873; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5874; EPILOG-NEXT: call void @bar() 5875; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5876; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5877; EPILOG: loop_exiting_bb2: 5878; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5879; EPILOG: loop_latch: 5880; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5881; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5882; EPILOG-NEXT: call void @bar() 5883; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5884; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5885; EPILOG: loop_exiting_bb2.1: 5886; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5887; EPILOG: loop_latch.1: 5888; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 5889; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5890; EPILOG-NEXT: call void @bar() 5891; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5892; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 5893; EPILOG: loop_exiting_bb2.2: 5894; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 5895; EPILOG: loop_latch.2: 5896; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5897; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5898; EPILOG-NEXT: call void @bar() 5899; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5900; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 5901; EPILOG: loop_exiting_bb2.3: 5902; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 5903; EPILOG: loop_latch.3: 5904; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 5905; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5906; EPILOG-NEXT: call void @bar() 5907; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5908; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 5909; EPILOG: loop_exiting_bb2.4: 5910; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 5911; EPILOG: loop_latch.4: 5912; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 5913; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5914; EPILOG-NEXT: call void @bar() 5915; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5916; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 5917; EPILOG: loop_exiting_bb2.5: 5918; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 5919; EPILOG: loop_latch.5: 5920; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 5921; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5922; EPILOG-NEXT: call void @bar() 5923; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5924; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 5925; EPILOG: loop_exiting_bb2.6: 5926; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 5927; EPILOG: loop_latch.6: 5928; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 5929; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5930; EPILOG-NEXT: call void @bar() 5931; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5932; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 5933; EPILOG: loop_exiting_bb2.7: 5934; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 5935; EPILOG: loop_latch.7: 5936; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5937; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 5938; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5939; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 5940; EPILOG: exit1.unr-lcssa.loopexit: 5941; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5942; EPILOG-NEXT: br label %exit1.unr-lcssa 5943; EPILOG: exit1.unr-lcssa: 5944; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 5945; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5946; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 5947; EPILOG: loop_header.epil.preheader: 5948; EPILOG-NEXT: br label %loop_header.epil 5949; EPILOG: loop_header.epil: 5950; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5951; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5952; EPILOG-NEXT: call void @bar() 5953; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5954; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 5955; EPILOG: loop_exiting_bb2.epil: 5956; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 5957; EPILOG: loop_latch.epil: 5958; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5959; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5960; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5961; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5962; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16 5963; EPILOG: exit1.epilog-lcssa.loopexit: 5964; EPILOG-NEXT: br label %exit1.epilog-lcssa 5965; EPILOG: exit1.epilog-lcssa.loopexit1: 5966; EPILOG-NEXT: br label %exit1.epilog-lcssa 5967; EPILOG: exit1.epilog-lcssa: 5968; EPILOG-NEXT: br label %exit1 5969; EPILOG: exit1: 5970; EPILOG-NEXT: ret void 5971; 5972; EPILOG-BLOCK-LABEL: @test12( 5973; EPILOG-BLOCK-NEXT: entry: 5974; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 5975; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 5976; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 5977; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 5978; EPILOG-BLOCK: entry.new: 5979; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 5980; EPILOG-BLOCK-NEXT: br label %loop_header 5981; EPILOG-BLOCK: loop_header: 5982; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5983; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5984; EPILOG-BLOCK-NEXT: call void @bar() 5985; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5986; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5987; EPILOG-BLOCK: loop_exiting_bb2: 5988; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5989; EPILOG-BLOCK: loop_latch: 5990; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5991; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5992; EPILOG-BLOCK-NEXT: call void @bar() 5993; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5994; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5995; EPILOG-BLOCK: loop_exiting_bb2.1: 5996; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5997; EPILOG-BLOCK: loop_latch.1: 5998; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5999; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6000; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6001; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6002; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6003; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6004; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6005; EPILOG-BLOCK: exit1.unr-lcssa: 6006; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6007; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6008; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6009; EPILOG-BLOCK: loop_header.epil.preheader: 6010; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6011; EPILOG-BLOCK: loop_header.epil: 6012; EPILOG-BLOCK-NEXT: call void @bar() 6013; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6014; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6015; EPILOG-BLOCK: loop_exiting_bb2.epil: 6016; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa 6017; EPILOG-BLOCK: loop_latch.epil: 6018; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6019; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6020; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6021; EPILOG-BLOCK: exit1.epilog-lcssa: 6022; EPILOG-BLOCK-NEXT: br label %exit1 6023; EPILOG-BLOCK: exit1: 6024; EPILOG-BLOCK-NEXT: ret void 6025; 6026; PROLOG-LABEL: @test12( 6027; PROLOG-NEXT: entry: 6028; PROLOG-NEXT: %0 = add i64 %trip, -1 6029; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6030; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6031; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6032; PROLOG: loop_header.prol.preheader: 6033; PROLOG-NEXT: br label %loop_header.prol 6034; PROLOG: loop_header.prol: 6035; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6036; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6037; PROLOG-NEXT: call void @bar() 6038; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6039; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6040; PROLOG: loop_exiting_bb2.prol: 6041; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6042; PROLOG: loop_latch.prol: 6043; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6044; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6045; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6046; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6047; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16 6048; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6049; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6050; PROLOG-NEXT: br label %loop_header.prol.loopexit 6051; PROLOG: loop_header.prol.loopexit: 6052; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6053; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6054; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6055; PROLOG: entry.new: 6056; PROLOG-NEXT: br label %loop_header 6057; PROLOG: loop_header: 6058; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6059; PROLOG-NEXT: call void @bar() 6060; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6061; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6062; PROLOG: loop_exiting_bb2: 6063; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6064; PROLOG: loop_latch: 6065; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6066; PROLOG-NEXT: call void @bar() 6067; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6068; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6069; PROLOG: loop_exiting_bb2.1: 6070; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6071; PROLOG: loop_latch.1: 6072; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6073; PROLOG-NEXT: call void @bar() 6074; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6075; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6076; PROLOG: loop_exiting_bb2.2: 6077; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6078; PROLOG: loop_latch.2: 6079; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6080; PROLOG-NEXT: call void @bar() 6081; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6082; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6083; PROLOG: loop_exiting_bb2.3: 6084; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6085; PROLOG: loop_latch.3: 6086; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6087; PROLOG-NEXT: call void @bar() 6088; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6089; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6090; PROLOG: loop_exiting_bb2.4: 6091; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6092; PROLOG: loop_latch.4: 6093; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6094; PROLOG-NEXT: call void @bar() 6095; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6096; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6097; PROLOG: loop_exiting_bb2.5: 6098; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6099; PROLOG: loop_latch.5: 6100; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6101; PROLOG-NEXT: call void @bar() 6102; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6103; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6104; PROLOG: loop_exiting_bb2.6: 6105; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6106; PROLOG: loop_latch.6: 6107; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6108; PROLOG-NEXT: call void @bar() 6109; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6110; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6111; PROLOG: loop_exiting_bb2.7: 6112; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6113; PROLOG: loop_latch.7: 6114; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6115; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6116; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6117; PROLOG: exit1.unr-lcssa.loopexit: 6118; PROLOG-NEXT: br label %exit1.unr-lcssa 6119; PROLOG: exit1.unr-lcssa.loopexit1: 6120; PROLOG-NEXT: br label %exit1.unr-lcssa 6121; PROLOG: exit1.unr-lcssa: 6122; PROLOG-NEXT: br label %exit1 6123; PROLOG: exit1: 6124; PROLOG-NEXT: ret void 6125; 6126; PROLOG-BLOCK-LABEL: @test12( 6127; PROLOG-BLOCK-NEXT: entry: 6128; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6129; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6130; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6131; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6132; PROLOG-BLOCK: loop_header.prol.preheader: 6133; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6134; PROLOG-BLOCK: loop_header.prol: 6135; PROLOG-BLOCK-NEXT: call void @bar() 6136; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6137; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6138; PROLOG-BLOCK: loop_exiting_bb2.prol: 6139; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa 6140; PROLOG-BLOCK: loop_latch.prol: 6141; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6142; PROLOG-BLOCK: loop_header.prol.loopexit: 6143; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6144; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6145; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6146; PROLOG-BLOCK: entry.new: 6147; PROLOG-BLOCK-NEXT: br label %loop_header 6148; PROLOG-BLOCK: loop_header: 6149; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6150; PROLOG-BLOCK-NEXT: call void @bar() 6151; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6152; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6153; PROLOG-BLOCK: loop_exiting_bb2: 6154; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6155; PROLOG-BLOCK: loop_latch: 6156; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6157; PROLOG-BLOCK-NEXT: call void @bar() 6158; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6159; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6160; PROLOG-BLOCK: loop_exiting_bb2.1: 6161; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6162; PROLOG-BLOCK: loop_latch.1: 6163; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6164; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6165; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6166; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6167; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6168; PROLOG-BLOCK: exit1.unr-lcssa: 6169; PROLOG-BLOCK-NEXT: br label %exit1 6170; PROLOG-BLOCK: exit1: 6171; PROLOG-BLOCK-NEXT: ret void 6172; 6173entry: 6174 br label %loop_header 6175 6176loop_header: 6177 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6178 call void @bar() 6179 %cmp_early = icmp ne i64 %iv, %trip2 6180 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6181 6182loop_exiting_bb2: 6183 br i1 %cond, label %loop_latch, label %exit1 6184 6185loop_latch: 6186 %iv_next = add i64 %iv, 1 6187 %cmp = icmp ne i64 %iv_next, %trip 6188 br i1 %cmp, label %loop_header, label %exit1 6189 6190exit1: 6191 ret void 6192} 6193 6194declare i1 @unknown_cond() 6195 6196; Mix of computable and uncompatable exits 6197define void @test13(i64 %trip, i64 %trip2) { 6198; EPILOG-LABEL: @test13( 6199; EPILOG-NEXT: entry: 6200; EPILOG-NEXT: %0 = add i64 %trip, -1 6201; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 6202; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 6203; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6204; EPILOG: entry.new: 6205; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6206; EPILOG-NEXT: br label %loop_header 6207; EPILOG: loop_header: 6208; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6209; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6210; EPILOG-NEXT: call void @bar() 6211; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6212; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6213; EPILOG: loop_exiting_bb2: 6214; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6215; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6216; EPILOG: loop_latch: 6217; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6218; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6219; EPILOG-NEXT: call void @bar() 6220; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6221; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6222; EPILOG: loop_exiting_bb2.1: 6223; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6224; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6225; EPILOG: loop_latch.1: 6226; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 6227; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6228; EPILOG-NEXT: call void @bar() 6229; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6230; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6231; EPILOG: loop_exiting_bb2.2: 6232; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6233; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6234; EPILOG: loop_latch.2: 6235; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 6236; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6237; EPILOG-NEXT: call void @bar() 6238; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6239; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6240; EPILOG: loop_exiting_bb2.3: 6241; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6242; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6243; EPILOG: loop_latch.3: 6244; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 6245; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6246; EPILOG-NEXT: call void @bar() 6247; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6248; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6249; EPILOG: loop_exiting_bb2.4: 6250; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6251; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6252; EPILOG: loop_latch.4: 6253; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 6254; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6255; EPILOG-NEXT: call void @bar() 6256; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6257; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6258; EPILOG: loop_exiting_bb2.5: 6259; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6260; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6261; EPILOG: loop_latch.5: 6262; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 6263; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6264; EPILOG-NEXT: call void @bar() 6265; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6266; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6267; EPILOG: loop_exiting_bb2.6: 6268; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6269; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6270; EPILOG: loop_latch.6: 6271; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 6272; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6273; EPILOG-NEXT: call void @bar() 6274; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6275; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6276; EPILOG: loop_exiting_bb2.7: 6277; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6278; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6279; EPILOG: loop_latch.7: 6280; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6281; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 6282; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6283; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6284; EPILOG: exit1.unr-lcssa.loopexit: 6285; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6286; EPILOG-NEXT: br label %exit1.unr-lcssa 6287; EPILOG: exit1.unr-lcssa: 6288; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6289; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6290; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6291; EPILOG: loop_header.epil.preheader: 6292; EPILOG-NEXT: br label %loop_header.epil 6293; EPILOG: loop_header.epil: 6294; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6295; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6296; EPILOG-NEXT: call void @bar() 6297; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 6298; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6299; EPILOG: loop_exiting_bb2.epil: 6300; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6301; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6302; EPILOG: loop_latch.epil: 6303; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6304; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6305; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6306; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6307; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17 6308; EPILOG: exit1.epilog-lcssa.loopexit: 6309; EPILOG-NEXT: br label %exit1.epilog-lcssa 6310; EPILOG: exit1.epilog-lcssa.loopexit1: 6311; EPILOG-NEXT: br label %exit1.epilog-lcssa 6312; EPILOG: exit1.epilog-lcssa: 6313; EPILOG-NEXT: br label %exit1 6314; EPILOG: exit1: 6315; EPILOG-NEXT: ret void 6316; 6317; EPILOG-BLOCK-LABEL: @test13( 6318; EPILOG-BLOCK-NEXT: entry: 6319; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6320; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6321; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6322; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6323; EPILOG-BLOCK: entry.new: 6324; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6325; EPILOG-BLOCK-NEXT: br label %loop_header 6326; EPILOG-BLOCK: loop_header: 6327; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6328; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6329; EPILOG-BLOCK-NEXT: call void @bar() 6330; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6331; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6332; EPILOG-BLOCK: loop_exiting_bb2: 6333; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6334; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6335; EPILOG-BLOCK: loop_latch: 6336; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6337; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6338; EPILOG-BLOCK-NEXT: call void @bar() 6339; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6340; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6341; EPILOG-BLOCK: loop_exiting_bb2.1: 6342; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6343; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6344; EPILOG-BLOCK: loop_latch.1: 6345; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6346; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6347; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6348; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6349; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6350; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6351; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6352; EPILOG-BLOCK: exit1.unr-lcssa: 6353; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6354; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6355; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6356; EPILOG-BLOCK: loop_header.epil.preheader: 6357; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6358; EPILOG-BLOCK: loop_header.epil: 6359; EPILOG-BLOCK-NEXT: call void @bar() 6360; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6361; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6362; EPILOG-BLOCK: loop_exiting_bb2.epil: 6363; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6364; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6365; EPILOG-BLOCK: loop_latch.epil: 6366; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6367; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6368; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6369; EPILOG-BLOCK: exit1.epilog-lcssa: 6370; EPILOG-BLOCK-NEXT: br label %exit1 6371; EPILOG-BLOCK: exit1: 6372; EPILOG-BLOCK-NEXT: ret void 6373; 6374; PROLOG-LABEL: @test13( 6375; PROLOG-NEXT: entry: 6376; PROLOG-NEXT: %0 = add i64 %trip, -1 6377; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6378; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6379; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6380; PROLOG: loop_header.prol.preheader: 6381; PROLOG-NEXT: br label %loop_header.prol 6382; PROLOG: loop_header.prol: 6383; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6384; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6385; PROLOG-NEXT: call void @bar() 6386; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6387; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6388; PROLOG: loop_exiting_bb2.prol: 6389; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6390; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6391; PROLOG: loop_latch.prol: 6392; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6393; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6394; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6395; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6396; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17 6397; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6398; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6399; PROLOG-NEXT: br label %loop_header.prol.loopexit 6400; PROLOG: loop_header.prol.loopexit: 6401; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6402; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6403; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6404; PROLOG: entry.new: 6405; PROLOG-NEXT: br label %loop_header 6406; PROLOG: loop_header: 6407; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6408; PROLOG-NEXT: call void @bar() 6409; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6410; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6411; PROLOG: loop_exiting_bb2: 6412; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6413; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6414; PROLOG: loop_latch: 6415; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6416; PROLOG-NEXT: call void @bar() 6417; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6418; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6419; PROLOG: loop_exiting_bb2.1: 6420; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6421; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6422; PROLOG: loop_latch.1: 6423; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6424; PROLOG-NEXT: call void @bar() 6425; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6426; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6427; PROLOG: loop_exiting_bb2.2: 6428; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6429; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6430; PROLOG: loop_latch.2: 6431; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6432; PROLOG-NEXT: call void @bar() 6433; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6434; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6435; PROLOG: loop_exiting_bb2.3: 6436; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6437; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6438; PROLOG: loop_latch.3: 6439; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6440; PROLOG-NEXT: call void @bar() 6441; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6442; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6443; PROLOG: loop_exiting_bb2.4: 6444; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6445; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6446; PROLOG: loop_latch.4: 6447; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6448; PROLOG-NEXT: call void @bar() 6449; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6450; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6451; PROLOG: loop_exiting_bb2.5: 6452; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6453; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6454; PROLOG: loop_latch.5: 6455; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6456; PROLOG-NEXT: call void @bar() 6457; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6458; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6459; PROLOG: loop_exiting_bb2.6: 6460; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6461; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6462; PROLOG: loop_latch.6: 6463; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6464; PROLOG-NEXT: call void @bar() 6465; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6466; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6467; PROLOG: loop_exiting_bb2.7: 6468; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6469; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6470; PROLOG: loop_latch.7: 6471; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6472; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6473; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6474; PROLOG: exit1.unr-lcssa.loopexit: 6475; PROLOG-NEXT: br label %exit1.unr-lcssa 6476; PROLOG: exit1.unr-lcssa.loopexit1: 6477; PROLOG-NEXT: br label %exit1.unr-lcssa 6478; PROLOG: exit1.unr-lcssa: 6479; PROLOG-NEXT: br label %exit1 6480; PROLOG: exit1: 6481; PROLOG-NEXT: ret void 6482; 6483; PROLOG-BLOCK-LABEL: @test13( 6484; PROLOG-BLOCK-NEXT: entry: 6485; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6486; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6487; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6488; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6489; PROLOG-BLOCK: loop_header.prol.preheader: 6490; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6491; PROLOG-BLOCK: loop_header.prol: 6492; PROLOG-BLOCK-NEXT: call void @bar() 6493; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6494; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6495; PROLOG-BLOCK: loop_exiting_bb2.prol: 6496; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6497; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6498; PROLOG-BLOCK: loop_latch.prol: 6499; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6500; PROLOG-BLOCK: loop_header.prol.loopexit: 6501; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6502; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6503; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6504; PROLOG-BLOCK: entry.new: 6505; PROLOG-BLOCK-NEXT: br label %loop_header 6506; PROLOG-BLOCK: loop_header: 6507; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6508; PROLOG-BLOCK-NEXT: call void @bar() 6509; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6510; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6511; PROLOG-BLOCK: loop_exiting_bb2: 6512; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6513; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6514; PROLOG-BLOCK: loop_latch: 6515; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6516; PROLOG-BLOCK-NEXT: call void @bar() 6517; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6518; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6519; PROLOG-BLOCK: loop_exiting_bb2.1: 6520; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6521; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6522; PROLOG-BLOCK: loop_latch.1: 6523; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6524; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6525; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6526; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6527; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6528; PROLOG-BLOCK: exit1.unr-lcssa: 6529; PROLOG-BLOCK-NEXT: br label %exit1 6530; PROLOG-BLOCK: exit1: 6531; PROLOG-BLOCK-NEXT: ret void 6532; 6533entry: 6534 br label %loop_header 6535 6536loop_header: 6537 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6538 call void @bar() 6539 %cmp_early = icmp ne i64 %iv, %trip2 6540 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6541 6542loop_exiting_bb2: 6543 %unknown = call i1 @unknown_cond() 6544 br i1 %unknown, label %loop_latch, label %exit1 6545 6546loop_latch: 6547 %iv_next = add i64 %iv, 1 6548 %cmp = icmp ne i64 %iv_next, %trip 6549 br i1 %cmp, label %loop_header, label %exit1 6550 6551exit1: 6552 ret void 6553} 6554 6555; Mix of invariant and (even in theory) uncomputable exits 6556define void @test14(i64 %trip, i1 %cond) { 6557; EPILOG-LABEL: @test14( 6558; EPILOG-NEXT: entry: 6559; EPILOG-NEXT: %0 = add i64 %trip, -1 6560; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 6561; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 6562; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6563; EPILOG: entry.new: 6564; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6565; EPILOG-NEXT: br label %loop_header 6566; EPILOG: loop_header: 6567; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6568; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6569; EPILOG-NEXT: call void @bar() 6570; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6571; EPILOG: loop_exiting_bb2: 6572; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6573; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6574; EPILOG: loop_latch: 6575; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6576; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6577; EPILOG-NEXT: call void @bar() 6578; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6579; EPILOG: loop_exiting_bb2.1: 6580; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6581; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6582; EPILOG: loop_latch.1: 6583; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 6584; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6585; EPILOG-NEXT: call void @bar() 6586; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6587; EPILOG: loop_exiting_bb2.2: 6588; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6589; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6590; EPILOG: loop_latch.2: 6591; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 6592; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6593; EPILOG-NEXT: call void @bar() 6594; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6595; EPILOG: loop_exiting_bb2.3: 6596; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6597; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6598; EPILOG: loop_latch.3: 6599; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 6600; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6601; EPILOG-NEXT: call void @bar() 6602; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6603; EPILOG: loop_exiting_bb2.4: 6604; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6605; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6606; EPILOG: loop_latch.4: 6607; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 6608; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6609; EPILOG-NEXT: call void @bar() 6610; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6611; EPILOG: loop_exiting_bb2.5: 6612; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6613; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6614; EPILOG: loop_latch.5: 6615; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 6616; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6617; EPILOG-NEXT: call void @bar() 6618; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6619; EPILOG: loop_exiting_bb2.6: 6620; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6621; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6622; EPILOG: loop_latch.6: 6623; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 6624; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6625; EPILOG-NEXT: call void @bar() 6626; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6627; EPILOG: loop_exiting_bb2.7: 6628; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6629; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6630; EPILOG: loop_latch.7: 6631; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6632; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 6633; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6634; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6635; EPILOG: exit1.unr-lcssa.loopexit: 6636; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6637; EPILOG-NEXT: br label %exit1.unr-lcssa 6638; EPILOG: exit1.unr-lcssa: 6639; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6640; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6641; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6642; EPILOG: loop_header.epil.preheader: 6643; EPILOG-NEXT: br label %loop_header.epil 6644; EPILOG: loop_header.epil: 6645; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6646; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6647; EPILOG-NEXT: call void @bar() 6648; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6649; EPILOG: loop_exiting_bb2.epil: 6650; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6651; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6652; EPILOG: loop_latch.epil: 6653; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6654; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6655; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6656; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6657; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18 6658; EPILOG: exit1.epilog-lcssa.loopexit: 6659; EPILOG-NEXT: br label %exit1.epilog-lcssa 6660; EPILOG: exit1.epilog-lcssa.loopexit1: 6661; EPILOG-NEXT: br label %exit1.epilog-lcssa 6662; EPILOG: exit1.epilog-lcssa: 6663; EPILOG-NEXT: br label %exit1 6664; EPILOG: exit1: 6665; EPILOG-NEXT: ret void 6666; 6667; EPILOG-BLOCK-LABEL: @test14( 6668; EPILOG-BLOCK-NEXT: entry: 6669; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6670; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6671; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6672; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new 6673; EPILOG-BLOCK: entry.new: 6674; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter 6675; EPILOG-BLOCK-NEXT: br label %loop_header 6676; EPILOG-BLOCK: loop_header: 6677; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6678; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6679; EPILOG-BLOCK-NEXT: call void @bar() 6680; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6681; EPILOG-BLOCK: loop_exiting_bb2: 6682; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6683; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6684; EPILOG-BLOCK: loop_latch: 6685; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6686; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6687; EPILOG-BLOCK-NEXT: call void @bar() 6688; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6689; EPILOG-BLOCK: loop_exiting_bb2.1: 6690; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6691; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6692; EPILOG-BLOCK: loop_latch.1: 6693; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6694; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 6695; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6696; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6697; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6698; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6699; EPILOG-BLOCK: exit1.unr-lcssa: 6700; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6701; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6702; EPILOG-BLOCK: loop_header.epil.preheader: 6703; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6704; EPILOG-BLOCK: loop_header.epil: 6705; EPILOG-BLOCK-NEXT: call void @bar() 6706; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6707; EPILOG-BLOCK: loop_exiting_bb2.epil: 6708; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6709; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6710; EPILOG-BLOCK: loop_latch.epil: 6711; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6712; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6713; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6714; EPILOG-BLOCK: exit1.epilog-lcssa: 6715; EPILOG-BLOCK-NEXT: br label %exit1 6716; EPILOG-BLOCK: exit1: 6717; EPILOG-BLOCK-NEXT: ret void 6718; 6719; PROLOG-LABEL: @test14( 6720; PROLOG-NEXT: entry: 6721; PROLOG-NEXT: %0 = add i64 %trip, -1 6722; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 6723; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6724; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6725; PROLOG: loop_header.prol.preheader: 6726; PROLOG-NEXT: br label %loop_header.prol 6727; PROLOG: loop_header.prol: 6728; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6729; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6730; PROLOG-NEXT: call void @bar() 6731; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6732; PROLOG: loop_exiting_bb2.prol: 6733; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6734; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6735; PROLOG: loop_latch.prol: 6736; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6737; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6738; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6739; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6740; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18 6741; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6742; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6743; PROLOG-NEXT: br label %loop_header.prol.loopexit 6744; PROLOG: loop_header.prol.loopexit: 6745; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6746; PROLOG-NEXT: %1 = icmp ult i64 %0, 7 6747; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new 6748; PROLOG: entry.new: 6749; PROLOG-NEXT: br label %loop_header 6750; PROLOG: loop_header: 6751; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6752; PROLOG-NEXT: call void @bar() 6753; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6754; PROLOG: loop_exiting_bb2: 6755; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6756; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6757; PROLOG: loop_latch: 6758; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6759; PROLOG-NEXT: call void @bar() 6760; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6761; PROLOG: loop_exiting_bb2.1: 6762; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6763; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6764; PROLOG: loop_latch.1: 6765; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6766; PROLOG-NEXT: call void @bar() 6767; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6768; PROLOG: loop_exiting_bb2.2: 6769; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6770; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6771; PROLOG: loop_latch.2: 6772; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6773; PROLOG-NEXT: call void @bar() 6774; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6775; PROLOG: loop_exiting_bb2.3: 6776; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6777; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6778; PROLOG: loop_latch.3: 6779; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6780; PROLOG-NEXT: call void @bar() 6781; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6782; PROLOG: loop_exiting_bb2.4: 6783; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6784; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6785; PROLOG: loop_latch.4: 6786; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6787; PROLOG-NEXT: call void @bar() 6788; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6789; PROLOG: loop_exiting_bb2.5: 6790; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6791; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6792; PROLOG: loop_latch.5: 6793; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6794; PROLOG-NEXT: call void @bar() 6795; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6796; PROLOG: loop_exiting_bb2.6: 6797; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6798; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6799; PROLOG: loop_latch.6: 6800; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6801; PROLOG-NEXT: call void @bar() 6802; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6803; PROLOG: loop_exiting_bb2.7: 6804; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6805; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6806; PROLOG: loop_latch.7: 6807; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6808; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6809; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6810; PROLOG: exit1.unr-lcssa.loopexit: 6811; PROLOG-NEXT: br label %exit1.unr-lcssa 6812; PROLOG: exit1.unr-lcssa.loopexit1: 6813; PROLOG-NEXT: br label %exit1.unr-lcssa 6814; PROLOG: exit1.unr-lcssa: 6815; PROLOG-NEXT: br label %exit1 6816; PROLOG: exit1: 6817; PROLOG-NEXT: ret void 6818; 6819; PROLOG-BLOCK-LABEL: @test14( 6820; PROLOG-BLOCK-NEXT: entry: 6821; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 6822; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 6823; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6824; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6825; PROLOG-BLOCK: loop_header.prol.preheader: 6826; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6827; PROLOG-BLOCK: loop_header.prol: 6828; PROLOG-BLOCK-NEXT: call void @bar() 6829; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6830; PROLOG-BLOCK: loop_exiting_bb2.prol: 6831; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6832; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6833; PROLOG-BLOCK: loop_latch.prol: 6834; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6835; PROLOG-BLOCK: loop_header.prol.loopexit: 6836; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6837; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 6838; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new 6839; PROLOG-BLOCK: entry.new: 6840; PROLOG-BLOCK-NEXT: br label %loop_header 6841; PROLOG-BLOCK: loop_header: 6842; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6843; PROLOG-BLOCK-NEXT: call void @bar() 6844; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6845; PROLOG-BLOCK: loop_exiting_bb2: 6846; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6847; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6848; PROLOG-BLOCK: loop_latch: 6849; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6850; PROLOG-BLOCK-NEXT: call void @bar() 6851; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6852; PROLOG-BLOCK: loop_exiting_bb2.1: 6853; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6854; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6855; PROLOG-BLOCK: loop_latch.1: 6856; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6857; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6858; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6859; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6860; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6861; PROLOG-BLOCK: exit1.unr-lcssa: 6862; PROLOG-BLOCK-NEXT: br label %exit1 6863; PROLOG-BLOCK: exit1: 6864; PROLOG-BLOCK-NEXT: ret void 6865; 6866entry: 6867 br label %loop_header 6868 6869loop_header: 6870 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6871 call void @bar() 6872 br i1 %cond, label %loop_exiting_bb2, label %exit1 6873 6874loop_exiting_bb2: 6875 %unknown = call i1 @unknown_cond() 6876 br i1 %unknown, label %loop_latch, label %exit1 6877 6878loop_latch: 6879 %iv_next = add i64 %iv, 1 6880 %cmp = icmp ne i64 %iv_next, %trip 6881 br i1 %cmp, label %loop_header, label %exit1 6882 6883exit1: 6884 ret void 6885} 6886