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