1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p 2; RUN: opt < %s -passes=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 -passes=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 -passes=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 -passes=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 = freeze i64 %trip 15; EPILOG-NEXT: %1 = add i64 %0, -1 16; EPILOG-NEXT: %xtraiter = and i64 %0, 7 17; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 18; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 19; EPILOG: entry.new: 20; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 21; EPILOG-NEXT: br label %loop_header 22; EPILOG: loop_header: 23; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 24; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 25; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 26; EPILOG: loop_exiting_bb1: 27; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 28; EPILOG: loop_exiting_bb2: 29; EPILOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 30; EPILOG: exit3.loopexit: 31; EPILOG-NEXT: br label %exit3 32; EPILOG: exit3.loopexit2: 33; EPILOG-NEXT: br label %exit3 34; EPILOG: exit3: 35; EPILOG-NEXT: ret void 36; EPILOG: loop_latch: 37; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 38; EPILOG: loop_exiting_bb1.1: 39; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 40; EPILOG: loop_exiting_bb2.1: 41; EPILOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 42; EPILOG: loop_latch.1: 43; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 44; EPILOG: loop_exiting_bb1.2: 45; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 46; EPILOG: loop_exiting_bb2.2: 47; EPILOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 48; EPILOG: loop_latch.2: 49; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 50; EPILOG: loop_exiting_bb1.3: 51; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 52; EPILOG: loop_exiting_bb2.3: 53; EPILOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 54; EPILOG: loop_latch.3: 55; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 56; EPILOG: loop_exiting_bb1.4: 57; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 58; EPILOG: loop_exiting_bb2.4: 59; EPILOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 60; EPILOG: loop_latch.4: 61; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 62; EPILOG: loop_exiting_bb1.5: 63; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 64; EPILOG: loop_exiting_bb2.5: 65; EPILOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 66; EPILOG: loop_latch.5: 67; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 68; EPILOG: loop_exiting_bb1.6: 69; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 70; EPILOG: loop_exiting_bb2.6: 71; EPILOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 72; EPILOG: loop_latch.6: 73; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 74; EPILOG: loop_exiting_bb1.7: 75; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 76; EPILOG: loop_exiting_bb2.7: 77; EPILOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 78; EPILOG: loop_latch.7: 79; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 80; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 81; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 82; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 83; EPILOG: exit1.loopexit: 84; EPILOG-NEXT: br label %exit1 85; EPILOG: exit1.loopexit1: 86; EPILOG-NEXT: br label %exit1 87; EPILOG: exit1: 88; EPILOG-NEXT: ret void 89; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 90; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 91; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 92; EPILOG: exit2.loopexit.unr-lcssa: 93; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 94; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 95; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 96; EPILOG: loop_header.epil.preheader: 97; EPILOG-NEXT: br label %loop_header.epil 98; EPILOG: loop_header.epil: 99; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 100; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 101; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 102; EPILOG: loop_exiting_bb1.epil: 103; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1 104; EPILOG: loop_exiting_bb2.epil: 105; EPILOG-NEXT: br i1 false, label %loop_latch.epil, label %exit3.loopexit2 106; EPILOG: loop_latch.epil: 107; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 108; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 109; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 110; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 111; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0 112; EPILOG: exit2.loopexit.epilog-lcssa: 113; EPILOG-NEXT: br label %exit2.loopexit 114; EPILOG: exit2.loopexit: 115; EPILOG-NEXT: ret void 116; 117; EPILOG-BLOCK-LABEL: @test1( 118; EPILOG-BLOCK-NEXT: entry: 119; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 120; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 121; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 122; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 123; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 124; EPILOG-BLOCK: entry.new: 125; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 126; EPILOG-BLOCK-NEXT: br label %loop_header 127; EPILOG-BLOCK: loop_header: 128; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 129; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 130; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 131; EPILOG-BLOCK: loop_exiting_bb1: 132; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 133; EPILOG-BLOCK: loop_exiting_bb2: 134; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 135; EPILOG-BLOCK: exit3.loopexit: 136; EPILOG-BLOCK-NEXT: br label %exit3 137; EPILOG-BLOCK: exit3: 138; EPILOG-BLOCK-NEXT: ret void 139; EPILOG-BLOCK: loop_latch: 140; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 141; EPILOG-BLOCK: loop_exiting_bb1.1: 142; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 143; EPILOG-BLOCK: loop_exiting_bb2.1: 144; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 145; EPILOG-BLOCK: loop_latch.1: 146; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 147; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 148; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 149; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0 150; EPILOG-BLOCK: exit1.loopexit: 151; EPILOG-BLOCK-NEXT: br label %exit1 152; EPILOG-BLOCK: exit1: 153; EPILOG-BLOCK-NEXT: ret void 154; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 155; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 156; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 157; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 158; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 159; EPILOG-BLOCK: loop_header.epil.preheader: 160; EPILOG-BLOCK-NEXT: br label %loop_header.epil 161; EPILOG-BLOCK: loop_header.epil: 162; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 163; EPILOG-BLOCK: loop_exiting_bb1.epil: 164; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1 165; EPILOG-BLOCK: loop_exiting_bb2.epil: 166; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.epil, label %exit3 167; EPILOG-BLOCK: loop_latch.epil: 168; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 169; EPILOG-BLOCK: exit2.loopexit: 170; EPILOG-BLOCK-NEXT: ret void 171; 172; PROLOG-LABEL: @test1( 173; PROLOG-NEXT: entry: 174; PROLOG-NEXT: %0 = freeze i64 %trip 175; PROLOG-NEXT: %1 = add i64 %0, -1 176; PROLOG-NEXT: %xtraiter = and i64 %0, 7 177; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 178; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 179; PROLOG: loop_header.prol.preheader: 180; PROLOG-NEXT: br label %loop_header.prol 181; PROLOG: loop_header.prol: 182; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 183; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 184; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 185; PROLOG: loop_exiting_bb1.prol: 186; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1 187; PROLOG: loop_exiting_bb2.prol: 188; PROLOG-NEXT: br i1 false, label %loop_latch.prol, label %exit3.loopexit2 189; PROLOG: loop_latch.prol: 190; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 191; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 192; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 193; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 194; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0 195; PROLOG: loop_header.prol.loopexit.unr-lcssa: 196; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 197; PROLOG-NEXT: br label %loop_header.prol.loopexit 198; PROLOG: loop_header.prol.loopexit: 199; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 200; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 201; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 202; PROLOG: entry.new: 203; PROLOG-NEXT: br label %loop_header 204; PROLOG: loop_header: 205; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 206; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 207; PROLOG: loop_exiting_bb1: 208; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 209; PROLOG: loop_exiting_bb2: 210; PROLOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 211; PROLOG: exit3.loopexit: 212; PROLOG-NEXT: br label %exit3 213; PROLOG: exit3.loopexit2: 214; PROLOG-NEXT: br label %exit3 215; PROLOG: exit3: 216; PROLOG-NEXT: ret void 217; PROLOG: loop_latch: 218; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 219; PROLOG: loop_exiting_bb1.1: 220; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 221; PROLOG: loop_exiting_bb2.1: 222; PROLOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 223; PROLOG: loop_latch.1: 224; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 225; PROLOG: loop_exiting_bb1.2: 226; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 227; PROLOG: loop_exiting_bb2.2: 228; PROLOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 229; PROLOG: loop_latch.2: 230; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 231; PROLOG: loop_exiting_bb1.3: 232; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 233; PROLOG: loop_exiting_bb2.3: 234; PROLOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 235; PROLOG: loop_latch.3: 236; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 237; PROLOG: loop_exiting_bb1.4: 238; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 239; PROLOG: loop_exiting_bb2.4: 240; PROLOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 241; PROLOG: loop_latch.4: 242; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 243; PROLOG: loop_exiting_bb1.5: 244; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 245; PROLOG: loop_exiting_bb2.5: 246; PROLOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 247; PROLOG: loop_latch.5: 248; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 249; PROLOG: loop_exiting_bb1.6: 250; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 251; PROLOG: loop_exiting_bb2.6: 252; PROLOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 253; PROLOG: loop_latch.6: 254; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 255; PROLOG: loop_exiting_bb1.7: 256; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 257; PROLOG: loop_exiting_bb2.7: 258; PROLOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 259; PROLOG: loop_latch.7: 260; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 261; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 262; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 263; PROLOG: exit1.loopexit: 264; PROLOG-NEXT: br label %exit1 265; PROLOG: exit1.loopexit1: 266; PROLOG-NEXT: br label %exit1 267; PROLOG: exit1: 268; PROLOG-NEXT: ret void 269; PROLOG: exit2.loopexit.unr-lcssa: 270; PROLOG-NEXT: br label %exit2.loopexit 271; PROLOG: exit2.loopexit: 272; PROLOG-NEXT: ret void 273; 274; PROLOG-BLOCK-LABEL: @test1( 275; PROLOG-BLOCK-NEXT: entry: 276; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 277; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 278; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 279; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 280; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 281; PROLOG-BLOCK: loop_header.prol.preheader: 282; PROLOG-BLOCK-NEXT: br label %loop_header.prol 283; PROLOG-BLOCK: loop_header.prol: 284; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 285; PROLOG-BLOCK: loop_exiting_bb1.prol: 286; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1 287; PROLOG-BLOCK: loop_exiting_bb2.prol: 288; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.prol, label %exit3 289; PROLOG-BLOCK: loop_latch.prol: 290; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 291; PROLOG-BLOCK: loop_header.prol.loopexit: 292; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 293; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 294; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 295; PROLOG-BLOCK: entry.new: 296; PROLOG-BLOCK-NEXT: br label %loop_header 297; PROLOG-BLOCK: loop_header: 298; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 299; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 300; PROLOG-BLOCK: loop_exiting_bb1: 301; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 302; PROLOG-BLOCK: loop_exiting_bb2: 303; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 304; PROLOG-BLOCK: exit3.loopexit: 305; PROLOG-BLOCK-NEXT: br label %exit3 306; PROLOG-BLOCK: exit3: 307; PROLOG-BLOCK-NEXT: ret void 308; PROLOG-BLOCK: loop_latch: 309; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 310; PROLOG-BLOCK: loop_exiting_bb1.1: 311; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 312; PROLOG-BLOCK: loop_exiting_bb2.1: 313; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 314; PROLOG-BLOCK: loop_latch.1: 315; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 316; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 317; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0 318; PROLOG-BLOCK: exit1.loopexit: 319; PROLOG-BLOCK-NEXT: br label %exit1 320; PROLOG-BLOCK: exit1: 321; PROLOG-BLOCK-NEXT: ret void 322; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 323; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 324; PROLOG-BLOCK: exit2.loopexit: 325; PROLOG-BLOCK-NEXT: ret void 326; 327 328entry: 329 br label %loop_header 330 331loop_header: 332 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 333 br i1 %cond, label %loop_latch, label %loop_exiting_bb1 334 335loop_exiting_bb1: 336 br i1 false, label %loop_exiting_bb2, label %exit1 337 338loop_exiting_bb2: 339 br i1 false, label %loop_latch, label %exit3 340 341exit3: 342 ret void 343 344loop_latch: 345 %iv_next = add i64 %iv, 1 346 %cmp = icmp ne i64 %iv_next, %trip 347 br i1 %cmp, label %loop_header, label %exit2.loopexit 348 349exit1: 350 ret void 351 352exit2.loopexit: 353 ret void 354} 355 356 357; test with three exiting and two exit blocks. 358; The non-latch exit block has 2 unique predecessors. 359; There are 2 values passed to the exit blocks that are calculated at every iteration. 360; %sum.02 and %add. Both of these are incoming values for phi from every exiting 361; unrolled block. 362define i32 @test2(ptr nocapture %a, i64 %n) { 363; EPILOG-LABEL: @test2( 364; EPILOG-NEXT: entry: 365; EPILOG-NEXT: %0 = freeze i64 %n 366; EPILOG-NEXT: %1 = add i64 %0, -1 367; EPILOG-NEXT: %xtraiter = and i64 %0, 7 368; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 369; EPILOG-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new 370; EPILOG: entry.new: 371; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 372; EPILOG-NEXT: br label %header 373; EPILOG: header: 374; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 375; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ] 376; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ] 377; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 378; EPILOG: for.exiting_block: 379; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 380; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 381; EPILOG: for.body: 382; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 383; EPILOG-NEXT: %3 = load i32, ptr %arrayidx, align 4 384; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 385; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 386; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 387; EPILOG: for.exiting_block.1: 388; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 389; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 390; EPILOG: for.body.1: 391; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 392; EPILOG-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 393; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 394; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 395; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 396; EPILOG: for.exiting_block.2: 397; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 398; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 399; EPILOG: for.body.2: 400; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 401; EPILOG-NEXT: %5 = load i32, ptr %arrayidx.2, align 4 402; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 403; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 404; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 405; EPILOG: for.exiting_block.3: 406; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 407; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 408; EPILOG: for.body.3: 409; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 410; EPILOG-NEXT: %6 = load i32, ptr %arrayidx.3, align 4 411; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 412; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 413; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 414; EPILOG: for.exiting_block.4: 415; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 416; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 417; EPILOG: for.body.4: 418; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 419; EPILOG-NEXT: %7 = load i32, ptr %arrayidx.4, align 4 420; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 421; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 422; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 423; EPILOG: for.exiting_block.5: 424; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 425; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 426; EPILOG: for.body.5: 427; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 428; EPILOG-NEXT: %8 = load i32, ptr %arrayidx.5, align 4 429; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 430; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 431; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 432; EPILOG: for.exiting_block.6: 433; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 434; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 435; EPILOG: for.body.6: 436; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 437; EPILOG-NEXT: %9 = load i32, ptr %arrayidx.6, align 4 438; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 439; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 440; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 441; EPILOG: for.exiting_block.7: 442; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 443; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 444; EPILOG: for.body.7: 445; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 446; EPILOG-NEXT: %10 = load i32, ptr %arrayidx.7, align 4 447; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 448; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 449; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 450; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 451; EPILOG-NEXT: br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header 452; EPILOG: for.end.unr-lcssa.loopexit: 453; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ] 454; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ] 455; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ] 456; EPILOG-NEXT: br label %for.end.unr-lcssa 457; EPILOG: for.end.unr-lcssa: 458; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 459; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 460; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 461; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 462; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 463; EPILOG: header.epil.preheader: 464; EPILOG-NEXT: br label %header.epil 465; EPILOG: header.epil: 466; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 467; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ] 468; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ] 469; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 470; EPILOG: for.exiting_block.epil: 471; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 472; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil 473; EPILOG: for.body.epil: 474; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 475; EPILOG-NEXT: %11 = load i32, ptr %arrayidx.epil, align 4 476; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 477; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 478; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 479; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 480; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 481; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2 482; EPILOG: for.end.epilog-lcssa: 483; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ] 484; EPILOG-NEXT: br label %for.end 485; EPILOG: for.end: 486; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ] 487; EPILOG-NEXT: ret i32 %sum.0.lcssa 488; EPILOG: for.exit2.loopexit: 489; 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 ] 490; EPILOG-NEXT: br label %for.exit2 491; EPILOG: for.exit2.loopexit2: 492; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 493; EPILOG-NEXT: br label %for.exit2 494; EPILOG: for.exit2: 495; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 496; EPILOG-NEXT: ret i32 %retval 497; 498; EPILOG-BLOCK-LABEL: @test2( 499; EPILOG-BLOCK-NEXT: entry: 500; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 501; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 502; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 503; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 504; EPILOG-BLOCK-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new 505; EPILOG-BLOCK: entry.new: 506; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 507; EPILOG-BLOCK-NEXT: br label %header 508; EPILOG-BLOCK: header: 509; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 510; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ] 511; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ] 512; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 513; EPILOG-BLOCK: for.exiting_block: 514; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 515; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 516; EPILOG-BLOCK: for.body: 517; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 518; EPILOG-BLOCK-NEXT: %3 = load i32, ptr %arrayidx, align 4 519; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 520; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 521; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 522; EPILOG-BLOCK: for.exiting_block.1: 523; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 524; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 525; EPILOG-BLOCK: for.body.1: 526; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 527; EPILOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 528; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 529; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 530; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 531; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 532; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2 533; EPILOG-BLOCK: for.end.unr-lcssa.loopexit: 534; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ] 535; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ] 536; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ] 537; EPILOG-BLOCK-NEXT: br label %for.end.unr-lcssa 538; EPILOG-BLOCK: for.end.unr-lcssa: 539; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 540; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 541; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 542; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 543; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 544; EPILOG-BLOCK: header.epil.preheader: 545; EPILOG-BLOCK-NEXT: br label %header.epil 546; EPILOG-BLOCK: header.epil: 547; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 548; EPILOG-BLOCK: for.exiting_block.epil: 549; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 550; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %for.body.epil 551; EPILOG-BLOCK: for.body.epil: 552; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 553; EPILOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.epil, align 4 554; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 555; EPILOG-BLOCK-NEXT: br label %for.end 556; EPILOG-BLOCK: for.end: 557; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ] 558; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 559; EPILOG-BLOCK: for.exit2.loopexit: 560; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 561; EPILOG-BLOCK-NEXT: br label %for.exit2 562; EPILOG-BLOCK: for.exit2: 563; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 564; EPILOG-BLOCK-NEXT: ret i32 %retval 565; 566; PROLOG-LABEL: @test2( 567; PROLOG-NEXT: entry: 568; PROLOG-NEXT: %0 = freeze i64 %n 569; PROLOG-NEXT: %1 = add i64 %0, -1 570; PROLOG-NEXT: %xtraiter = and i64 %0, 7 571; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 572; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 573; PROLOG: header.prol.preheader: 574; PROLOG-NEXT: br label %header.prol 575; PROLOG: header.prol: 576; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 577; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 578; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ] 579; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 580; PROLOG: for.exiting_block.prol: 581; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 582; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol 583; PROLOG: for.body.prol: 584; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 585; PROLOG-NEXT: %2 = load i32, ptr %arrayidx.prol, align 4 586; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 587; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 588; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 589; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 590; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 591; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2 592; PROLOG: header.prol.loopexit.unr-lcssa: 593; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 594; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ] 595; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 596; PROLOG-NEXT: br label %header.prol.loopexit 597; PROLOG: header.prol.loopexit: 598; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 599; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 600; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 601; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 602; PROLOG-NEXT: br i1 %3, label %for.end, label %entry.new 603; PROLOG: entry.new: 604; PROLOG-NEXT: br label %header 605; PROLOG: header: 606; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 607; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ] 608; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 609; PROLOG: for.exiting_block: 610; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 611; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 612; PROLOG: for.body: 613; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 614; PROLOG-NEXT: %4 = load i32, ptr %arrayidx, align 4 615; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 616; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 617; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 618; PROLOG: for.exiting_block.1: 619; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 620; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 621; PROLOG: for.body.1: 622; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 623; PROLOG-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 624; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 625; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 626; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 627; PROLOG: for.exiting_block.2: 628; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 629; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 630; PROLOG: for.body.2: 631; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 632; PROLOG-NEXT: %6 = load i32, ptr %arrayidx.2, align 4 633; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 634; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 635; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 636; PROLOG: for.exiting_block.3: 637; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 638; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 639; PROLOG: for.body.3: 640; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 641; PROLOG-NEXT: %7 = load i32, ptr %arrayidx.3, align 4 642; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 643; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 644; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 645; PROLOG: for.exiting_block.4: 646; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 647; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 648; PROLOG: for.body.4: 649; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 650; PROLOG-NEXT: %8 = load i32, ptr %arrayidx.4, align 4 651; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 652; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 653; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 654; PROLOG: for.exiting_block.5: 655; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 656; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 657; PROLOG: for.body.5: 658; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 659; PROLOG-NEXT: %9 = load i32, ptr %arrayidx.5, align 4 660; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 661; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 662; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 663; PROLOG: for.exiting_block.6: 664; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 665; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 666; PROLOG: for.body.6: 667; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 668; PROLOG-NEXT: %10 = load i32, ptr %arrayidx.6, align 4 669; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 670; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 671; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 672; PROLOG: for.exiting_block.7: 673; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 674; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 675; PROLOG: for.body.7: 676; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 677; PROLOG-NEXT: %11 = load i32, ptr %arrayidx.7, align 4 678; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 679; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 680; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 681; PROLOG-NEXT: br i1 %exitcond.7, label %for.end.unr-lcssa, label %header 682; PROLOG: for.end.unr-lcssa: 683; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ] 684; PROLOG-NEXT: br label %for.end 685; PROLOG: for.end: 686; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 687; PROLOG-NEXT: ret i32 %sum.0.lcssa 688; PROLOG: for.exit2.loopexit: 689; 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 ] 690; PROLOG-NEXT: br label %for.exit2 691; PROLOG: for.exit2.loopexit1: 692; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 693; PROLOG-NEXT: br label %for.exit2 694; PROLOG: for.exit2: 695; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 696; PROLOG-NEXT: ret i32 %retval 697; 698; PROLOG-BLOCK-LABEL: @test2( 699; PROLOG-BLOCK-NEXT: entry: 700; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 701; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 702; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 703; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 704; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 705; PROLOG-BLOCK: header.prol.preheader: 706; PROLOG-BLOCK-NEXT: br label %header.prol 707; PROLOG-BLOCK: header.prol: 708; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 709; PROLOG-BLOCK: for.exiting_block.prol: 710; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 711; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %for.body.prol 712; PROLOG-BLOCK: for.body.prol: 713; PROLOG-BLOCK-NEXT: %2 = load i32, ptr %a, align 4 714; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 715; PROLOG-BLOCK: header.prol.loopexit: 716; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %2, %for.body.prol ] 717; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ] 718; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ] 719; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 720; PROLOG-BLOCK-NEXT: br i1 %3, label %for.end, label %entry.new 721; PROLOG-BLOCK: entry.new: 722; PROLOG-BLOCK-NEXT: br label %header 723; PROLOG-BLOCK: header: 724; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 725; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ] 726; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 727; PROLOG-BLOCK: for.exiting_block: 728; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 729; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 730; PROLOG-BLOCK: for.body: 731; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 732; PROLOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx, align 4 733; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 734; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 735; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 736; PROLOG-BLOCK: for.exiting_block.1: 737; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 738; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 739; PROLOG-BLOCK: for.body.1: 740; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 741; PROLOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 742; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 743; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 744; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 745; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2 746; PROLOG-BLOCK: for.end.unr-lcssa: 747; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ] 748; PROLOG-BLOCK-NEXT: br label %for.end 749; PROLOG-BLOCK: for.end: 750; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 751; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 752; PROLOG-BLOCK: for.exit2.loopexit: 753; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 754; PROLOG-BLOCK-NEXT: br label %for.exit2 755; PROLOG-BLOCK: for.exit2: 756; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 757; PROLOG-BLOCK-NEXT: ret i32 %retval 758; 759 760 761entry: 762 br label %header 763 764header: 765 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 766 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] 767 br i1 false, label %for.exit2, label %for.exiting_block 768 769for.exiting_block: 770 %cmp = icmp eq i64 %n, 42 771 br i1 %cmp, label %for.exit2, label %for.body 772 773for.body: 774 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 775 %0 = load i32, ptr %arrayidx, align 4 776 %add = add nsw i32 %0, %sum.02 777 %indvars.iv.next = add i64 %indvars.iv, 1 778 %exitcond = icmp eq i64 %indvars.iv.next, %n 779 br i1 %exitcond, label %for.end, label %header 780 781for.end: ; preds = %for.body 782 %sum.0.lcssa = phi i32 [ %add, %for.body ] 783 ret i32 %sum.0.lcssa 784 785for.exit2: 786 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 787 ret i32 %retval 788} 789 790; test with two exiting and three exit blocks. 791; the non-latch exiting block has a switch. 792define void @test3(i64 %trip, i64 %add, i1 %arg) { 793; EPILOG-LABEL: @test3( 794; EPILOG-NEXT: entry: 795; EPILOG-NEXT: %0 = freeze i64 %trip 796; EPILOG-NEXT: %1 = add i64 %0, -1 797; EPILOG-NEXT: %xtraiter = and i64 %0, 7 798; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 799; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 800; EPILOG: entry.new: 801; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 802; EPILOG-NEXT: br label %loop_header 803; EPILOG: loop_header: 804; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 805; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 806; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 807; EPILOG-NEXT: br i1 %arg, label %loop_latch, label %loop_exiting_bb1 808; EPILOG: loop_exiting_bb1: 809; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 810; EPILOG-NEXT: i64 24, label %exit1.loopexit 811; EPILOG-NEXT: i64 42, label %exit3.loopexit 812; EPILOG-NEXT: ] 813; EPILOG: exit3.loopexit: 814; EPILOG-NEXT: br label %exit3 815; EPILOG: exit3.loopexit2: 816; EPILOG-NEXT: br label %exit3 817; EPILOG: exit3: 818; EPILOG-NEXT: ret void 819; EPILOG: loop_latch: 820; EPILOG-NEXT: %sum.next = add i64 %sum, %add 821; EPILOG-NEXT: br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1 822; EPILOG: loop_exiting_bb1.1: 823; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 824; EPILOG-NEXT: i64 24, label %exit1.loopexit 825; EPILOG-NEXT: i64 42, label %exit3.loopexit 826; EPILOG-NEXT: ] 827; EPILOG: loop_latch.1: 828; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 829; EPILOG-NEXT: br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.2 830; EPILOG: loop_exiting_bb1.2: 831; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 832; EPILOG-NEXT: i64 24, label %exit1.loopexit 833; EPILOG-NEXT: i64 42, label %exit3.loopexit 834; EPILOG-NEXT: ] 835; EPILOG: loop_latch.2: 836; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 837; EPILOG-NEXT: br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.3 838; EPILOG: loop_exiting_bb1.3: 839; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 840; EPILOG-NEXT: i64 24, label %exit1.loopexit 841; EPILOG-NEXT: i64 42, label %exit3.loopexit 842; EPILOG-NEXT: ] 843; EPILOG: loop_latch.3: 844; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 845; EPILOG-NEXT: br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.4 846; EPILOG: loop_exiting_bb1.4: 847; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 848; EPILOG-NEXT: i64 24, label %exit1.loopexit 849; EPILOG-NEXT: i64 42, label %exit3.loopexit 850; EPILOG-NEXT: ] 851; EPILOG: loop_latch.4: 852; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 853; EPILOG-NEXT: br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.5 854; EPILOG: loop_exiting_bb1.5: 855; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 856; EPILOG-NEXT: i64 24, label %exit1.loopexit 857; EPILOG-NEXT: i64 42, label %exit3.loopexit 858; EPILOG-NEXT: ] 859; EPILOG: loop_latch.5: 860; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 861; EPILOG-NEXT: br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.6 862; EPILOG: loop_exiting_bb1.6: 863; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 864; EPILOG-NEXT: i64 24, label %exit1.loopexit 865; EPILOG-NEXT: i64 42, label %exit3.loopexit 866; EPILOG-NEXT: ] 867; EPILOG: loop_latch.6: 868; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 869; EPILOG-NEXT: br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.7 870; EPILOG: loop_exiting_bb1.7: 871; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 872; EPILOG-NEXT: i64 24, label %exit1.loopexit 873; EPILOG-NEXT: i64 42, label %exit3.loopexit 874; EPILOG-NEXT: ] 875; EPILOG: loop_latch.7: 876; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv, 8 877; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 878; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 879; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 880; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 881; EPILOG: exit1.loopexit: 882; EPILOG-NEXT: br label %exit1 883; EPILOG: exit1.loopexit1: 884; EPILOG-NEXT: br label %exit1 885; EPILOG: exit1: 886; EPILOG-NEXT: ret void 887; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 888; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 889; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 890; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 891; EPILOG: exit2.loopexit.unr-lcssa: 892; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 893; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 894; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 895; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 896; EPILOG: loop_header.epil.preheader: 897; EPILOG-NEXT: br label %loop_header.epil 898; EPILOG: loop_header.epil: 899; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 900; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 901; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 902; EPILOG-NEXT: br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil 903; EPILOG: loop_exiting_bb1.epil: 904; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 905; EPILOG-NEXT: i64 24, label %exit1.loopexit1 906; EPILOG-NEXT: i64 42, label %exit3.loopexit2 907; EPILOG-NEXT: ] 908; EPILOG: loop_latch.epil: 909; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 910; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 911; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 912; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 913; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 914; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3 915; EPILOG: exit2.loopexit.epilog-lcssa: 916; EPILOG-NEXT: br label %exit2.loopexit 917; EPILOG: exit2.loopexit: 918; EPILOG-NEXT: ret void 919; 920; EPILOG-BLOCK-LABEL: @test3( 921; EPILOG-BLOCK-NEXT: entry: 922; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 923; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 924; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 925; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 926; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 927; EPILOG-BLOCK: entry.new: 928; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 929; EPILOG-BLOCK-NEXT: br label %loop_header 930; EPILOG-BLOCK: loop_header: 931; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 932; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 933; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 934; EPILOG-BLOCK-NEXT: br i1 %arg, label %loop_latch, label %loop_exiting_bb1 935; EPILOG-BLOCK: loop_exiting_bb1: 936; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 937; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 938; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 939; EPILOG-BLOCK-NEXT: ] 940; EPILOG-BLOCK: exit3.loopexit: 941; EPILOG-BLOCK-NEXT: br label %exit3 942; EPILOG-BLOCK: exit3: 943; EPILOG-BLOCK-NEXT: ret void 944; EPILOG-BLOCK: loop_latch: 945; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 946; EPILOG-BLOCK-NEXT: br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1 947; EPILOG-BLOCK: loop_exiting_bb1.1: 948; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 949; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 950; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 951; EPILOG-BLOCK-NEXT: ] 952; EPILOG-BLOCK: loop_latch.1: 953; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 954; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 955; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 956; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 957; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3 958; EPILOG-BLOCK: exit1.loopexit: 959; EPILOG-BLOCK-NEXT: br label %exit1 960; EPILOG-BLOCK: exit1: 961; EPILOG-BLOCK-NEXT: ret void 962; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 963; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 964; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 965; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 966; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 967; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 968; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 969; EPILOG-BLOCK: loop_header.epil.preheader: 970; EPILOG-BLOCK-NEXT: br label %loop_header.epil 971; EPILOG-BLOCK: loop_header.epil: 972; EPILOG-BLOCK-NEXT: br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil 973; EPILOG-BLOCK: loop_exiting_bb1.epil: 974; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 975; EPILOG-BLOCK-NEXT: i64 24, label %exit1 976; EPILOG-BLOCK-NEXT: i64 42, label %exit3 977; EPILOG-BLOCK-NEXT: ] 978; EPILOG-BLOCK: loop_latch.epil: 979; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 980; EPILOG-BLOCK: exit2.loopexit: 981; EPILOG-BLOCK-NEXT: ret void 982; 983; PROLOG-LABEL: @test3( 984; PROLOG-NEXT: entry: 985; PROLOG-NEXT: %0 = freeze i64 %trip 986; PROLOG-NEXT: %1 = add i64 %0, -1 987; PROLOG-NEXT: %xtraiter = and i64 %0, 7 988; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 989; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 990; PROLOG: loop_header.prol.preheader: 991; PROLOG-NEXT: br label %loop_header.prol 992; PROLOG: loop_header.prol: 993; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 994; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 995; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 996; PROLOG-NEXT: br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol 997; PROLOG: loop_exiting_bb1.prol: 998; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 999; PROLOG-NEXT: i64 24, label %exit1.loopexit1 1000; PROLOG-NEXT: i64 42, label %exit3.loopexit2 1001; PROLOG-NEXT: ] 1002; PROLOG: loop_latch.prol: 1003; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 1004; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 1005; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 1006; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 1007; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 1008; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3 1009; PROLOG: loop_header.prol.loopexit.unr-lcssa: 1010; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 1011; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 1012; PROLOG-NEXT: br label %loop_header.prol.loopexit 1013; PROLOG: loop_header.prol.loopexit: 1014; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1015; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1016; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 1017; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 1018; PROLOG: entry.new: 1019; PROLOG-NEXT: br label %loop_header 1020; PROLOG: loop_header: 1021; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 1022; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 1023; PROLOG-NEXT: br i1 %arg, label %loop_latch, label %loop_exiting_bb1 1024; PROLOG: loop_exiting_bb1: 1025; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 1026; PROLOG-NEXT: i64 24, label %exit1.loopexit 1027; PROLOG-NEXT: i64 42, label %exit3.loopexit 1028; PROLOG-NEXT: ] 1029; PROLOG: exit3.loopexit: 1030; PROLOG-NEXT: br label %exit3 1031; PROLOG: exit3.loopexit2: 1032; PROLOG-NEXT: br label %exit3 1033; PROLOG: exit3: 1034; PROLOG-NEXT: ret void 1035; PROLOG: loop_latch: 1036; PROLOG-NEXT: %sum.next = add i64 %sum, %add 1037; PROLOG-NEXT: br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1 1038; PROLOG: loop_exiting_bb1.1: 1039; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1040; PROLOG-NEXT: i64 24, label %exit1.loopexit 1041; PROLOG-NEXT: i64 42, label %exit3.loopexit 1042; PROLOG-NEXT: ] 1043; PROLOG: loop_latch.1: 1044; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 1045; PROLOG-NEXT: br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.2 1046; PROLOG: loop_exiting_bb1.2: 1047; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1048; PROLOG-NEXT: i64 24, label %exit1.loopexit 1049; PROLOG-NEXT: i64 42, label %exit3.loopexit 1050; PROLOG-NEXT: ] 1051; PROLOG: loop_latch.2: 1052; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1053; PROLOG-NEXT: br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.3 1054; PROLOG: loop_exiting_bb1.3: 1055; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1056; PROLOG-NEXT: i64 24, label %exit1.loopexit 1057; PROLOG-NEXT: i64 42, label %exit3.loopexit 1058; PROLOG-NEXT: ] 1059; PROLOG: loop_latch.3: 1060; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1061; PROLOG-NEXT: br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.4 1062; PROLOG: loop_exiting_bb1.4: 1063; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1064; PROLOG-NEXT: i64 24, label %exit1.loopexit 1065; PROLOG-NEXT: i64 42, label %exit3.loopexit 1066; PROLOG-NEXT: ] 1067; PROLOG: loop_latch.4: 1068; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1069; PROLOG-NEXT: br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.5 1070; PROLOG: loop_exiting_bb1.5: 1071; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1072; PROLOG-NEXT: i64 24, label %exit1.loopexit 1073; PROLOG-NEXT: i64 42, label %exit3.loopexit 1074; PROLOG-NEXT: ] 1075; PROLOG: loop_latch.5: 1076; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1077; PROLOG-NEXT: br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.6 1078; PROLOG: loop_exiting_bb1.6: 1079; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1080; PROLOG-NEXT: i64 24, label %exit1.loopexit 1081; PROLOG-NEXT: i64 42, label %exit3.loopexit 1082; PROLOG-NEXT: ] 1083; PROLOG: loop_latch.6: 1084; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1085; PROLOG-NEXT: br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.7 1086; PROLOG: loop_exiting_bb1.7: 1087; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1088; PROLOG-NEXT: i64 24, label %exit1.loopexit 1089; PROLOG-NEXT: i64 42, label %exit3.loopexit 1090; PROLOG-NEXT: ] 1091; PROLOG: loop_latch.7: 1092; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv, 8 1093; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1094; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 1095; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 1096; PROLOG: exit1.loopexit: 1097; PROLOG-NEXT: br label %exit1 1098; PROLOG: exit1.loopexit1: 1099; PROLOG-NEXT: br label %exit1 1100; PROLOG: exit1: 1101; PROLOG-NEXT: ret void 1102; PROLOG: exit2.loopexit.unr-lcssa: 1103; PROLOG-NEXT: br label %exit2.loopexit 1104; PROLOG: exit2.loopexit: 1105; PROLOG-NEXT: ret void 1106; 1107; PROLOG-BLOCK-LABEL: @test3( 1108; PROLOG-BLOCK-NEXT: entry: 1109; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 1110; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 1111; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1112; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1113; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 1114; PROLOG-BLOCK: loop_header.prol.preheader: 1115; PROLOG-BLOCK-NEXT: br label %loop_header.prol 1116; PROLOG-BLOCK: loop_header.prol: 1117; PROLOG-BLOCK-NEXT: br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol 1118; PROLOG-BLOCK: loop_exiting_bb1.prol: 1119; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 1120; PROLOG-BLOCK-NEXT: i64 24, label %exit1 1121; PROLOG-BLOCK-NEXT: i64 42, label %exit3 1122; PROLOG-BLOCK-NEXT: ] 1123; PROLOG-BLOCK: loop_latch.prol: 1124; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 1125; PROLOG-BLOCK: loop_header.prol.loopexit: 1126; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 1127; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 1128; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1129; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 1130; PROLOG-BLOCK: entry.new: 1131; PROLOG-BLOCK-NEXT: br label %loop_header 1132; PROLOG-BLOCK: loop_header: 1133; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 1134; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 1135; PROLOG-BLOCK-NEXT: br i1 %arg, label %loop_latch, label %loop_exiting_bb1 1136; PROLOG-BLOCK: loop_exiting_bb1: 1137; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 1138; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1139; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1140; PROLOG-BLOCK-NEXT: ] 1141; PROLOG-BLOCK: exit3.loopexit: 1142; PROLOG-BLOCK-NEXT: br label %exit3 1143; PROLOG-BLOCK: exit3: 1144; PROLOG-BLOCK-NEXT: ret void 1145; PROLOG-BLOCK: loop_latch: 1146; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 1147; PROLOG-BLOCK-NEXT: br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1 1148; PROLOG-BLOCK: loop_exiting_bb1.1: 1149; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1150; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1151; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1152; PROLOG-BLOCK-NEXT: ] 1153; PROLOG-BLOCK: loop_latch.1: 1154; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 1155; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 1156; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 1157; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3 1158; PROLOG-BLOCK: exit1.loopexit: 1159; PROLOG-BLOCK-NEXT: br label %exit1 1160; PROLOG-BLOCK: exit1: 1161; PROLOG-BLOCK-NEXT: ret void 1162; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 1163; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 1164; PROLOG-BLOCK: exit2.loopexit: 1165; PROLOG-BLOCK-NEXT: ret void 1166; 1167 1168entry: 1169 br label %loop_header 1170 1171loop_header: 1172 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 1173 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 1174 br i1 %arg, label %loop_latch, label %loop_exiting_bb1 1175 1176loop_exiting_bb1: 1177 switch i64 %sum, label %loop_latch [ 1178 i64 24, label %exit1 1179 i64 42, label %exit3 1180 ] 1181 1182exit3: 1183 ret void 1184 1185loop_latch: 1186 %iv_next = add nuw nsw i64 %iv, 1 1187 %sum.next = add i64 %sum, %add 1188 %cmp = icmp ne i64 %iv_next, %trip 1189 br i1 %cmp, label %loop_header, label %exit2.loopexit 1190 1191exit1: 1192 ret void 1193 1194exit2.loopexit: 1195 ret void 1196} 1197 1198; FIXME: Support multiple exiting blocks to the same latch exit block. 1199; Three exiting blocks where header and latch exit to same LatchExit. 1200define i32 @hdr_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) { 1201; EPILOG-LABEL: @hdr_latch_same_exit( 1202; EPILOG-NEXT: entry: 1203; EPILOG-NEXT: %0 = freeze i64 %n 1204; EPILOG-NEXT: %1 = add i64 %0, -1 1205; EPILOG-NEXT: %xtraiter = and i64 %0, 7 1206; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 1207; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 1208; EPILOG: entry.new: 1209; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1210; EPILOG-NEXT: br label %header 1211; EPILOG: header: 1212; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1213; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 1214; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 1215; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block 1216; EPILOG: for.exiting_block: 1217; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 1218; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1219; EPILOG: latch: 1220; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1221; EPILOG-NEXT: %3 = load i32, ptr %arrayidx, align 4 1222; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 1223; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1224; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1225; EPILOG: for.exiting_block.1: 1226; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1227; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1228; EPILOG: latch.1: 1229; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1230; EPILOG-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 1231; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 1232; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 1233; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2 1234; EPILOG: for.exiting_block.2: 1235; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1236; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1237; EPILOG: latch.2: 1238; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 1239; EPILOG-NEXT: %5 = load i32, ptr %arrayidx.2, align 4 1240; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1241; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 1242; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3 1243; EPILOG: for.exiting_block.3: 1244; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1245; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1246; EPILOG: latch.3: 1247; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 1248; EPILOG-NEXT: %6 = load i32, ptr %arrayidx.3, align 4 1249; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1250; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 1251; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4 1252; EPILOG: for.exiting_block.4: 1253; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1254; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1255; EPILOG: latch.4: 1256; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 1257; EPILOG-NEXT: %7 = load i32, ptr %arrayidx.4, align 4 1258; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1259; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 1260; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5 1261; EPILOG: for.exiting_block.5: 1262; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1263; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1264; EPILOG: latch.5: 1265; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 1266; EPILOG-NEXT: %8 = load i32, ptr %arrayidx.5, align 4 1267; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1268; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 1269; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6 1270; EPILOG: for.exiting_block.6: 1271; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1272; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1273; EPILOG: latch.6: 1274; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 1275; EPILOG-NEXT: %9 = load i32, ptr %arrayidx.6, align 4 1276; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1277; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 1278; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7 1279; EPILOG: for.exiting_block.7: 1280; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1281; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1282; EPILOG: latch.7: 1283; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 1284; EPILOG-NEXT: %10 = load i32, ptr %arrayidx.7, align 4 1285; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1286; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 1287; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 1288; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1289; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 1290; EPILOG: latchExit.unr-lcssa.loopexit: 1291; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 1292; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 1293; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 1294; EPILOG-NEXT: br label %latchExit.unr-lcssa 1295; EPILOG: latchExit.unr-lcssa: 1296; EPILOG-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1297; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1298; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1299; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1300; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1301; EPILOG: header.epil.preheader: 1302; EPILOG-NEXT: br label %header.epil 1303; EPILOG: header.epil: 1304; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 1305; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 1306; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 1307; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil 1308; EPILOG: for.exiting_block.epil: 1309; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 1310; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil 1311; EPILOG: latch.epil: 1312; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 1313; EPILOG-NEXT: %11 = load i32, ptr %arrayidx.epil, align 4 1314; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 1315; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1316; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1317; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 1318; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 1319; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4 1320; EPILOG: latchExit.epilog-lcssa.loopexit: 1321; 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 ] 1322; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1323; EPILOG: latchExit.epilog-lcssa.loopexit2: 1324; EPILOG-NEXT: %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ] 1325; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1326; EPILOG: latchExit.epilog-lcssa: 1327; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 1328; EPILOG-NEXT: br label %latchExit 1329; EPILOG: latchExit: 1330; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1331; EPILOG-NEXT: ret i32 %result 1332; EPILOG: for.exit2.loopexit: 1333; EPILOG-NEXT: br label %for.exit2 1334; EPILOG: for.exit2.loopexit4: 1335; EPILOG-NEXT: br label %for.exit2 1336; EPILOG: for.exit2: 1337; EPILOG-NEXT: ret i32 42 1338; 1339; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit( 1340; EPILOG-BLOCK-NEXT: entry: 1341; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 1342; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 1343; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1344; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1345; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 1346; EPILOG-BLOCK: entry.new: 1347; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1348; EPILOG-BLOCK-NEXT: br label %header 1349; EPILOG-BLOCK: header: 1350; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 1351; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 1352; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 1353; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block 1354; EPILOG-BLOCK: for.exiting_block: 1355; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1356; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1357; EPILOG-BLOCK: latch: 1358; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1359; EPILOG-BLOCK-NEXT: %3 = load i32, ptr %arrayidx, align 4 1360; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1361; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1362; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1363; EPILOG-BLOCK: for.exiting_block.1: 1364; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1365; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1366; EPILOG-BLOCK: latch.1: 1367; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1368; EPILOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 1369; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1370; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 1371; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 1372; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1373; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 1374; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 1375; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 1376; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 1377; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 1378; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1379; EPILOG-BLOCK: latchExit.unr-lcssa: 1380; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1381; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1382; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1383; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1384; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1385; EPILOG-BLOCK: header.epil.preheader: 1386; EPILOG-BLOCK-NEXT: br label %header.epil 1387; EPILOG-BLOCK: header.epil: 1388; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil 1389; EPILOG-BLOCK: for.exiting_block.epil: 1390; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 1391; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 1392; EPILOG-BLOCK: latch.epil: 1393; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 1394; EPILOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.epil, align 4 1395; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 1396; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1397; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 1398; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ] 1399; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1400; EPILOG-BLOCK: latchExit.epilog-lcssa: 1401; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 1402; EPILOG-BLOCK-NEXT: br label %latchExit 1403; EPILOG-BLOCK: latchExit: 1404; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1405; EPILOG-BLOCK-NEXT: ret i32 %result 1406; EPILOG-BLOCK: for.exit2.loopexit: 1407; EPILOG-BLOCK-NEXT: br label %for.exit2 1408; EPILOG-BLOCK: for.exit2: 1409; EPILOG-BLOCK-NEXT: ret i32 42 1410; 1411; PROLOG-LABEL: @hdr_latch_same_exit( 1412; PROLOG-NEXT: entry: 1413; PROLOG-NEXT: %0 = freeze i64 %n 1414; PROLOG-NEXT: %1 = add i64 %0, -1 1415; PROLOG-NEXT: %xtraiter = and i64 %0, 7 1416; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1417; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1418; PROLOG: header.prol.preheader: 1419; PROLOG-NEXT: br label %header.prol 1420; PROLOG: header.prol: 1421; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1422; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1423; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 1424; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol 1425; PROLOG: for.exiting_block.prol: 1426; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 1427; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol 1428; PROLOG: latch.prol: 1429; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 1430; PROLOG-NEXT: %2 = load i32, ptr %arrayidx.prol, align 4 1431; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 1432; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 1433; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1434; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 1435; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 1436; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4 1437; PROLOG: header.prol.loopexit.unr-lcssa: 1438; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1439; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 1440; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1441; PROLOG-NEXT: br label %header.prol.loopexit 1442; PROLOG: header.prol.loopexit: 1443; PROLOG-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 1444; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 1445; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1446; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 1447; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 1448; PROLOG: entry.new: 1449; PROLOG-NEXT: br label %header 1450; PROLOG: header: 1451; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1452; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 1453; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1454; PROLOG: for.exiting_block: 1455; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1456; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1457; PROLOG: latch: 1458; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1459; PROLOG-NEXT: %4 = load i32, ptr %arrayidx, align 4 1460; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 1461; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1462; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 1463; PROLOG: for.exiting_block.1: 1464; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1465; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1466; PROLOG: latch.1: 1467; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1468; PROLOG-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 1469; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 1470; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 1471; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2 1472; PROLOG: for.exiting_block.2: 1473; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1474; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1475; PROLOG: latch.2: 1476; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 1477; PROLOG-NEXT: %6 = load i32, ptr %arrayidx.2, align 4 1478; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 1479; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 1480; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3 1481; PROLOG: for.exiting_block.3: 1482; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1483; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1484; PROLOG: latch.3: 1485; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 1486; PROLOG-NEXT: %7 = load i32, ptr %arrayidx.3, align 4 1487; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 1488; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 1489; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4 1490; PROLOG: for.exiting_block.4: 1491; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1492; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1493; PROLOG: latch.4: 1494; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 1495; PROLOG-NEXT: %8 = load i32, ptr %arrayidx.4, align 4 1496; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 1497; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 1498; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5 1499; PROLOG: for.exiting_block.5: 1500; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1501; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1502; PROLOG: latch.5: 1503; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 1504; PROLOG-NEXT: %9 = load i32, ptr %arrayidx.5, align 4 1505; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 1506; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 1507; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6 1508; PROLOG: for.exiting_block.6: 1509; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1510; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1511; PROLOG: latch.6: 1512; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 1513; PROLOG-NEXT: %10 = load i32, ptr %arrayidx.6, align 4 1514; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 1515; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 1516; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7 1517; PROLOG: for.exiting_block.7: 1518; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1519; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1520; PROLOG: latch.7: 1521; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 1522; PROLOG-NEXT: %11 = load i32, ptr %arrayidx.7, align 4 1523; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 1524; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 1525; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 1526; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 1527; PROLOG: latchExit.unr-lcssa.loopexit: 1528; 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 ] 1529; PROLOG-NEXT: br label %latchExit.unr-lcssa 1530; PROLOG: latchExit.unr-lcssa.loopexit1: 1531; PROLOG-NEXT: %result.ph.ph2 = phi i32 [ 0, %header.prol ] 1532; PROLOG-NEXT: br label %latchExit.unr-lcssa 1533; PROLOG: latchExit.unr-lcssa: 1534; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 1535; PROLOG-NEXT: br label %latchExit 1536; PROLOG: latchExit: 1537; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1538; PROLOG-NEXT: ret i32 %result 1539; PROLOG: for.exit2.loopexit: 1540; PROLOG-NEXT: br label %for.exit2 1541; PROLOG: for.exit2.loopexit3: 1542; PROLOG-NEXT: br label %for.exit2 1543; PROLOG: for.exit2: 1544; PROLOG-NEXT: ret i32 42 1545; 1546; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit( 1547; PROLOG-BLOCK-NEXT: entry: 1548; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 1549; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 1550; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1551; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1552; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1553; PROLOG-BLOCK: header.prol.preheader: 1554; PROLOG-BLOCK-NEXT: br label %header.prol 1555; PROLOG-BLOCK: header.prol: 1556; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol 1557; PROLOG-BLOCK: for.exiting_block.prol: 1558; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 1559; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 1560; PROLOG-BLOCK: latch.prol: 1561; PROLOG-BLOCK-NEXT: %2 = load i32, ptr %a, align 4 1562; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 1563; PROLOG-BLOCK: header.prol.loopexit: 1564; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ] 1565; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 1566; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 1567; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 1568; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 1569; PROLOG-BLOCK: entry.new: 1570; PROLOG-BLOCK-NEXT: br label %header 1571; PROLOG-BLOCK: header: 1572; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 1573; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 1574; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1575; PROLOG-BLOCK: for.exiting_block: 1576; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1577; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1578; PROLOG-BLOCK: latch: 1579; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1580; PROLOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx, align 4 1581; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 1582; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1583; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 1584; PROLOG-BLOCK: for.exiting_block.1: 1585; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1586; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1587; PROLOG-BLOCK: latch.1: 1588; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1589; PROLOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 1590; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 1591; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 1592; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1593; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 1594; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 1595; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ] 1596; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1597; PROLOG-BLOCK: latchExit.unr-lcssa: 1598; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1599; PROLOG-BLOCK-NEXT: br label %latchExit 1600; PROLOG-BLOCK: latchExit: 1601; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1602; PROLOG-BLOCK-NEXT: ret i32 %result 1603; PROLOG-BLOCK: for.exit2.loopexit: 1604; PROLOG-BLOCK-NEXT: br label %for.exit2 1605; PROLOG-BLOCK: for.exit2: 1606; PROLOG-BLOCK-NEXT: ret i32 42 1607; 1608 1609entry: 1610 br label %header 1611 1612header: 1613 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1614 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1615 br i1 %cond, label %latchExit, label %for.exiting_block 1616 1617for.exiting_block: 1618 %cmp = icmp eq i64 %n, 42 1619 br i1 %cmp, label %for.exit2, label %latch 1620 1621latch: ; preds = %latch, %entry 1622 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1623 %0 = load i32, ptr %arrayidx, align 4 1624 %add = add nsw i32 %0, %sum.02 1625 %indvars.iv.next = add i64 %indvars.iv, 1 1626 %exitcond = icmp eq i64 %indvars.iv.next, %n 1627 br i1 %exitcond, label %latchExit, label %header 1628 1629latchExit: ; preds = %latch, %entry 1630 %result = phi i32 [ 0, %header ], [ %add, %latch ] 1631 ret i32 %result 1632 1633for.exit2: 1634 ret i32 42 1635} 1636 1637; Two exiting blocks to latch where the exiting blocks are Latch and a 1638; non-header 1639; FIXME: We should unroll this loop. 1640define i32 @otherblock_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) { 1641; EPILOG-LABEL: @otherblock_latch_same_exit( 1642; EPILOG-NEXT: entry: 1643; EPILOG-NEXT: %0 = freeze i64 %n 1644; EPILOG-NEXT: %1 = add i64 %0, -1 1645; EPILOG-NEXT: %xtraiter = and i64 %0, 7 1646; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 1647; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 1648; EPILOG: entry.new: 1649; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1650; EPILOG-NEXT: br label %header 1651; EPILOG: header: 1652; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1653; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 1654; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 1655; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1656; EPILOG: for.exiting_block: 1657; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 1658; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1659; EPILOG: latch: 1660; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1661; EPILOG-NEXT: %3 = load i32, ptr %arrayidx, align 4 1662; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 1663; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1664; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1665; EPILOG: for.exiting_block.1: 1666; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1667; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1668; EPILOG: latch.1: 1669; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1670; EPILOG-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 1671; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 1672; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 1673; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1674; EPILOG: for.exiting_block.2: 1675; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1676; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 1677; EPILOG: latch.2: 1678; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 1679; EPILOG-NEXT: %5 = load i32, ptr %arrayidx.2, align 4 1680; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1681; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 1682; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1683; EPILOG: for.exiting_block.3: 1684; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1685; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 1686; EPILOG: latch.3: 1687; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 1688; EPILOG-NEXT: %6 = load i32, ptr %arrayidx.3, align 4 1689; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1690; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 1691; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1692; EPILOG: for.exiting_block.4: 1693; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1694; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 1695; EPILOG: latch.4: 1696; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 1697; EPILOG-NEXT: %7 = load i32, ptr %arrayidx.4, align 4 1698; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1699; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 1700; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1701; EPILOG: for.exiting_block.5: 1702; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1703; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 1704; EPILOG: latch.5: 1705; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 1706; EPILOG-NEXT: %8 = load i32, ptr %arrayidx.5, align 4 1707; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1708; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 1709; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 1710; EPILOG: for.exiting_block.6: 1711; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1712; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 1713; EPILOG: latch.6: 1714; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 1715; EPILOG-NEXT: %9 = load i32, ptr %arrayidx.6, align 4 1716; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1717; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 1718; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 1719; EPILOG: for.exiting_block.7: 1720; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1721; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 1722; EPILOG: latch.7: 1723; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 1724; EPILOG-NEXT: %10 = load i32, ptr %arrayidx.7, align 4 1725; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1726; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 1727; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 1728; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1729; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 1730; EPILOG: latchExit.unr-lcssa.loopexit: 1731; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 1732; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 1733; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 1734; EPILOG-NEXT: br label %latchExit.unr-lcssa 1735; EPILOG: latchExit.unr-lcssa: 1736; EPILOG-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1737; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1738; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1739; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1740; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1741; EPILOG: header.epil.preheader: 1742; EPILOG-NEXT: br label %header.epil 1743; EPILOG: header.epil: 1744; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 1745; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 1746; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 1747; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 1748; EPILOG: for.exiting_block.epil: 1749; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 1750; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 1751; EPILOG: latch.epil: 1752; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 1753; EPILOG-NEXT: %11 = load i32, ptr %arrayidx.epil, align 4 1754; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 1755; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 1756; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 1757; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 1758; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 1759; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5 1760; EPILOG: latchExit.epilog-lcssa.loopexit: 1761; 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 ] 1762; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1763; EPILOG: latchExit.epilog-lcssa.loopexit3: 1764; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 1765; EPILOG-NEXT: br label %latchExit.epilog-lcssa 1766; EPILOG: latchExit.epilog-lcssa: 1767; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 1768; EPILOG-NEXT: br label %latchExit 1769; EPILOG: latchExit: 1770; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1771; EPILOG-NEXT: ret i32 %result 1772; EPILOG: for.exit2.loopexit: 1773; EPILOG-NEXT: br label %for.exit2 1774; EPILOG: for.exit2.loopexit2: 1775; EPILOG-NEXT: br label %for.exit2 1776; EPILOG: for.exit2: 1777; EPILOG-NEXT: ret i32 42 1778; 1779; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1780; EPILOG-BLOCK-NEXT: entry: 1781; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 1782; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 1783; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1784; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1785; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 1786; EPILOG-BLOCK: entry.new: 1787; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1788; EPILOG-BLOCK-NEXT: br label %header 1789; EPILOG-BLOCK: header: 1790; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 1791; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 1792; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 1793; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1794; EPILOG-BLOCK: for.exiting_block: 1795; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 1796; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1797; EPILOG-BLOCK: latch: 1798; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1799; EPILOG-BLOCK-NEXT: %3 = load i32, ptr %arrayidx, align 4 1800; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1801; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 1802; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1803; EPILOG-BLOCK: for.exiting_block.1: 1804; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1805; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1806; EPILOG-BLOCK: latch.1: 1807; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1808; EPILOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 1809; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1810; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 1811; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 1812; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1813; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 1814; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 1815; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 1816; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 1817; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 1818; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 1819; EPILOG-BLOCK: latchExit.unr-lcssa: 1820; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 1821; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 1822; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 1823; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1824; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 1825; EPILOG-BLOCK: header.epil.preheader: 1826; EPILOG-BLOCK-NEXT: br label %header.epil 1827; EPILOG-BLOCK: header.epil: 1828; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 1829; EPILOG-BLOCK: for.exiting_block.epil: 1830; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 1831; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 1832; EPILOG-BLOCK: latch.epil: 1833; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 1834; EPILOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.epil, align 4 1835; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 1836; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1837; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 1838; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ] 1839; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 1840; EPILOG-BLOCK: latchExit.epilog-lcssa: 1841; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 1842; EPILOG-BLOCK-NEXT: br label %latchExit 1843; EPILOG-BLOCK: latchExit: 1844; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1845; EPILOG-BLOCK-NEXT: ret i32 %result 1846; EPILOG-BLOCK: for.exit2.loopexit: 1847; EPILOG-BLOCK-NEXT: br label %for.exit2 1848; EPILOG-BLOCK: for.exit2: 1849; EPILOG-BLOCK-NEXT: ret i32 42 1850; 1851; PROLOG-LABEL: @otherblock_latch_same_exit( 1852; PROLOG-NEXT: entry: 1853; PROLOG-NEXT: %0 = freeze i64 %n 1854; PROLOG-NEXT: %1 = add i64 %0, -1 1855; PROLOG-NEXT: %xtraiter = and i64 %0, 7 1856; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1857; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1858; PROLOG: header.prol.preheader: 1859; PROLOG-NEXT: br label %header.prol 1860; PROLOG: header.prol: 1861; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1862; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 1863; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 1864; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 1865; PROLOG: for.exiting_block.prol: 1866; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 1867; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 1868; PROLOG: latch.prol: 1869; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 1870; PROLOG-NEXT: %2 = load i32, ptr %arrayidx.prol, align 4 1871; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 1872; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 1873; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 1874; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 1875; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 1876; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5 1877; PROLOG: header.prol.loopexit.unr-lcssa: 1878; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1879; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 1880; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 1881; PROLOG-NEXT: br label %header.prol.loopexit 1882; PROLOG: header.prol.loopexit: 1883; PROLOG-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 1884; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 1885; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1886; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 1887; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 1888; PROLOG: entry.new: 1889; PROLOG-NEXT: br label %header 1890; PROLOG: header: 1891; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 1892; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 1893; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1894; PROLOG: for.exiting_block: 1895; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 1896; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 1897; PROLOG: latch: 1898; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 1899; PROLOG-NEXT: %4 = load i32, ptr %arrayidx, align 4 1900; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 1901; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 1902; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1903; PROLOG: for.exiting_block.1: 1904; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1905; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 1906; PROLOG: latch.1: 1907; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 1908; PROLOG-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 1909; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 1910; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 1911; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1912; PROLOG: for.exiting_block.2: 1913; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1914; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 1915; PROLOG: latch.2: 1916; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 1917; PROLOG-NEXT: %6 = load i32, ptr %arrayidx.2, align 4 1918; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 1919; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 1920; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1921; PROLOG: for.exiting_block.3: 1922; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1923; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 1924; PROLOG: latch.3: 1925; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 1926; PROLOG-NEXT: %7 = load i32, ptr %arrayidx.3, align 4 1927; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 1928; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 1929; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1930; PROLOG: for.exiting_block.4: 1931; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1932; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 1933; PROLOG: latch.4: 1934; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 1935; PROLOG-NEXT: %8 = load i32, ptr %arrayidx.4, align 4 1936; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 1937; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 1938; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1939; PROLOG: for.exiting_block.5: 1940; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1941; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 1942; PROLOG: latch.5: 1943; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 1944; PROLOG-NEXT: %9 = load i32, ptr %arrayidx.5, align 4 1945; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 1946; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 1947; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 1948; PROLOG: for.exiting_block.6: 1949; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1950; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 1951; PROLOG: latch.6: 1952; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 1953; PROLOG-NEXT: %10 = load i32, ptr %arrayidx.6, align 4 1954; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 1955; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 1956; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 1957; PROLOG: for.exiting_block.7: 1958; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1959; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 1960; PROLOG: latch.7: 1961; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 1962; PROLOG-NEXT: %11 = load i32, ptr %arrayidx.7, align 4 1963; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 1964; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 1965; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 1966; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 1967; PROLOG: latchExit.unr-lcssa.loopexit: 1968; 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 ] 1969; PROLOG-NEXT: br label %latchExit.unr-lcssa 1970; PROLOG: latchExit.unr-lcssa.loopexit2: 1971; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ] 1972; PROLOG-NEXT: br label %latchExit.unr-lcssa 1973; PROLOG: latchExit.unr-lcssa: 1974; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 1975; PROLOG-NEXT: br label %latchExit 1976; PROLOG: latchExit: 1977; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1978; PROLOG-NEXT: ret i32 %result 1979; PROLOG: for.exit2.loopexit: 1980; PROLOG-NEXT: br label %for.exit2 1981; PROLOG: for.exit2.loopexit1: 1982; PROLOG-NEXT: br label %for.exit2 1983; PROLOG: for.exit2: 1984; PROLOG-NEXT: ret i32 42 1985; 1986; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1987; PROLOG-BLOCK-NEXT: entry: 1988; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 1989; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 1990; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1991; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1992; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 1993; PROLOG-BLOCK: header.prol.preheader: 1994; PROLOG-BLOCK-NEXT: br label %header.prol 1995; PROLOG-BLOCK: header.prol: 1996; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 1997; PROLOG-BLOCK: for.exiting_block.prol: 1998; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 1999; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 2000; PROLOG-BLOCK: latch.prol: 2001; PROLOG-BLOCK-NEXT: %2 = load i32, ptr %a, align 4 2002; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 2003; PROLOG-BLOCK: header.prol.loopexit: 2004; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ] 2005; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2006; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2007; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2008; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 2009; PROLOG-BLOCK: entry.new: 2010; PROLOG-BLOCK-NEXT: br label %header 2011; PROLOG-BLOCK: header: 2012; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2013; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 2014; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2015; PROLOG-BLOCK: for.exiting_block: 2016; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2017; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2018; PROLOG-BLOCK: latch: 2019; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2020; PROLOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx, align 4 2021; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 2022; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2023; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2024; PROLOG-BLOCK: for.exiting_block.1: 2025; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2026; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2027; PROLOG-BLOCK: latch.1: 2028; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2029; PROLOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 2030; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2031; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2032; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2033; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 2034; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2035; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2036; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2037; PROLOG-BLOCK: latchExit.unr-lcssa: 2038; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2039; PROLOG-BLOCK-NEXT: br label %latchExit 2040; PROLOG-BLOCK: latchExit: 2041; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2042; PROLOG-BLOCK-NEXT: ret i32 %result 2043; PROLOG-BLOCK: for.exit2.loopexit: 2044; PROLOG-BLOCK-NEXT: br label %for.exit2 2045; PROLOG-BLOCK: for.exit2: 2046; PROLOG-BLOCK-NEXT: ret i32 42 2047; 2048 2049entry: 2050 br label %header 2051 2052header: 2053 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2054 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2055 br i1 %cond, label %for.exit2, label %for.exiting_block 2056 2057for.exiting_block: 2058 %cmp = icmp eq i64 %n, 42 2059 br i1 %cmp, label %latchExit, label %latch 2060 2061latch: ; preds = %latch, %entry 2062 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2063 %0 = load i32, ptr %arrayidx, align 4 2064 %add = add nsw i32 %0, %sum.02 2065 %indvars.iv.next = add i64 %indvars.iv, 1 2066 %exitcond = icmp eq i64 %indvars.iv.next, %n 2067 br i1 %exitcond, label %latchExit, label %header 2068 2069latchExit: ; preds = %latch, %entry 2070 %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 2071 ret i32 %result 2072 2073for.exit2: 2074 ret i32 42 2075} 2076 2077; Two exiting blocks to latch where the exiting blocks are Latch and a 2078; non-header 2079; Same as above test except the incoming value for latch Phi is from the header 2080; FIXME: We should be able to runtime unroll. 2081define i32 @otherblock_latch_same_exit2(ptr nocapture %a, i64 %n, i1 %cond) { 2082; EPILOG-LABEL: @otherblock_latch_same_exit2( 2083; EPILOG-NEXT: entry: 2084; EPILOG-NEXT: %0 = freeze i64 %n 2085; EPILOG-NEXT: %1 = add i64 %0, -1 2086; EPILOG-NEXT: %xtraiter = and i64 %0, 7 2087; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 2088; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 2089; EPILOG: entry.new: 2090; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2091; EPILOG-NEXT: br label %header 2092; EPILOG: header: 2093; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2094; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 2095; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 2096; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2097; EPILOG: for.exiting_block: 2098; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2099; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2100; EPILOG: latch: 2101; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2102; EPILOG-NEXT: %3 = load i32, ptr %arrayidx, align 4 2103; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 2104; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2105; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2106; EPILOG: for.exiting_block.1: 2107; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2108; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2109; EPILOG: latch.1: 2110; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2111; EPILOG-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 2112; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2113; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 2114; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2115; EPILOG: for.exiting_block.2: 2116; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2117; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2118; EPILOG: latch.2: 2119; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 2120; EPILOG-NEXT: %5 = load i32, ptr %arrayidx.2, align 4 2121; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2122; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 2123; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2124; EPILOG: for.exiting_block.3: 2125; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2126; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2127; EPILOG: latch.3: 2128; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 2129; EPILOG-NEXT: %6 = load i32, ptr %arrayidx.3, align 4 2130; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2131; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 2132; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2133; EPILOG: for.exiting_block.4: 2134; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2135; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2136; EPILOG: latch.4: 2137; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 2138; EPILOG-NEXT: %7 = load i32, ptr %arrayidx.4, align 4 2139; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2140; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 2141; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2142; EPILOG: for.exiting_block.5: 2143; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2144; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2145; EPILOG: latch.5: 2146; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 2147; EPILOG-NEXT: %8 = load i32, ptr %arrayidx.5, align 4 2148; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2149; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 2150; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2151; EPILOG: for.exiting_block.6: 2152; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2153; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2154; EPILOG: latch.6: 2155; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 2156; EPILOG-NEXT: %9 = load i32, ptr %arrayidx.6, align 4 2157; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2158; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 2159; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2160; EPILOG: for.exiting_block.7: 2161; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2162; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2163; EPILOG: latch.7: 2164; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 2165; EPILOG-NEXT: %10 = load i32, ptr %arrayidx.7, align 4 2166; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2167; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 2168; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 2169; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2170; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2171; EPILOG: latchExit.unr-lcssa.loopexit: 2172; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2173; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2174; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2175; EPILOG-NEXT: br label %latchExit.unr-lcssa 2176; EPILOG: latchExit.unr-lcssa: 2177; EPILOG-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2178; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2179; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2180; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2181; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2182; EPILOG: header.epil.preheader: 2183; EPILOG-NEXT: br label %header.epil 2184; EPILOG: header.epil: 2185; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2186; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2187; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 2188; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2189; EPILOG: for.exiting_block.epil: 2190; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2191; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2192; EPILOG: latch.epil: 2193; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 2194; EPILOG-NEXT: %11 = load i32, ptr %arrayidx.epil, align 4 2195; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 2196; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2197; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2198; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 2199; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 2200; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6 2201; EPILOG: latchExit.epilog-lcssa.loopexit: 2202; 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 ] 2203; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2204; EPILOG: latchExit.epilog-lcssa.loopexit3: 2205; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2206; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2207; EPILOG: latchExit.epilog-lcssa: 2208; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2209; EPILOG-NEXT: br label %latchExit 2210; EPILOG: latchExit: 2211; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2212; EPILOG-NEXT: ret i32 %result 2213; EPILOG: for.exit2.loopexit: 2214; EPILOG-NEXT: br label %for.exit2 2215; EPILOG: for.exit2.loopexit2: 2216; EPILOG-NEXT: br label %for.exit2 2217; EPILOG: for.exit2: 2218; EPILOG-NEXT: ret i32 42 2219; 2220; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2221; EPILOG-BLOCK-NEXT: entry: 2222; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 2223; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 2224; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2225; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 2226; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 2227; EPILOG-BLOCK: entry.new: 2228; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2229; EPILOG-BLOCK-NEXT: br label %header 2230; EPILOG-BLOCK: header: 2231; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2232; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 2233; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 2234; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2235; EPILOG-BLOCK: for.exiting_block: 2236; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2237; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2238; EPILOG-BLOCK: latch: 2239; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2240; EPILOG-BLOCK-NEXT: %3 = load i32, ptr %arrayidx, align 4 2241; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2242; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2243; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2244; EPILOG-BLOCK: for.exiting_block.1: 2245; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2246; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2247; EPILOG-BLOCK: latch.1: 2248; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2249; EPILOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 2250; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2251; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2252; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 2253; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2254; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2255; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2256; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2257; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2258; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2259; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2260; EPILOG-BLOCK: latchExit.unr-lcssa: 2261; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2262; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2263; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2264; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2265; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2266; EPILOG-BLOCK: header.epil.preheader: 2267; EPILOG-BLOCK-NEXT: br label %header.epil 2268; EPILOG-BLOCK: header.epil: 2269; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2270; EPILOG-BLOCK: for.exiting_block.epil: 2271; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2272; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2273; EPILOG-BLOCK: latch.epil: 2274; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 2275; EPILOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.epil, align 4 2276; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 2277; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2278; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2279; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2280; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2281; EPILOG-BLOCK: latchExit.epilog-lcssa: 2282; 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 ] 2283; EPILOG-BLOCK-NEXT: br label %latchExit 2284; EPILOG-BLOCK: latchExit: 2285; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2286; EPILOG-BLOCK-NEXT: ret i32 %result 2287; EPILOG-BLOCK: for.exit2.loopexit: 2288; EPILOG-BLOCK-NEXT: br label %for.exit2 2289; EPILOG-BLOCK: for.exit2: 2290; EPILOG-BLOCK-NEXT: ret i32 42 2291; 2292; PROLOG-LABEL: @otherblock_latch_same_exit2( 2293; PROLOG-NEXT: entry: 2294; PROLOG-NEXT: %0 = freeze i64 %n 2295; PROLOG-NEXT: %1 = add i64 %0, -1 2296; PROLOG-NEXT: %xtraiter = and i64 %0, 7 2297; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2298; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2299; PROLOG: header.prol.preheader: 2300; PROLOG-NEXT: br label %header.prol 2301; PROLOG: header.prol: 2302; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2303; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2304; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 2305; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 2306; PROLOG: for.exiting_block.prol: 2307; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 2308; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 2309; PROLOG: latch.prol: 2310; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 2311; PROLOG-NEXT: %2 = load i32, ptr %arrayidx.prol, align 4 2312; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 2313; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 2314; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2315; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 2316; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 2317; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6 2318; PROLOG: header.prol.loopexit.unr-lcssa: 2319; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2320; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 2321; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2322; PROLOG-NEXT: br label %header.prol.loopexit 2323; PROLOG: header.prol.loopexit: 2324; PROLOG-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 2325; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 2326; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2327; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 2328; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 2329; PROLOG: entry.new: 2330; PROLOG-NEXT: br label %header 2331; PROLOG: header: 2332; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2333; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 2334; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2335; PROLOG: for.exiting_block: 2336; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2337; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2338; PROLOG: latch: 2339; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2340; PROLOG-NEXT: %4 = load i32, ptr %arrayidx, align 4 2341; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 2342; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2343; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2344; PROLOG: for.exiting_block.1: 2345; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2346; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2347; PROLOG: latch.1: 2348; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2349; PROLOG-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 2350; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 2351; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2352; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2353; PROLOG: for.exiting_block.2: 2354; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2355; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2356; PROLOG: latch.2: 2357; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 2358; PROLOG-NEXT: %6 = load i32, ptr %arrayidx.2, align 4 2359; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 2360; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 2361; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2362; PROLOG: for.exiting_block.3: 2363; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2364; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2365; PROLOG: latch.3: 2366; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 2367; PROLOG-NEXT: %7 = load i32, ptr %arrayidx.3, align 4 2368; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 2369; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 2370; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2371; PROLOG: for.exiting_block.4: 2372; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2373; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2374; PROLOG: latch.4: 2375; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 2376; PROLOG-NEXT: %8 = load i32, ptr %arrayidx.4, align 4 2377; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 2378; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 2379; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2380; PROLOG: for.exiting_block.5: 2381; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2382; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2383; PROLOG: latch.5: 2384; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 2385; PROLOG-NEXT: %9 = load i32, ptr %arrayidx.5, align 4 2386; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 2387; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 2388; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2389; PROLOG: for.exiting_block.6: 2390; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2391; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2392; PROLOG: latch.6: 2393; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 2394; PROLOG-NEXT: %10 = load i32, ptr %arrayidx.6, align 4 2395; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 2396; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 2397; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2398; PROLOG: for.exiting_block.7: 2399; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2400; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2401; PROLOG: latch.7: 2402; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 2403; PROLOG-NEXT: %11 = load i32, ptr %arrayidx.7, align 4 2404; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 2405; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 2406; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2407; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2408; PROLOG: latchExit.unr-lcssa.loopexit: 2409; 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 ] 2410; PROLOG-NEXT: br label %latchExit.unr-lcssa 2411; PROLOG: latchExit.unr-lcssa.loopexit2: 2412; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2413; PROLOG-NEXT: br label %latchExit.unr-lcssa 2414; PROLOG: latchExit.unr-lcssa: 2415; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2416; PROLOG-NEXT: br label %latchExit 2417; PROLOG: latchExit: 2418; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2419; PROLOG-NEXT: ret i32 %result 2420; PROLOG: for.exit2.loopexit: 2421; PROLOG-NEXT: br label %for.exit2 2422; PROLOG: for.exit2.loopexit1: 2423; PROLOG-NEXT: br label %for.exit2 2424; PROLOG: for.exit2: 2425; PROLOG-NEXT: ret i32 42 2426; 2427; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2428; PROLOG-BLOCK-NEXT: entry: 2429; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 2430; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 2431; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2432; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2433; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2434; PROLOG-BLOCK: header.prol.preheader: 2435; PROLOG-BLOCK-NEXT: br label %header.prol 2436; PROLOG-BLOCK: header.prol: 2437; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 2438; PROLOG-BLOCK: for.exiting_block.prol: 2439; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 2440; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 2441; PROLOG-BLOCK: latch.prol: 2442; PROLOG-BLOCK-NEXT: %2 = load i32, ptr %a, align 4 2443; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 2444; PROLOG-BLOCK: header.prol.loopexit: 2445; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ] 2446; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2447; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2448; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2449; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 2450; PROLOG-BLOCK: entry.new: 2451; PROLOG-BLOCK-NEXT: br label %header 2452; PROLOG-BLOCK: header: 2453; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2454; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 2455; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2456; PROLOG-BLOCK: for.exiting_block: 2457; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2458; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2459; PROLOG-BLOCK: latch: 2460; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2461; PROLOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx, align 4 2462; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 2463; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2464; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2465; PROLOG-BLOCK: for.exiting_block.1: 2466; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2467; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2468; PROLOG-BLOCK: latch.1: 2469; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2470; PROLOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 2471; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2472; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2473; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2474; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 2475; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2476; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2477; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2478; PROLOG-BLOCK: latchExit.unr-lcssa: 2479; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2480; PROLOG-BLOCK-NEXT: br label %latchExit 2481; PROLOG-BLOCK: latchExit: 2482; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2483; PROLOG-BLOCK-NEXT: ret i32 %result 2484; PROLOG-BLOCK: for.exit2.loopexit: 2485; PROLOG-BLOCK-NEXT: br label %for.exit2 2486; PROLOG-BLOCK: for.exit2: 2487; PROLOG-BLOCK-NEXT: ret i32 42 2488; 2489 2490entry: 2491 br label %header 2492 2493header: 2494 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2495 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2496 br i1 %cond, label %for.exit2, label %for.exiting_block 2497 2498for.exiting_block: 2499 %cmp = icmp eq i64 %n, 42 2500 br i1 %cmp, label %latchExit, label %latch 2501 2502latch: ; preds = %latch, %entry 2503 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2504 %0 = load i32, ptr %arrayidx, align 4 2505 %add = add nsw i32 %0, %sum.02 2506 %indvars.iv.next = add i64 %indvars.iv, 1 2507 %exitcond = icmp eq i64 %indvars.iv.next, %n 2508 br i1 %exitcond, label %latchExit, label %header 2509 2510latchExit: ; preds = %latch, %entry 2511 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2512 ret i32 %result 2513 2514for.exit2: 2515 ret i32 42 2516} 2517 2518; Two exiting blocks to latch where the exiting blocks are Latch and a 2519; non-header 2520; Same as above test except the incoming value for cloned latch Phi is from the 2521; for.exiting_block. 2522; FIXME: We should be able to runtime unroll. 2523define i32 @otherblock_latch_same_exit3(ptr nocapture %a, i64 %n, i1 %cond) { 2524; EPILOG-LABEL: @otherblock_latch_same_exit3( 2525; EPILOG-NEXT: entry: 2526; EPILOG-NEXT: %0 = freeze i64 %n 2527; EPILOG-NEXT: %1 = add i64 %0, -1 2528; EPILOG-NEXT: %xtraiter = and i64 %0, 7 2529; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 2530; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 2531; EPILOG: entry.new: 2532; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2533; EPILOG-NEXT: br label %header 2534; EPILOG: header: 2535; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2536; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 2537; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 2538; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2539; EPILOG: for.exiting_block: 2540; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2541; EPILOG-NEXT: %3 = load i32, ptr %arrayidx, align 4 2542; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 2543; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 2544; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2545; EPILOG: latch: 2546; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2547; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2548; EPILOG: for.exiting_block.1: 2549; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2550; EPILOG-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 2551; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2552; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2553; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2554; EPILOG: latch.1: 2555; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 2556; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2557; EPILOG: for.exiting_block.2: 2558; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 2559; EPILOG-NEXT: %5 = load i32, ptr %arrayidx.2, align 4 2560; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2561; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2562; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2563; EPILOG: latch.2: 2564; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 2565; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2566; EPILOG: for.exiting_block.3: 2567; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 2568; EPILOG-NEXT: %6 = load i32, ptr %arrayidx.3, align 4 2569; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2570; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2571; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2572; EPILOG: latch.3: 2573; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 2574; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2575; EPILOG: for.exiting_block.4: 2576; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 2577; EPILOG-NEXT: %7 = load i32, ptr %arrayidx.4, align 4 2578; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2579; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2580; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2581; EPILOG: latch.4: 2582; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 2583; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2584; EPILOG: for.exiting_block.5: 2585; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 2586; EPILOG-NEXT: %8 = load i32, ptr %arrayidx.5, align 4 2587; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2588; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2589; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2590; EPILOG: latch.5: 2591; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 2592; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2593; EPILOG: for.exiting_block.6: 2594; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 2595; EPILOG-NEXT: %9 = load i32, ptr %arrayidx.6, align 4 2596; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2597; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2598; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2599; EPILOG: latch.6: 2600; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 2601; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2602; EPILOG: for.exiting_block.7: 2603; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 2604; EPILOG-NEXT: %10 = load i32, ptr %arrayidx.7, align 4 2605; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2606; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2607; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2608; EPILOG: latch.7: 2609; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 2610; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 2611; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2612; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 2613; EPILOG: latchExit.unr-lcssa.loopexit: 2614; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 2615; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 2616; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 2617; EPILOG-NEXT: br label %latchExit.unr-lcssa 2618; EPILOG: latchExit.unr-lcssa: 2619; EPILOG-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2620; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2621; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2622; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2623; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2624; EPILOG: header.epil.preheader: 2625; EPILOG-NEXT: br label %header.epil 2626; EPILOG: header.epil: 2627; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 2628; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 2629; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 2630; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 2631; EPILOG: for.exiting_block.epil: 2632; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 2633; EPILOG-NEXT: %11 = load i32, ptr %arrayidx.epil, align 4 2634; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 2635; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 2636; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 2637; EPILOG: latch.epil: 2638; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 2639; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 2640; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 2641; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 2642; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7 2643; EPILOG: latchExit.epilog-lcssa.loopexit: 2644; 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 ] 2645; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2646; EPILOG: latchExit.epilog-lcssa.loopexit3: 2647; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 2648; EPILOG-NEXT: br label %latchExit.epilog-lcssa 2649; EPILOG: latchExit.epilog-lcssa: 2650; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 2651; EPILOG-NEXT: br label %latchExit 2652; EPILOG: latchExit: 2653; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2654; EPILOG-NEXT: ret i32 %result 2655; EPILOG: for.exit2.loopexit: 2656; EPILOG-NEXT: br label %for.exit2 2657; EPILOG: for.exit2.loopexit2: 2658; EPILOG-NEXT: br label %for.exit2 2659; EPILOG: for.exit2: 2660; EPILOG-NEXT: ret i32 42 2661; 2662; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2663; EPILOG-BLOCK-NEXT: entry: 2664; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 2665; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 2666; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2667; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 2668; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 2669; EPILOG-BLOCK: entry.new: 2670; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2671; EPILOG-BLOCK-NEXT: br label %header 2672; EPILOG-BLOCK: header: 2673; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2674; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 2675; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 2676; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2677; EPILOG-BLOCK: for.exiting_block: 2678; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2679; EPILOG-BLOCK-NEXT: %3 = load i32, ptr %arrayidx, align 4 2680; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2681; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2682; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2683; EPILOG-BLOCK: latch: 2684; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 2685; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2686; EPILOG-BLOCK: for.exiting_block.1: 2687; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2688; EPILOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx.1, align 4 2689; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2690; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2691; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2692; EPILOG-BLOCK: latch.1: 2693; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2694; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 2695; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2696; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 2697; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 2698; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 2699; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 2700; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 2701; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2702; EPILOG-BLOCK: latchExit.unr-lcssa: 2703; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2704; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 2705; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 2706; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2707; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 2708; EPILOG-BLOCK: header.epil.preheader: 2709; EPILOG-BLOCK-NEXT: br label %header.epil 2710; EPILOG-BLOCK: header.epil: 2711; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 2712; EPILOG-BLOCK: for.exiting_block.epil: 2713; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 2714; EPILOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.epil, align 4 2715; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 2716; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 2717; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 2718; EPILOG-BLOCK: latch.epil: 2719; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2720; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 2721; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 2722; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 2723; EPILOG-BLOCK: latchExit.epilog-lcssa: 2724; 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 ] 2725; EPILOG-BLOCK-NEXT: br label %latchExit 2726; EPILOG-BLOCK: latchExit: 2727; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2728; EPILOG-BLOCK-NEXT: ret i32 %result 2729; EPILOG-BLOCK: for.exit2.loopexit: 2730; EPILOG-BLOCK-NEXT: br label %for.exit2 2731; EPILOG-BLOCK: for.exit2: 2732; EPILOG-BLOCK-NEXT: ret i32 42 2733; 2734; PROLOG-LABEL: @otherblock_latch_same_exit3( 2735; PROLOG-NEXT: entry: 2736; PROLOG-NEXT: %0 = freeze i64 %n 2737; PROLOG-NEXT: %1 = add i64 %0, -1 2738; PROLOG-NEXT: %xtraiter = and i64 %0, 7 2739; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2740; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2741; PROLOG: header.prol.preheader: 2742; PROLOG-NEXT: br label %header.prol 2743; PROLOG: header.prol: 2744; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2745; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 2746; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 2747; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 2748; PROLOG: for.exiting_block.prol: 2749; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 2750; PROLOG-NEXT: %2 = load i32, ptr %arrayidx.prol, align 4 2751; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 2752; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 2753; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 2754; PROLOG: latch.prol: 2755; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 2756; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 2757; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 2758; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 2759; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7 2760; PROLOG: header.prol.loopexit.unr-lcssa: 2761; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2762; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 2763; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 2764; PROLOG-NEXT: br label %header.prol.loopexit 2765; PROLOG: header.prol.loopexit: 2766; PROLOG-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 2767; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 2768; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2769; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 2770; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 2771; PROLOG: entry.new: 2772; PROLOG-NEXT: br label %header 2773; PROLOG: header: 2774; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 2775; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 2776; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2777; PROLOG: for.exiting_block: 2778; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2779; PROLOG-NEXT: %4 = load i32, ptr %arrayidx, align 4 2780; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 2781; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 2782; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2783; PROLOG: latch: 2784; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2785; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2786; PROLOG: for.exiting_block.1: 2787; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2788; PROLOG-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 2789; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 2790; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2791; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2792; PROLOG: latch.1: 2793; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2794; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2795; PROLOG: for.exiting_block.2: 2796; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 2797; PROLOG-NEXT: %6 = load i32, ptr %arrayidx.2, align 4 2798; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 2799; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2800; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 2801; PROLOG: latch.2: 2802; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 2803; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2804; PROLOG: for.exiting_block.3: 2805; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 2806; PROLOG-NEXT: %7 = load i32, ptr %arrayidx.3, align 4 2807; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 2808; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2809; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 2810; PROLOG: latch.3: 2811; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 2812; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2813; PROLOG: for.exiting_block.4: 2814; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 2815; PROLOG-NEXT: %8 = load i32, ptr %arrayidx.4, align 4 2816; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 2817; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2818; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 2819; PROLOG: latch.4: 2820; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 2821; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2822; PROLOG: for.exiting_block.5: 2823; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 2824; PROLOG-NEXT: %9 = load i32, ptr %arrayidx.5, align 4 2825; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 2826; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2827; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 2828; PROLOG: latch.5: 2829; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 2830; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2831; PROLOG: for.exiting_block.6: 2832; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 2833; PROLOG-NEXT: %10 = load i32, ptr %arrayidx.6, align 4 2834; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 2835; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2836; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 2837; PROLOG: latch.6: 2838; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 2839; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2840; PROLOG: for.exiting_block.7: 2841; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 2842; PROLOG-NEXT: %11 = load i32, ptr %arrayidx.7, align 4 2843; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 2844; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2845; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 2846; PROLOG: latch.7: 2847; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 2848; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 2849; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2850; PROLOG: latchExit.unr-lcssa.loopexit: 2851; 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 ] 2852; PROLOG-NEXT: br label %latchExit.unr-lcssa 2853; PROLOG: latchExit.unr-lcssa.loopexit2: 2854; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2855; PROLOG-NEXT: br label %latchExit.unr-lcssa 2856; PROLOG: latchExit.unr-lcssa: 2857; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2858; PROLOG-NEXT: br label %latchExit 2859; PROLOG: latchExit: 2860; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2861; PROLOG-NEXT: ret i32 %result 2862; PROLOG: for.exit2.loopexit: 2863; PROLOG-NEXT: br label %for.exit2 2864; PROLOG: for.exit2.loopexit1: 2865; PROLOG-NEXT: br label %for.exit2 2866; PROLOG: for.exit2: 2867; PROLOG-NEXT: ret i32 42 2868; 2869; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2870; PROLOG-BLOCK-NEXT: entry: 2871; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 2872; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 2873; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2874; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2875; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 2876; PROLOG-BLOCK: header.prol.preheader: 2877; PROLOG-BLOCK-NEXT: br label %header.prol 2878; PROLOG-BLOCK: header.prol: 2879; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 2880; PROLOG-BLOCK: for.exiting_block.prol: 2881; PROLOG-BLOCK-NEXT: %2 = load i32, ptr %a, align 4 2882; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 2883; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 2884; PROLOG-BLOCK: latch.prol: 2885; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 2886; PROLOG-BLOCK: header.prol.loopexit: 2887; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ] 2888; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2889; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2890; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2891; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 2892; PROLOG-BLOCK: entry.new: 2893; PROLOG-BLOCK-NEXT: br label %header 2894; PROLOG-BLOCK: header: 2895; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 2896; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 2897; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2898; PROLOG-BLOCK: for.exiting_block: 2899; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2900; PROLOG-BLOCK-NEXT: %4 = load i32, ptr %arrayidx, align 4 2901; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 2902; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 2903; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2904; PROLOG-BLOCK: latch: 2905; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 2906; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2907; PROLOG-BLOCK: for.exiting_block.1: 2908; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 2909; PROLOG-BLOCK-NEXT: %5 = load i32, ptr %arrayidx.1, align 4 2910; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2911; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2912; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2913; PROLOG-BLOCK: latch.1: 2914; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 2915; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2916; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 2917; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 2918; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 2919; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 2920; PROLOG-BLOCK: latchExit.unr-lcssa: 2921; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 2922; PROLOG-BLOCK-NEXT: br label %latchExit 2923; PROLOG-BLOCK: latchExit: 2924; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2925; PROLOG-BLOCK-NEXT: ret i32 %result 2926; PROLOG-BLOCK: for.exit2.loopexit: 2927; PROLOG-BLOCK-NEXT: br label %for.exit2 2928; PROLOG-BLOCK: for.exit2: 2929; PROLOG-BLOCK-NEXT: ret i32 42 2930; 2931 2932entry: 2933 br label %header 2934 2935header: 2936 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2937 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2938 br i1 %cond, label %for.exit2, label %for.exiting_block 2939 2940for.exiting_block: 2941 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 2942 %0 = load i32, ptr %arrayidx, align 4 2943 %add = add nsw i32 %0, %sum.02 2944 %cmp = icmp eq i64 %n, 42 2945 br i1 %cmp, label %latchExit, label %latch 2946 2947latch: ; preds = %latch, %entry 2948 %indvars.iv.next = add i64 %indvars.iv, 1 2949 %exitcond = icmp eq i64 %indvars.iv.next, %n 2950 br i1 %exitcond, label %latchExit, label %header 2951 2952latchExit: ; preds = %latch, %entry 2953 %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2954 ret i32 %result 2955 2956for.exit2: 2957 ret i32 42 2958} 2959 2960; Show a case where we have multiple exits, but (provably) exit on the 2961; first iteration and thus have nothing to unroll 2962define void @non_loop(i32 %arg) { 2963; CHECK-LABEL: @non_loop( 2964; CHECK-NEXT: entry: 2965; CHECK-NEXT: %i = icmp sgt i32 undef, %arg 2966; CHECK-NEXT: br i1 %i, label %preheader, label %returnblock 2967; CHECK: preheader: 2968; CHECK-NEXT: br label %header 2969; CHECK: header: 2970; CHECK-NEXT: br i1 true, label %latchExit, label %latch 2971; CHECK: latch: 2972; CHECK-NEXT: br label %latchExit 2973; CHECK: latchExit: 2974; CHECK-NEXT: %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ] 2975; CHECK-NEXT: br label %returnblock 2976; CHECK: returnblock: 2977; CHECK-NEXT: %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 2978; CHECK-NEXT: ret void 2979; 2980 2981entry: 2982 %i = icmp sgt i32 undef, %arg 2983 br i1 %i, label %preheader, label %returnblock 2984 2985preheader: ; preds = %entry 2986 br label %header 2987 2988header: ; preds = %preheader, %latch 2989 %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] 2990 %inc = add nsw i32 %i4, 1 2991 br i1 true, label %latchExit, label %latch 2992 2993latch: ; preds = %header 2994 %cmp = icmp slt i32 %inc, undef 2995 br i1 %cmp, label %header, label %latchExit 2996 2997latchExit: ; preds = %header, %latch 2998 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 2999 br label %returnblock 3000 3001returnblock: ; preds = %latchExit, %entry 3002 %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 3003 ret void 3004} 3005 3006; Latch exit is shared by all exiting blocks 3007define void @unique_exit(i32 %N, i32 %M) { 3008; EPILOG-LABEL: @unique_exit( 3009; EPILOG-NEXT: preheader: 3010; EPILOG-NEXT: %M.shifted = shl i32 %M, 3 3011; EPILOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3012; EPILOG-NEXT: %0 = freeze i32 %umax 3013; EPILOG-NEXT: %1 = add i32 %0, -1 3014; EPILOG-NEXT: %xtraiter = and i32 %0, 7 3015; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 3016; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3017; EPILOG: preheader.new: 3018; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter 3019; EPILOG-NEXT: br label %header 3020; EPILOG: header: 3021; EPILOG-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ] 3022; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 3023; EPILOG-NEXT: %inc = add nuw nsw i32 %i4, 1 3024; EPILOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3025; EPILOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3026; EPILOG: latch: 3027; EPILOG-NEXT: %inc.1 = add nuw nsw i32 %i4, 2 3028; EPILOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3029; EPILOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3030; EPILOG: latch.1: 3031; EPILOG-NEXT: %inc.2 = add nuw nsw i32 %i4, 3 3032; EPILOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3033; EPILOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit 3034; EPILOG: latch.2: 3035; EPILOG-NEXT: %inc.3 = add nuw nsw i32 %i4, 4 3036; EPILOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3037; EPILOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit 3038; EPILOG: latch.3: 3039; EPILOG-NEXT: %inc.4 = add nuw nsw i32 %i4, 5 3040; EPILOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3041; EPILOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit 3042; EPILOG: latch.4: 3043; EPILOG-NEXT: %inc.5 = add nuw nsw i32 %i4, 6 3044; EPILOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3045; EPILOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit 3046; EPILOG: latch.5: 3047; EPILOG-NEXT: %inc.6 = add nuw nsw i32 %i4, 7 3048; EPILOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3049; EPILOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit 3050; EPILOG: latch.6: 3051; EPILOG-NEXT: %inc.7 = add nuw i32 %i4, 8 3052; EPILOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3053; EPILOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit 3054; EPILOG: latch.7: 3055; EPILOG-NEXT: %niter.next.7 = add nuw i32 %niter, 8 3056; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 3057; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3058; EPILOG: latchExit.unr-lcssa.loopexit: 3059; EPILOG-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ] 3060; EPILOG-NEXT: %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ] 3061; EPILOG-NEXT: br label %latchExit.unr-lcssa 3062; EPILOG: latchExit.unr-lcssa: 3063; EPILOG-NEXT: %i2.ph.ph = phi i32 [ poison, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3064; EPILOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3065; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3066; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3067; EPILOG: header.epil.preheader: 3068; EPILOG-NEXT: br label %header.epil 3069; EPILOG: header.epil: 3070; EPILOG-NEXT: %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ] 3071; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3072; EPILOG-NEXT: %inc.epil = add nuw i32 %i4.epil, 1 3073; EPILOG-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3074; EPILOG-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2 3075; EPILOG: latch.epil: 3076; EPILOG-NEXT: %cmp.epil = icmp ult i32 %inc.epil, %M.shifted 3077; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 3078; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 3079; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8 3080; EPILOG: latchExit.epilog-lcssa.loopexit: 3081; EPILOG-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ] 3082; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3083; EPILOG: latchExit.epilog-lcssa.loopexit2: 3084; EPILOG-NEXT: %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ] 3085; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3086; EPILOG: latchExit.epilog-lcssa: 3087; EPILOG-NEXT: %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 3088; EPILOG-NEXT: br label %latchExit 3089; EPILOG: latchExit: 3090; EPILOG-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3091; EPILOG-NEXT: ret void 3092; 3093; EPILOG-BLOCK-LABEL: @unique_exit( 3094; EPILOG-BLOCK-NEXT: preheader: 3095; EPILOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 3096; EPILOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3097; EPILOG-BLOCK-NEXT: %0 = freeze i32 %umax 3098; EPILOG-BLOCK-NEXT: %1 = add i32 %0, -1 3099; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 3100; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3101; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3102; EPILOG-BLOCK: preheader.new: 3103; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter 3104; EPILOG-BLOCK-NEXT: br label %header 3105; EPILOG-BLOCK: header: 3106; EPILOG-BLOCK-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ] 3107; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 3108; EPILOG-BLOCK-NEXT: %inc = add nuw nsw i32 %i4, 1 3109; EPILOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3110; EPILOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3111; EPILOG-BLOCK: latch: 3112; EPILOG-BLOCK-NEXT: %inc.1 = add nuw i32 %i4, 2 3113; EPILOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3114; EPILOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3115; EPILOG-BLOCK: latch.1: 3116; EPILOG-BLOCK-NEXT: %niter.next.1 = add nuw i32 %niter, 2 3117; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 3118; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3119; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 3120; EPILOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ] 3121; EPILOG-BLOCK-NEXT: %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ] 3122; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3123; EPILOG-BLOCK: latchExit.unr-lcssa: 3124; EPILOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ poison, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3125; EPILOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3126; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3127; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3128; EPILOG-BLOCK: header.epil.preheader: 3129; EPILOG-BLOCK-NEXT: br label %header.epil 3130; EPILOG-BLOCK: header.epil: 3131; EPILOG-BLOCK-NEXT: %inc.epil = add nuw i32 %i4.unr, 1 3132; EPILOG-BLOCK-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3133; EPILOG-BLOCK-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa 3134; EPILOG-BLOCK: latch.epil: 3135; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3136; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 3137; EPILOG-BLOCK-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ] 3138; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3139; EPILOG-BLOCK: latchExit.epilog-lcssa: 3140; EPILOG-BLOCK-NEXT: %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 3141; EPILOG-BLOCK-NEXT: br label %latchExit 3142; EPILOG-BLOCK: latchExit: 3143; EPILOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3144; EPILOG-BLOCK-NEXT: ret void 3145; 3146; PROLOG-LABEL: @unique_exit( 3147; PROLOG-NEXT: preheader: 3148; PROLOG-NEXT: %M.shifted = shl i32 %M, 3 3149; PROLOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3150; PROLOG-NEXT: %0 = freeze i32 %umax 3151; PROLOG-NEXT: %1 = add i32 %0, -1 3152; PROLOG-NEXT: %xtraiter = and i32 %0, 7 3153; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3154; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3155; PROLOG: header.prol.preheader: 3156; PROLOG-NEXT: br label %header.prol 3157; PROLOG: header.prol: 3158; PROLOG-NEXT: %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3159; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 3160; PROLOG-NEXT: %inc.prol = add nuw i32 %i4.prol, 1 3161; PROLOG-NEXT: %cmp1.prol = icmp ult i32 %inc.prol, %N 3162; PROLOG-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1 3163; PROLOG: latch.prol: 3164; PROLOG-NEXT: %cmp.prol = icmp ult i32 %inc.prol, %M.shifted 3165; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 3166; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 3167; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8 3168; PROLOG: header.prol.loopexit.unr-lcssa: 3169; PROLOG-NEXT: %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ] 3170; PROLOG-NEXT: %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ] 3171; PROLOG-NEXT: br label %header.prol.loopexit 3172; PROLOG: header.prol.loopexit: 3173; PROLOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ] 3174; PROLOG-NEXT: %i2.ph.unr = phi i32 [ poison, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ] 3175; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 3176; PROLOG-NEXT: br i1 %2, label %latchExit, label %preheader.new 3177; PROLOG: preheader.new: 3178; PROLOG-NEXT: br label %header 3179; PROLOG: header: 3180; PROLOG-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ] 3181; PROLOG-NEXT: %inc = add nuw i32 %i4, 1 3182; PROLOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3183; PROLOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3184; PROLOG: latch: 3185; PROLOG-NEXT: %inc.1 = add nuw i32 %i4, 2 3186; PROLOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3187; PROLOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3188; PROLOG: latch.1: 3189; PROLOG-NEXT: %inc.2 = add nuw i32 %i4, 3 3190; PROLOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3191; PROLOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit 3192; PROLOG: latch.2: 3193; PROLOG-NEXT: %inc.3 = add nuw i32 %i4, 4 3194; PROLOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3195; PROLOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit 3196; PROLOG: latch.3: 3197; PROLOG-NEXT: %inc.4 = add nuw i32 %i4, 5 3198; PROLOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3199; PROLOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit 3200; PROLOG: latch.4: 3201; PROLOG-NEXT: %inc.5 = add nuw i32 %i4, 6 3202; PROLOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3203; PROLOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit 3204; PROLOG: latch.5: 3205; PROLOG-NEXT: %inc.6 = add nuw i32 %i4, 7 3206; PROLOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3207; PROLOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit 3208; PROLOG: latch.6: 3209; PROLOG-NEXT: %inc.7 = add nuw i32 %i4, 8 3210; PROLOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3211; PROLOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit 3212; PROLOG: latch.7: 3213; PROLOG-NEXT: %cmp.7 = icmp ult i32 %inc.7, %M.shifted 3214; PROLOG-NEXT: br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3215; PROLOG: latchExit.unr-lcssa.loopexit: 3216; PROLOG-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ] 3217; PROLOG-NEXT: br label %latchExit.unr-lcssa 3218; PROLOG: latchExit.unr-lcssa.loopexit1: 3219; PROLOG-NEXT: %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ] 3220; PROLOG-NEXT: br label %latchExit.unr-lcssa 3221; PROLOG: latchExit.unr-lcssa: 3222; PROLOG-NEXT: %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 3223; PROLOG-NEXT: br label %latchExit 3224; PROLOG: latchExit: 3225; PROLOG-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3226; PROLOG-NEXT: ret void 3227; 3228; PROLOG-BLOCK-LABEL: @unique_exit( 3229; PROLOG-BLOCK-NEXT: preheader: 3230; PROLOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 3231; PROLOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3232; PROLOG-BLOCK-NEXT: %0 = freeze i32 %umax 3233; PROLOG-BLOCK-NEXT: %1 = add i32 %0, -1 3234; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 3235; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3236; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3237; PROLOG-BLOCK: header.prol.preheader: 3238; PROLOG-BLOCK-NEXT: br label %header.prol 3239; PROLOG-BLOCK: header.prol: 3240; PROLOG-BLOCK-NEXT: %cmp1.prol = icmp ult i32 1, %N 3241; PROLOG-BLOCK-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa 3242; PROLOG-BLOCK: latch.prol: 3243; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3244; PROLOG-BLOCK: header.prol.loopexit: 3245; PROLOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ] 3246; PROLOG-BLOCK-NEXT: %i2.ph.unr = phi i32 [ poison, %preheader ], [ -1, %latch.prol ] 3247; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3248; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %preheader.new 3249; PROLOG-BLOCK: preheader.new: 3250; PROLOG-BLOCK-NEXT: br label %header 3251; PROLOG-BLOCK: header: 3252; PROLOG-BLOCK-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ] 3253; PROLOG-BLOCK-NEXT: %inc = add nuw i32 %i4, 1 3254; PROLOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3255; PROLOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3256; PROLOG-BLOCK: latch: 3257; PROLOG-BLOCK-NEXT: %inc.1 = add nuw i32 %i4, 2 3258; PROLOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3259; PROLOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3260; PROLOG-BLOCK: latch.1: 3261; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ult i32 %inc.1, %M.shifted 3262; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3263; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 3264; PROLOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ] 3265; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3266; PROLOG-BLOCK: latchExit.unr-lcssa: 3267; PROLOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3268; PROLOG-BLOCK-NEXT: br label %latchExit 3269; PROLOG-BLOCK: latchExit: 3270; PROLOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3271; PROLOG-BLOCK-NEXT: ret void 3272; 3273 3274preheader: 3275 %M.shifted = shl nuw i32 %M, 3 3276 br label %header 3277 3278header: ; preds = %preheader, %latch 3279 %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ] 3280 %inc = add nuw i32 %i4, 1 3281 %cmp1 = icmp ult i32 %inc, %N 3282 br i1 %cmp1, label %latch, label %latchExit 3283 3284latch: ; preds = %header 3285 %cmp = icmp ult i32 %inc, %M.shifted 3286 br i1 %cmp, label %header, label %latchExit 3287 3288latchExit: ; preds = %header, %latch 3289 %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3290 ret void 3291} 3292 3293 3294; two exiting and two exit blocks. 3295; the non-latch exiting block has duplicate edges to the non-latch exit block. 3296define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 3297; EPILOG-LABEL: @test5( 3298; EPILOG-NEXT: entry: 3299; EPILOG-NEXT: %0 = freeze i64 %trip 3300; EPILOG-NEXT: %1 = add i64 %0, -1 3301; EPILOG-NEXT: %xtraiter = and i64 %0, 7 3302; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 3303; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %entry.new 3304; EPILOG: entry.new: 3305; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3306; EPILOG-NEXT: br label %loop_header 3307; EPILOG: loop_header: 3308; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3309; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3310; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 3311; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3312; EPILOG: loop_exiting: 3313; EPILOG-NEXT: %ivy = add i64 %iv, %add 3314; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 3315; EPILOG-NEXT: i64 24, label %exit1.loopexit 3316; EPILOG-NEXT: i64 42, label %exit1.loopexit 3317; EPILOG-NEXT: ] 3318; EPILOG: loop_latch: 3319; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3320; EPILOG-NEXT: %sum.next = add i64 %sum, %add 3321; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3322; EPILOG: loop_exiting.1: 3323; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3324; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3325; EPILOG-NEXT: i64 24, label %exit1.loopexit 3326; EPILOG-NEXT: i64 42, label %exit1.loopexit 3327; EPILOG-NEXT: ] 3328; EPILOG: loop_latch.1: 3329; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 3330; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3331; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3332; EPILOG: loop_exiting.2: 3333; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3334; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3335; EPILOG-NEXT: i64 24, label %exit1.loopexit 3336; EPILOG-NEXT: i64 42, label %exit1.loopexit 3337; EPILOG-NEXT: ] 3338; EPILOG: loop_latch.2: 3339; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv, 3 3340; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3341; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3342; EPILOG: loop_exiting.3: 3343; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3344; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3345; EPILOG-NEXT: i64 24, label %exit1.loopexit 3346; EPILOG-NEXT: i64 42, label %exit1.loopexit 3347; EPILOG-NEXT: ] 3348; EPILOG: loop_latch.3: 3349; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv, 4 3350; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3351; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3352; EPILOG: loop_exiting.4: 3353; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3354; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3355; EPILOG-NEXT: i64 24, label %exit1.loopexit 3356; EPILOG-NEXT: i64 42, label %exit1.loopexit 3357; EPILOG-NEXT: ] 3358; EPILOG: loop_latch.4: 3359; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv, 5 3360; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3361; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3362; EPILOG: loop_exiting.5: 3363; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3364; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3365; EPILOG-NEXT: i64 24, label %exit1.loopexit 3366; EPILOG-NEXT: i64 42, label %exit1.loopexit 3367; EPILOG-NEXT: ] 3368; EPILOG: loop_latch.5: 3369; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv, 6 3370; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3371; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3372; EPILOG: loop_exiting.6: 3373; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3374; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3375; EPILOG-NEXT: i64 24, label %exit1.loopexit 3376; EPILOG-NEXT: i64 42, label %exit1.loopexit 3377; EPILOG-NEXT: ] 3378; EPILOG: loop_latch.6: 3379; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv, 7 3380; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3381; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3382; EPILOG: loop_exiting.7: 3383; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3384; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3385; EPILOG-NEXT: i64 24, label %exit1.loopexit 3386; EPILOG-NEXT: i64 42, label %exit1.loopexit 3387; EPILOG-NEXT: ] 3388; EPILOG: loop_latch.7: 3389; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv, 8 3390; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3391; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 3392; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 3393; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 3394; EPILOG: exit1.loopexit: 3395; 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 ] 3396; EPILOG-NEXT: br label %exit1 3397; EPILOG: exit1.loopexit2: 3398; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 3399; EPILOG-NEXT: br label %exit1 3400; EPILOG: exit1: 3401; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 3402; EPILOG-NEXT: ret i64 %result 3403; EPILOG: latchexit.unr-lcssa.loopexit: 3404; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3405; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 3406; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3407; EPILOG-NEXT: br label %latchexit.unr-lcssa 3408; EPILOG: latchexit.unr-lcssa: 3409; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ poison, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3410; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3411; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3412; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3413; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3414; EPILOG: loop_header.epil.preheader: 3415; EPILOG-NEXT: br label %loop_header.epil 3416; EPILOG: loop_header.epil: 3417; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 3418; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 3419; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 3420; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3421; EPILOG: loop_exiting.epil: 3422; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 3423; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3424; EPILOG-NEXT: i64 24, label %exit1.loopexit2 3425; EPILOG-NEXT: i64 42, label %exit1.loopexit2 3426; EPILOG-NEXT: ] 3427; EPILOG: loop_latch.epil: 3428; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3429; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3430; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 3431; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3432; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3433; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9 3434; EPILOG: latchexit.epilog-lcssa: 3435; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 3436; EPILOG-NEXT: br label %latchexit 3437; EPILOG: latchexit: 3438; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 3439; EPILOG-NEXT: ret i64 %sum.next.lcssa 3440; 3441; EPILOG-BLOCK-LABEL: @test5( 3442; EPILOG-BLOCK-NEXT: entry: 3443; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 3444; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 3445; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3446; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3447; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %entry.new 3448; EPILOG-BLOCK: entry.new: 3449; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3450; EPILOG-BLOCK-NEXT: br label %loop_header 3451; EPILOG-BLOCK: loop_header: 3452; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3453; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3454; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 3455; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3456; EPILOG-BLOCK: loop_exiting: 3457; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3458; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3459; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3460; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3461; EPILOG-BLOCK-NEXT: ] 3462; EPILOG-BLOCK: loop_latch: 3463; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3464; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3465; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3466; EPILOG-BLOCK: loop_exiting.1: 3467; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3468; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3469; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3470; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3471; EPILOG-BLOCK-NEXT: ] 3472; EPILOG-BLOCK: loop_latch.1: 3473; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 3474; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3475; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 3476; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 3477; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9 3478; EPILOG-BLOCK: exit1.loopexit: 3479; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3480; EPILOG-BLOCK-NEXT: br label %exit1 3481; EPILOG-BLOCK: exit1: 3482; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 3483; EPILOG-BLOCK-NEXT: ret i64 %result 3484; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3485; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3486; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 3487; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3488; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3489; EPILOG-BLOCK: latchexit.unr-lcssa: 3490; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ poison, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3491; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3492; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3493; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3494; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3495; EPILOG-BLOCK: loop_header.epil.preheader: 3496; EPILOG-BLOCK-NEXT: br label %loop_header.epil 3497; EPILOG-BLOCK: loop_header.epil: 3498; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3499; EPILOG-BLOCK: loop_exiting.epil: 3500; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.unr, %add 3501; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 3502; EPILOG-BLOCK-NEXT: i64 24, label %exit1 3503; EPILOG-BLOCK-NEXT: i64 42, label %exit1 3504; EPILOG-BLOCK-NEXT: ] 3505; EPILOG-BLOCK: loop_latch.epil: 3506; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.unr, %add 3507; EPILOG-BLOCK-NEXT: br label %latchexit 3508; EPILOG-BLOCK: latchexit: 3509; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ] 3510; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3511; 3512; PROLOG-LABEL: @test5( 3513; PROLOG-NEXT: entry: 3514; PROLOG-NEXT: %0 = freeze i64 %trip 3515; PROLOG-NEXT: %1 = add i64 %0, -1 3516; PROLOG-NEXT: %xtraiter = and i64 %0, 7 3517; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3518; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3519; PROLOG: loop_header.prol.preheader: 3520; PROLOG-NEXT: br label %loop_header.prol 3521; PROLOG: loop_header.prol: 3522; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 3523; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 3524; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 3525; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3526; PROLOG: loop_exiting.prol: 3527; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 3528; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 3529; PROLOG-NEXT: i64 24, label %exit1.loopexit1 3530; PROLOG-NEXT: i64 42, label %exit1.loopexit1 3531; PROLOG-NEXT: ] 3532; PROLOG: loop_latch.prol: 3533; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 3534; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 3535; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 3536; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 3537; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 3538; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9 3539; PROLOG: loop_header.prol.loopexit.unr-lcssa: 3540; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 3541; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3542; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3543; PROLOG-NEXT: br label %loop_header.prol.loopexit 3544; PROLOG: loop_header.prol.loopexit: 3545; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3546; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3547; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3548; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 3549; PROLOG-NEXT: br i1 %2, label %latchexit, label %entry.new 3550; PROLOG: entry.new: 3551; PROLOG-NEXT: br label %loop_header 3552; PROLOG: loop_header: 3553; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3554; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3555; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3556; PROLOG: loop_exiting: 3557; PROLOG-NEXT: %ivy = add i64 %iv, %add 3558; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 3559; PROLOG-NEXT: i64 24, label %exit1.loopexit 3560; PROLOG-NEXT: i64 42, label %exit1.loopexit 3561; PROLOG-NEXT: ] 3562; PROLOG: loop_latch: 3563; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3564; PROLOG-NEXT: %sum.next = add i64 %sum, %add 3565; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3566; PROLOG: loop_exiting.1: 3567; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3568; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3569; PROLOG-NEXT: i64 24, label %exit1.loopexit 3570; PROLOG-NEXT: i64 42, label %exit1.loopexit 3571; PROLOG-NEXT: ] 3572; PROLOG: loop_latch.1: 3573; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 3574; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3575; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3576; PROLOG: loop_exiting.2: 3577; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3578; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3579; PROLOG-NEXT: i64 24, label %exit1.loopexit 3580; PROLOG-NEXT: i64 42, label %exit1.loopexit 3581; PROLOG-NEXT: ] 3582; PROLOG: loop_latch.2: 3583; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv, 3 3584; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3585; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3586; PROLOG: loop_exiting.3: 3587; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3588; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3589; PROLOG-NEXT: i64 24, label %exit1.loopexit 3590; PROLOG-NEXT: i64 42, label %exit1.loopexit 3591; PROLOG-NEXT: ] 3592; PROLOG: loop_latch.3: 3593; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv, 4 3594; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3595; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3596; PROLOG: loop_exiting.4: 3597; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3598; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3599; PROLOG-NEXT: i64 24, label %exit1.loopexit 3600; PROLOG-NEXT: i64 42, label %exit1.loopexit 3601; PROLOG-NEXT: ] 3602; PROLOG: loop_latch.4: 3603; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv, 5 3604; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3605; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3606; PROLOG: loop_exiting.5: 3607; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3608; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3609; PROLOG-NEXT: i64 24, label %exit1.loopexit 3610; PROLOG-NEXT: i64 42, label %exit1.loopexit 3611; PROLOG-NEXT: ] 3612; PROLOG: loop_latch.5: 3613; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv, 6 3614; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3615; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3616; PROLOG: loop_exiting.6: 3617; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3618; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3619; PROLOG-NEXT: i64 24, label %exit1.loopexit 3620; PROLOG-NEXT: i64 42, label %exit1.loopexit 3621; PROLOG-NEXT: ] 3622; PROLOG: loop_latch.6: 3623; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv, 7 3624; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3625; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3626; PROLOG: loop_exiting.7: 3627; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3628; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3629; PROLOG-NEXT: i64 24, label %exit1.loopexit 3630; PROLOG-NEXT: i64 42, label %exit1.loopexit 3631; PROLOG-NEXT: ] 3632; PROLOG: loop_latch.7: 3633; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv, 8 3634; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3635; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 3636; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 3637; PROLOG: exit1.loopexit: 3638; 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 ] 3639; PROLOG-NEXT: br label %exit1 3640; PROLOG: exit1.loopexit1: 3641; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 3642; PROLOG-NEXT: br label %exit1 3643; PROLOG: exit1: 3644; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 3645; PROLOG-NEXT: ret i64 %result 3646; PROLOG: latchexit.unr-lcssa: 3647; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3648; PROLOG-NEXT: br label %latchexit 3649; PROLOG: latchexit: 3650; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3651; PROLOG-NEXT: ret i64 %sum.next.lcssa 3652; 3653; PROLOG-BLOCK-LABEL: @test5( 3654; PROLOG-BLOCK-NEXT: entry: 3655; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 3656; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 3657; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3658; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3659; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3660; PROLOG-BLOCK: loop_header.prol.preheader: 3661; PROLOG-BLOCK-NEXT: br label %loop_header.prol 3662; PROLOG-BLOCK: loop_header.prol: 3663; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3664; PROLOG-BLOCK: loop_exiting.prol: 3665; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 3666; PROLOG-BLOCK-NEXT: i64 24, label %exit1 3667; PROLOG-BLOCK-NEXT: i64 42, label %exit1 3668; PROLOG-BLOCK-NEXT: ] 3669; PROLOG-BLOCK: loop_latch.prol: 3670; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 3671; PROLOG-BLOCK: loop_header.prol.loopexit: 3672; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 3673; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 3674; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %add, %loop_latch.prol ] 3675; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3676; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %entry.new 3677; PROLOG-BLOCK: entry.new: 3678; PROLOG-BLOCK-NEXT: br label %loop_header 3679; PROLOG-BLOCK: loop_header: 3680; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3681; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3682; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3683; PROLOG-BLOCK: loop_exiting: 3684; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3685; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3686; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3687; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3688; PROLOG-BLOCK-NEXT: ] 3689; PROLOG-BLOCK: loop_latch: 3690; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3691; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3692; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3693; PROLOG-BLOCK: loop_exiting.1: 3694; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3695; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3696; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3697; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3698; PROLOG-BLOCK-NEXT: ] 3699; PROLOG-BLOCK: loop_latch.1: 3700; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 3701; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3702; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 3703; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9 3704; PROLOG-BLOCK: exit1.loopexit: 3705; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3706; PROLOG-BLOCK-NEXT: br label %exit1 3707; PROLOG-BLOCK: exit1: 3708; PROLOG-BLOCK-NEXT: %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 3709; PROLOG-BLOCK-NEXT: ret i64 %result 3710; PROLOG-BLOCK: latchexit.unr-lcssa: 3711; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3712; PROLOG-BLOCK-NEXT: br label %latchexit 3713; PROLOG-BLOCK: latchexit: 3714; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3715; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3716; 3717 3718entry: 3719 br label %loop_header 3720 3721loop_header: 3722 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3723 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3724 br i1 %cond, label %loop_latch, label %loop_exiting 3725 3726loop_exiting: 3727 %ivy = add i64 %iv, %add 3728 switch i64 %sum, label %loop_latch [ 3729 i64 24, label %exit1 3730 i64 42, label %exit1 3731 ] 3732 3733loop_latch: 3734 %iv_next = add nuw nsw i64 %iv, 1 3735 %sum.next = add i64 %sum, %add 3736 %cmp = icmp ne i64 %iv_next, %trip 3737 br i1 %cmp, label %loop_header, label %latchexit 3738 3739exit1: 3740 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3741 ret i64 %result 3742 3743latchexit: 3744 ret i64 %sum.next 3745} 3746 3747; test when exit blocks have successors. 3748define i32 @test6(ptr nocapture %a, i64 %n, i1 %cond, i32 %x) { 3749; EPILOG-LABEL: @test6( 3750; EPILOG-NEXT: entry: 3751; EPILOG-NEXT: %0 = freeze i64 %n 3752; EPILOG-NEXT: %1 = add i64 %0, -1 3753; EPILOG-NEXT: %xtraiter = and i64 %0, 7 3754; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 3755; EPILOG-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new 3756; EPILOG: entry.new: 3757; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3758; EPILOG-NEXT: br label %header 3759; EPILOG: header: 3760; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3761; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 3762; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 3763; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3764; EPILOG: for.exiting_block: 3765; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3766; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3767; EPILOG: latch: 3768; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 3769; EPILOG-NEXT: %load = load i32, ptr %arrayidx, align 4 3770; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3771; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3772; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3773; EPILOG: for.exiting_block.1: 3774; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3775; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3776; EPILOG: latch.1: 3777; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 3778; EPILOG-NEXT: %load.1 = load i32, ptr %arrayidx.1, align 4 3779; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3780; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 3781; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3782; EPILOG: for.exiting_block.2: 3783; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3784; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3785; EPILOG: latch.2: 3786; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 3787; EPILOG-NEXT: %load.2 = load i32, ptr %arrayidx.2, align 4 3788; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3789; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3 3790; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3791; EPILOG: for.exiting_block.3: 3792; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3793; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3794; EPILOG: latch.3: 3795; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 3796; EPILOG-NEXT: %load.3 = load i32, ptr %arrayidx.3, align 4 3797; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3798; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4 3799; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3800; EPILOG: for.exiting_block.4: 3801; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3802; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3803; EPILOG: latch.4: 3804; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 3805; EPILOG-NEXT: %load.4 = load i32, ptr %arrayidx.4, align 4 3806; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3807; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5 3808; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3809; EPILOG: for.exiting_block.5: 3810; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3811; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3812; EPILOG: latch.5: 3813; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 3814; EPILOG-NEXT: %load.5 = load i32, ptr %arrayidx.5, align 4 3815; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3816; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6 3817; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3818; EPILOG: for.exiting_block.6: 3819; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3820; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3821; EPILOG: latch.6: 3822; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 3823; EPILOG-NEXT: %load.6 = load i32, ptr %arrayidx.6, align 4 3824; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3825; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7 3826; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3827; EPILOG: for.exiting_block.7: 3828; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3829; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3830; EPILOG: latch.7: 3831; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 3832; EPILOG-NEXT: %load.7 = load i32, ptr %arrayidx.7, align 4 3833; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3834; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 3835; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 3836; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 3837; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3838; EPILOG: latch_exit.unr-lcssa.loopexit: 3839; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3840; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3841; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3842; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3843; EPILOG: latch_exit.unr-lcssa: 3844; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3845; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3846; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3847; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3848; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3849; EPILOG: header.epil.preheader: 3850; EPILOG-NEXT: br label %header.epil 3851; EPILOG: header.epil: 3852; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3853; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 3854; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3855; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3856; EPILOG: for.exiting_block.epil: 3857; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3858; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3859; EPILOG: latch.epil: 3860; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil 3861; EPILOG-NEXT: %load.epil = load i32, ptr %arrayidx.epil, align 4 3862; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3863; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3864; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 3865; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 3866; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3867; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10 3868; EPILOG: latch_exit.epilog-lcssa: 3869; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3870; EPILOG-NEXT: br label %latch_exit 3871; EPILOG: latch_exit: 3872; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3873; EPILOG-NEXT: ret i32 %sum.0.lcssa 3874; EPILOG: for.exit2.loopexit: 3875; 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 ] 3876; EPILOG-NEXT: br label %for.exit2 3877; EPILOG: for.exit2.loopexit2: 3878; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3879; EPILOG-NEXT: br label %for.exit2 3880; EPILOG: for.exit2: 3881; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3882; EPILOG-NEXT: %addx = add i32 %retval, %x 3883; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3884; EPILOG: exit_true: 3885; EPILOG-NEXT: ret i32 %retval 3886; EPILOG: exit_false: 3887; EPILOG-NEXT: ret i32 %addx 3888; 3889; EPILOG-BLOCK-LABEL: @test6( 3890; EPILOG-BLOCK-NEXT: entry: 3891; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 3892; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 3893; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3894; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3895; EPILOG-BLOCK-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new 3896; EPILOG-BLOCK: entry.new: 3897; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3898; EPILOG-BLOCK-NEXT: br label %header 3899; EPILOG-BLOCK: header: 3900; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 3901; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 3902; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 3903; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3904; EPILOG-BLOCK: for.exiting_block: 3905; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 3906; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3907; EPILOG-BLOCK: latch: 3908; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 3909; EPILOG-BLOCK-NEXT: %load = load i32, ptr %arrayidx, align 4 3910; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 3911; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 3912; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3913; EPILOG-BLOCK: for.exiting_block.1: 3914; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3915; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3916; EPILOG-BLOCK: latch.1: 3917; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 3918; EPILOG-BLOCK-NEXT: %load.1 = load i32, ptr %arrayidx.1, align 4 3919; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 3920; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 3921; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 3922; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 3923; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10 3924; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 3925; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 3926; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 3927; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 3928; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 3929; EPILOG-BLOCK: latch_exit.unr-lcssa: 3930; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3931; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3932; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3933; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3934; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3935; EPILOG-BLOCK: header.epil.preheader: 3936; EPILOG-BLOCK-NEXT: br label %header.epil 3937; EPILOG-BLOCK: header.epil: 3938; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 3939; EPILOG-BLOCK: for.exiting_block.epil: 3940; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 3941; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 3942; EPILOG-BLOCK: latch.epil: 3943; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr 3944; EPILOG-BLOCK-NEXT: %load.epil = load i32, ptr %arrayidx.epil, align 4 3945; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.unr 3946; EPILOG-BLOCK-NEXT: br label %latch_exit 3947; EPILOG-BLOCK: latch_exit: 3948; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ] 3949; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 3950; EPILOG-BLOCK: for.exit2.loopexit: 3951; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 3952; EPILOG-BLOCK-NEXT: br label %for.exit2 3953; EPILOG-BLOCK: for.exit2: 3954; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 3955; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 3956; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 3957; EPILOG-BLOCK: exit_true: 3958; EPILOG-BLOCK-NEXT: ret i32 %retval 3959; EPILOG-BLOCK: exit_false: 3960; EPILOG-BLOCK-NEXT: ret i32 %addx 3961; 3962; PROLOG-LABEL: @test6( 3963; PROLOG-NEXT: entry: 3964; PROLOG-NEXT: %0 = freeze i64 %n 3965; PROLOG-NEXT: %1 = add i64 %0, -1 3966; PROLOG-NEXT: %xtraiter = and i64 %0, 7 3967; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3968; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3969; PROLOG: header.prol.preheader: 3970; PROLOG-NEXT: br label %header.prol 3971; PROLOG: header.prol: 3972; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3973; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3974; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 3975; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 3976; PROLOG: for.exiting_block.prol: 3977; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 3978; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 3979; PROLOG: latch.prol: 3980; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol 3981; PROLOG-NEXT: %load.prol = load i32, ptr %arrayidx.prol, align 4 3982; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 3983; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 3984; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 3985; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 3986; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 3987; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10 3988; PROLOG: header.prol.loopexit.unr-lcssa: 3989; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3990; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 3991; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 3992; PROLOG-NEXT: br label %header.prol.loopexit 3993; PROLOG: header.prol.loopexit: 3994; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 3995; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 3996; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 3997; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 3998; PROLOG-NEXT: br i1 %2, label %latch_exit, label %entry.new 3999; PROLOG: entry.new: 4000; PROLOG-NEXT: br label %header 4001; PROLOG: header: 4002; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 4003; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 4004; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4005; PROLOG: for.exiting_block: 4006; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 4007; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4008; PROLOG: latch: 4009; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 4010; PROLOG-NEXT: %load = load i32, ptr %arrayidx, align 4 4011; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 4012; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4013; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4014; PROLOG: for.exiting_block.1: 4015; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 4016; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4017; PROLOG: latch.1: 4018; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 4019; PROLOG-NEXT: %load.1 = load i32, ptr %arrayidx.1, align 4 4020; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 4021; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 4022; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 4023; PROLOG: for.exiting_block.2: 4024; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 4025; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 4026; PROLOG: latch.2: 4027; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1 4028; PROLOG-NEXT: %load.2 = load i32, ptr %arrayidx.2, align 4 4029; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 4030; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv, 3 4031; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 4032; PROLOG: for.exiting_block.3: 4033; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 4034; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 4035; PROLOG: latch.3: 4036; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2 4037; PROLOG-NEXT: %load.3 = load i32, ptr %arrayidx.3, align 4 4038; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 4039; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv, 4 4040; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 4041; PROLOG: for.exiting_block.4: 4042; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 4043; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 4044; PROLOG: latch.4: 4045; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3 4046; PROLOG-NEXT: %load.4 = load i32, ptr %arrayidx.4, align 4 4047; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 4048; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv, 5 4049; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 4050; PROLOG: for.exiting_block.5: 4051; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 4052; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 4053; PROLOG: latch.5: 4054; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4 4055; PROLOG-NEXT: %load.5 = load i32, ptr %arrayidx.5, align 4 4056; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 4057; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv, 6 4058; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 4059; PROLOG: for.exiting_block.6: 4060; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 4061; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 4062; PROLOG: latch.6: 4063; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5 4064; PROLOG-NEXT: %load.6 = load i32, ptr %arrayidx.6, align 4 4065; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 4066; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv, 7 4067; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 4068; PROLOG: for.exiting_block.7: 4069; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 4070; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 4071; PROLOG: latch.7: 4072; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6 4073; PROLOG-NEXT: %load.7 = load i32, ptr %arrayidx.7, align 4 4074; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 4075; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv, 8 4076; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 4077; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 4078; PROLOG: latch_exit.unr-lcssa: 4079; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 4080; PROLOG-NEXT: br label %latch_exit 4081; PROLOG: latch_exit: 4082; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4083; PROLOG-NEXT: ret i32 %sum.0.lcssa 4084; PROLOG: for.exit2.loopexit: 4085; 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 ] 4086; PROLOG-NEXT: br label %for.exit2 4087; PROLOG: for.exit2.loopexit1: 4088; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 4089; PROLOG-NEXT: br label %for.exit2 4090; PROLOG: for.exit2: 4091; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 4092; PROLOG-NEXT: %addx = add i32 %retval, %x 4093; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 4094; PROLOG: exit_true: 4095; PROLOG-NEXT: ret i32 %retval 4096; PROLOG: exit_false: 4097; PROLOG-NEXT: ret i32 %addx 4098; 4099; PROLOG-BLOCK-LABEL: @test6( 4100; PROLOG-BLOCK-NEXT: entry: 4101; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 4102; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 4103; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4104; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4105; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4106; PROLOG-BLOCK: header.prol.preheader: 4107; PROLOG-BLOCK-NEXT: br label %header.prol 4108; PROLOG-BLOCK: header.prol: 4109; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 4110; PROLOG-BLOCK: for.exiting_block.prol: 4111; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 4112; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 4113; PROLOG-BLOCK: latch.prol: 4114; PROLOG-BLOCK-NEXT: %load.prol = load i32, ptr %a, align 4 4115; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4116; PROLOG-BLOCK: header.prol.loopexit: 4117; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %load.prol, %latch.prol ] 4118; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 4119; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ] 4120; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4121; PROLOG-BLOCK-NEXT: br i1 %2, label %latch_exit, label %entry.new 4122; PROLOG-BLOCK: entry.new: 4123; PROLOG-BLOCK-NEXT: br label %header 4124; PROLOG-BLOCK: header: 4125; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 4126; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 4127; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4128; PROLOG-BLOCK: for.exiting_block: 4129; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 4130; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4131; PROLOG-BLOCK: latch: 4132; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 4133; PROLOG-BLOCK-NEXT: %load = load i32, ptr %arrayidx, align 4 4134; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 4135; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 4136; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4137; PROLOG-BLOCK: for.exiting_block.1: 4138; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4139; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4140; PROLOG-BLOCK: latch.1: 4141; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next 4142; PROLOG-BLOCK-NEXT: %load.1 = load i32, ptr %arrayidx.1, align 4 4143; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4144; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv, 2 4145; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 4146; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10 4147; PROLOG-BLOCK: latch_exit.unr-lcssa: 4148; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 4149; PROLOG-BLOCK-NEXT: br label %latch_exit 4150; PROLOG-BLOCK: latch_exit: 4151; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4152; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4153; PROLOG-BLOCK: for.exit2.loopexit: 4154; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4155; PROLOG-BLOCK-NEXT: br label %for.exit2 4156; PROLOG-BLOCK: for.exit2: 4157; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 4158; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4159; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4160; PROLOG-BLOCK: exit_true: 4161; PROLOG-BLOCK-NEXT: ret i32 %retval 4162; PROLOG-BLOCK: exit_false: 4163; PROLOG-BLOCK-NEXT: ret i32 %addx 4164; 4165 4166entry: 4167 br label %header 4168 4169header: 4170 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 4171 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 4172 br i1 false, label %for.exit2, label %for.exiting_block 4173 4174for.exiting_block: 4175 %cmp = icmp eq i64 %n, 42 4176 br i1 %cmp, label %for.exit2, label %latch 4177 4178latch: 4179 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv 4180 %load = load i32, ptr %arrayidx, align 4 4181 %add = add nsw i32 %load, %sum.02 4182 %indvars.iv.next = add i64 %indvars.iv, 1 4183 %exitcond = icmp eq i64 %indvars.iv.next, %n 4184 br i1 %exitcond, label %latch_exit, label %header 4185 4186latch_exit: 4187 %sum.0.lcssa = phi i32 [ %add, %latch ] 4188 ret i32 %sum.0.lcssa 4189 4190for.exit2: 4191 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 4192 %addx = add i32 %retval, %x 4193 br i1 %cond, label %exit_true, label %exit_false 4194 4195exit_true: 4196 ret i32 %retval 4197 4198exit_false: 4199 ret i32 %addx 4200} 4201 4202; test when value in exit block does not have VMap. 4203define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 4204; EPILOG-LABEL: @test7( 4205; EPILOG-NEXT: bb: 4206; EPILOG-NEXT: %i = icmp slt i32 undef, 2 4207; EPILOG-NEXT: %sext = sext i32 undef to i64 4208; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 4209; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4210; EPILOG: preheader: 4211; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 4212; EPILOG-NEXT: %1 = freeze i64 %0 4213; EPILOG-NEXT: %2 = add i64 %1, -1 4214; EPILOG-NEXT: %xtraiter = and i64 %1, 7 4215; EPILOG-NEXT: %3 = icmp ult i64 %2, 7 4216; EPILOG-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new 4217; EPILOG: preheader.new: 4218; EPILOG-NEXT: %unroll_iter = sub i64 %1, %xtraiter 4219; EPILOG-NEXT: br label %header 4220; EPILOG: header: 4221; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 4222; EPILOG-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4223; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4224; EPILOG: latch: 4225; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4226; EPILOG: latch.1: 4227; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4228; EPILOG: latch.2: 4229; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4230; EPILOG: latch.3: 4231; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4232; EPILOG: latch.4: 4233; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4234; EPILOG: latch.5: 4235; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4236; EPILOG: latch.6: 4237; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4238; EPILOG: latch.7: 4239; EPILOG-NEXT: %add.7 = add nuw nsw i64 %i6, 8 4240; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 4241; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4242; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 4243; EPILOG: latchexit.unr-lcssa.loopexit: 4244; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 4245; EPILOG-NEXT: br label %latchexit.unr-lcssa 4246; EPILOG: latchexit.unr-lcssa: 4247; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4248; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4249; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4250; EPILOG: header.epil.preheader: 4251; EPILOG-NEXT: br label %header.epil 4252; EPILOG: header.epil: 4253; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 4254; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4255; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 4256; EPILOG: latch.epil: 4257; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4258; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 4259; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4260; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4261; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11 4262; EPILOG: latchexit.epilog-lcssa: 4263; EPILOG-NEXT: br label %latchexit 4264; EPILOG: latchexit: 4265; EPILOG-NEXT: unreachable 4266; EPILOG: loopexit2: 4267; EPILOG-NEXT: ret i32 %shft 4268; EPILOG: loopexit1.loopexit: 4269; 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 ] 4270; EPILOG-NEXT: br label %loopexit1 4271; EPILOG: loopexit1.loopexit1: 4272; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 4273; EPILOG-NEXT: br label %loopexit1 4274; EPILOG: loopexit1: 4275; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4276; EPILOG-NEXT: ret i32 %sext3 4277; 4278; EPILOG-BLOCK-LABEL: @test7( 4279; EPILOG-BLOCK-NEXT: bb: 4280; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4281; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4282; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4283; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4284; EPILOG-BLOCK: preheader: 4285; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4286; EPILOG-BLOCK-NEXT: %1 = freeze i64 %0 4287; EPILOG-BLOCK-NEXT: %2 = add i64 %1, -1 4288; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 4289; EPILOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 4290; EPILOG-BLOCK-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new 4291; EPILOG-BLOCK: preheader.new: 4292; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %1, %xtraiter 4293; EPILOG-BLOCK-NEXT: br label %header 4294; EPILOG-BLOCK: header: 4295; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 4296; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 4297; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4298; EPILOG-BLOCK: latch: 4299; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4300; EPILOG-BLOCK: latch.1: 4301; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %i6, 2 4302; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 4303; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4304; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11 4305; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 4306; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 4307; EPILOG-BLOCK: latchexit.unr-lcssa: 4308; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4309; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4310; EPILOG-BLOCK: header.epil.preheader: 4311; EPILOG-BLOCK-NEXT: br label %header.epil 4312; EPILOG-BLOCK: header.epil: 4313; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 4314; EPILOG-BLOCK: latch.epil: 4315; EPILOG-BLOCK-NEXT: br label %latchexit 4316; EPILOG-BLOCK: latchexit: 4317; EPILOG-BLOCK-NEXT: unreachable 4318; EPILOG-BLOCK: loopexit2: 4319; EPILOG-BLOCK-NEXT: ret i32 %shft 4320; EPILOG-BLOCK: loopexit1.loopexit: 4321; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4322; EPILOG-BLOCK-NEXT: br label %loopexit1 4323; EPILOG-BLOCK: loopexit1: 4324; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 4325; EPILOG-BLOCK-NEXT: ret i32 %sext3 4326; 4327; PROLOG-LABEL: @test7( 4328; PROLOG-NEXT: bb: 4329; PROLOG-NEXT: %i = icmp slt i32 undef, 2 4330; PROLOG-NEXT: %sext = sext i32 undef to i64 4331; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 4332; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4333; PROLOG: preheader: 4334; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 4335; PROLOG-NEXT: %1 = freeze i64 %0 4336; PROLOG-NEXT: %2 = add i64 %1, -1 4337; PROLOG-NEXT: %xtraiter = and i64 %1, 7 4338; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4339; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4340; PROLOG: header.prol.preheader: 4341; PROLOG-NEXT: br label %header.prol 4342; PROLOG: header.prol: 4343; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 4344; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4345; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 4346; PROLOG: latch.prol: 4347; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 4348; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 4349; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4350; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4351; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11 4352; PROLOG: header.prol.loopexit.unr-lcssa: 4353; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 4354; PROLOG-NEXT: br label %header.prol.loopexit 4355; PROLOG: header.prol.loopexit: 4356; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 4357; PROLOG-NEXT: %3 = icmp ult i64 %2, 7 4358; PROLOG-NEXT: br i1 %3, label %latchexit, label %preheader.new 4359; PROLOG: preheader.new: 4360; PROLOG-NEXT: br label %header 4361; PROLOG: header: 4362; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 4363; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4364; PROLOG: latch: 4365; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4366; PROLOG: latch.1: 4367; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4368; PROLOG: latch.2: 4369; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4370; PROLOG: latch.3: 4371; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4372; PROLOG: latch.4: 4373; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4374; PROLOG: latch.5: 4375; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4376; PROLOG: latch.6: 4377; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4378; PROLOG: latch.7: 4379; PROLOG-NEXT: %add.7 = add nuw nsw i64 %i6, 8 4380; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 4381; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 4382; PROLOG: latchexit.unr-lcssa: 4383; PROLOG-NEXT: br label %latchexit 4384; PROLOG: latchexit: 4385; PROLOG-NEXT: unreachable 4386; PROLOG: loopexit2: 4387; PROLOG-NEXT: ret i32 %shft 4388; PROLOG: loopexit1.loopexit: 4389; 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 ] 4390; PROLOG-NEXT: br label %loopexit1 4391; PROLOG: loopexit1.loopexit1: 4392; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 4393; PROLOG-NEXT: br label %loopexit1 4394; PROLOG: loopexit1: 4395; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4396; PROLOG-NEXT: ret i32 %sext3 4397; 4398; PROLOG-BLOCK-LABEL: @test7( 4399; PROLOG-BLOCK-NEXT: bb: 4400; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4401; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4402; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4403; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4404; PROLOG-BLOCK: preheader: 4405; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4406; PROLOG-BLOCK-NEXT: %1 = freeze i64 %0 4407; PROLOG-BLOCK-NEXT: %2 = add i64 %1, -1 4408; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 4409; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4410; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4411; PROLOG-BLOCK: header.prol.preheader: 4412; PROLOG-BLOCK-NEXT: br label %header.prol 4413; PROLOG-BLOCK: header.prol: 4414; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 4415; PROLOG-BLOCK: latch.prol: 4416; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4417; PROLOG-BLOCK: header.prol.loopexit: 4418; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ] 4419; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 4420; PROLOG-BLOCK-NEXT: br i1 %3, label %latchexit, label %preheader.new 4421; PROLOG-BLOCK: preheader.new: 4422; PROLOG-BLOCK-NEXT: br label %header 4423; PROLOG-BLOCK: header: 4424; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 4425; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4426; PROLOG-BLOCK: latch: 4427; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4428; PROLOG-BLOCK: latch.1: 4429; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %i6, 2 4430; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 4431; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11 4432; PROLOG-BLOCK: latchexit.unr-lcssa: 4433; PROLOG-BLOCK-NEXT: br label %latchexit 4434; PROLOG-BLOCK: latchexit: 4435; PROLOG-BLOCK-NEXT: unreachable 4436; PROLOG-BLOCK: loopexit2: 4437; PROLOG-BLOCK-NEXT: ret i32 %shft 4438; PROLOG-BLOCK: loopexit1.loopexit: 4439; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4440; PROLOG-BLOCK-NEXT: br label %loopexit1 4441; PROLOG-BLOCK: loopexit1: 4442; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 4443; PROLOG-BLOCK-NEXT: ret i32 %sext3 4444; 4445bb: 4446 %i = icmp slt i32 undef, 2 4447 %sext = sext i32 undef to i64 4448 %shft = ashr exact i32 %arg, 16 4449 br i1 %i, label %loopexit2, label %preheader 4450 4451preheader: ; preds = %bb2 4452 br label %header 4453 4454header: ; preds = %latch, %preheader 4455 %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4456 br i1 false, label %loopexit1, label %latch 4457 4458latch: ; preds = %header 4459 %add = add nuw nsw i64 %i6, 1 4460 %i9 = icmp slt i64 %add, %sext 4461 br i1 %i9, label %header, label %latchexit 4462 4463latchexit: ; preds = %latch 4464 unreachable 4465 4466loopexit2: ; preds = %bb2 4467 ret i32 %shft 4468 4469loopexit1: ; preds = %header 4470 %sext3 = phi i32 [ %shft, %header ] 4471 ret i32 %sext3 4472} 4473 4474; Nested loop and inner loop is unrolled. The tricky bit here is that 4475; several blocks in the inner loop fall out of the outer block when we 4476; use the epilogue block remainder strategy. 4477define void @test8() { 4478; EPILOG-LABEL: @test8( 4479; EPILOG-NEXT: bb: 4480; EPILOG-NEXT: br label %outerloop 4481; EPILOG: outerloop.loopexit.loopexit: 4482; EPILOG-NEXT: br label %outerloop.loopexit 4483; EPILOG: outerloop.loopexit.loopexit1: 4484; EPILOG-NEXT: br label %outerloop.loopexit 4485; EPILOG: outerloop.loopexit: 4486; EPILOG-NEXT: br label %outerloop 4487; EPILOG: outerloop: 4488; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4489; EPILOG-NEXT: %0 = sub i64 100, %i 4490; EPILOG-NEXT: %1 = sub i64 99, %i 4491; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4492; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4493; EPILOG-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4494; EPILOG: outerloop.new: 4495; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4496; EPILOG-NEXT: br label %innerH 4497; EPILOG: innerH: 4498; EPILOG-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ] 4499; EPILOG-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ] 4500; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4501; EPILOG: latch: 4502; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4503; EPILOG: latch.1: 4504; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4505; EPILOG: latch.2: 4506; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4507; EPILOG: latch.3: 4508; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4509; EPILOG: latch.4: 4510; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4511; EPILOG: latch.5: 4512; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4513; EPILOG: latch.6: 4514; EPILOG-NEXT: %i4.7 = add nuw nsw i64 %i3, 8 4515; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4516; EPILOG: latch.7: 4517; EPILOG-NEXT: %niter.next.7 = add nuw nsw i64 %niter, 8 4518; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4519; EPILOG-NEXT: br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit 4520; EPILOG: exit.unr-lcssa.loopexit: 4521; EPILOG-NEXT: %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ] 4522; EPILOG-NEXT: br label %exit.unr-lcssa 4523; EPILOG: exit.unr-lcssa: 4524; EPILOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ] 4525; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4526; EPILOG-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4527; EPILOG: innerH.epil.preheader: 4528; EPILOG-NEXT: br label %innerH.epil 4529; EPILOG: innerH.epil: 4530; EPILOG-NEXT: %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ] 4531; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4532; EPILOG-NEXT: %i4.epil = add nuw nsw i64 %i3.epil, 1 4533; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil 4534; EPILOG: latch.epil: 4535; EPILOG-NEXT: %i6.epil = icmp ult i64 %i4.epil, 100 4536; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 4537; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4538; EPILOG-NEXT: br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12 4539; EPILOG: exit.epilog-lcssa: 4540; EPILOG-NEXT: br label %exit 4541; EPILOG: exit.loopexit: 4542; EPILOG-NEXT: br label %exit 4543; EPILOG: exit: 4544; EPILOG-NEXT: ret void 4545; 4546; EPILOG-BLOCK-LABEL: @test8( 4547; EPILOG-BLOCK-NEXT: bb: 4548; EPILOG-BLOCK-NEXT: br label %outerloop 4549; EPILOG-BLOCK: outerloop.loopexit.loopexit: 4550; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit 4551; EPILOG-BLOCK: outerloop.loopexit: 4552; EPILOG-BLOCK-NEXT: br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1 4553; EPILOG-BLOCK: outerloop.new.1: 4554; EPILOG-BLOCK-NEXT: br label %innerH.1 4555; EPILOG-BLOCK: innerH.1: 4556; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4557; EPILOG-BLOCK-NEXT: %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 4558; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4559; EPILOG-BLOCK: latch.12: 4560; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i3.1, 2 4561; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4562; EPILOG-BLOCK: latch.1.1: 4563; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i64 %niter.1, 2 4564; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100 4565; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12 4566; EPILOG-BLOCK: exit.unr-lcssa.loopexit.1: 4567; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa.1 4568; EPILOG-BLOCK: outerloop.loopexit.loopexit.1: 4569; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4570; EPILOG-BLOCK: exit.unr-lcssa.1: 4571; EPILOG-BLOCK-NEXT: br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit 4572; EPILOG-BLOCK: innerH.epil.preheader.1: 4573; EPILOG-BLOCK-NEXT: br label %innerH.epil.1 4574; EPILOG-BLOCK: innerH.epil.1: 4575; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.epil 4576; EPILOG-BLOCK: outerloop.loopexit.1: 4577; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4578; EPILOG-BLOCK: outerloop: 4579; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4580; EPILOG-BLOCK-NEXT: %0 = sub i64 100, %i 4581; EPILOG-BLOCK-NEXT: %1 = sub i64 99, %i 4582; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4583; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4584; EPILOG-BLOCK-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4585; EPILOG-BLOCK: outerloop.new: 4586; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4587; EPILOG-BLOCK-NEXT: br label %innerH 4588; EPILOG-BLOCK: innerH: 4589; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ] 4590; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ] 4591; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4592; EPILOG-BLOCK: latch: 4593; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i3, 2 4594; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4595; EPILOG-BLOCK: latch.1: 4596; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 4597; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4598; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4599; EPILOG-BLOCK: exit.unr-lcssa.loopexit: 4600; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa 4601; EPILOG-BLOCK: exit.unr-lcssa: 4602; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4603; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4604; EPILOG-BLOCK: innerH.epil.preheader: 4605; EPILOG-BLOCK-NEXT: br label %innerH.epil 4606; EPILOG-BLOCK: innerH.epil: 4607; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.epil 4608; EPILOG-BLOCK: latch.epil: 4609; EPILOG-BLOCK-NEXT: br label %exit 4610; EPILOG-BLOCK: exit.loopexit: 4611; EPILOG-BLOCK-NEXT: br label %exit 4612; EPILOG-BLOCK: exit: 4613; EPILOG-BLOCK-NEXT: ret void 4614; 4615; PROLOG-LABEL: @test8( 4616; PROLOG-NEXT: bb: 4617; PROLOG-NEXT: br label %outerloop 4618; PROLOG: outerloop.loopexit.loopexit: 4619; PROLOG-NEXT: br label %outerloop.loopexit 4620; PROLOG: outerloop.loopexit.loopexit1: 4621; PROLOG-NEXT: br label %outerloop.loopexit 4622; PROLOG: outerloop.loopexit: 4623; PROLOG-NEXT: br label %outerloop 4624; PROLOG: outerloop: 4625; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4626; PROLOG-NEXT: %0 = sub i64 100, %i 4627; PROLOG-NEXT: %1 = sub i64 99, %i 4628; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4629; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4630; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4631; PROLOG: innerH.prol.preheader: 4632; PROLOG-NEXT: br label %innerH.prol 4633; PROLOG: innerH.prol: 4634; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 4635; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4636; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4637; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4638; PROLOG: latch.prol: 4639; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 4640; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 4641; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4642; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12 4643; PROLOG: innerH.prol.loopexit.unr-lcssa: 4644; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4645; PROLOG-NEXT: br label %innerH.prol.loopexit 4646; PROLOG: innerH.prol.loopexit: 4647; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4648; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4649; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4650; PROLOG: outerloop.new: 4651; PROLOG-NEXT: br label %innerH 4652; PROLOG: innerH: 4653; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4654; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4655; PROLOG: latch: 4656; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4657; PROLOG: latch.1: 4658; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4659; PROLOG: latch.2: 4660; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4661; PROLOG: latch.3: 4662; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4663; PROLOG: latch.4: 4664; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4665; PROLOG: latch.5: 4666; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4667; PROLOG: latch.6: 4668; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i3, 8 4669; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4670; PROLOG: latch.7: 4671; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 4672; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4673; PROLOG: exit.unr-lcssa: 4674; PROLOG-NEXT: br label %exit 4675; PROLOG: exit.loopexit: 4676; PROLOG-NEXT: br label %exit 4677; PROLOG: exit: 4678; PROLOG-NEXT: ret void 4679; 4680; PROLOG-BLOCK-LABEL: @test8( 4681; PROLOG-BLOCK-NEXT: bb: 4682; PROLOG-BLOCK-NEXT: br label %outerloop 4683; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4684; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4685; PROLOG-BLOCK: outerloop.loopexit: 4686; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1 4687; PROLOG-BLOCK: innerH.prol.preheader.1: 4688; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4689; PROLOG-BLOCK: innerH.prol.1: 4690; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4691; PROLOG-BLOCK: latch.prol.1: 4692; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4693; PROLOG-BLOCK: innerH.prol.loopexit.1: 4694; PROLOG-BLOCK-NEXT: %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ] 4695; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4696; PROLOG-BLOCK: outerloop.new.1: 4697; PROLOG-BLOCK-NEXT: br label %innerH.1 4698; PROLOG-BLOCK: innerH.1: 4699; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4700; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.11 4701; PROLOG-BLOCK: latch.11: 4702; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i3.1, 2 4703; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4704; PROLOG-BLOCK: latch.1.1: 4705; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4706; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit2, !llvm.loop !12 4707; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4708; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4709; PROLOG-BLOCK: outerloop.loopexit.1: 4710; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4711; PROLOG-BLOCK: outerloop: 4712; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4713; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4714; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4715; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4716; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4717; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4718; PROLOG-BLOCK: innerH.prol.preheader: 4719; PROLOG-BLOCK-NEXT: br label %innerH.prol 4720; PROLOG-BLOCK: innerH.prol: 4721; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4722; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4723; PROLOG-BLOCK: latch.prol: 4724; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4725; PROLOG-BLOCK: innerH.prol.loopexit: 4726; PROLOG-BLOCK-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ] 4727; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4728; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4729; PROLOG-BLOCK: outerloop.new: 4730; PROLOG-BLOCK-NEXT: br label %innerH 4731; PROLOG-BLOCK: innerH: 4732; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ] 4733; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4734; PROLOG-BLOCK: latch: 4735; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i3, 2 4736; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4737; PROLOG-BLOCK: latch.1: 4738; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4739; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4740; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4741; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4742; PROLOG-BLOCK: exit.unr-lcssa.loopexit2: 4743; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4744; PROLOG-BLOCK: exit.unr-lcssa: 4745; PROLOG-BLOCK-NEXT: br label %exit 4746; PROLOG-BLOCK: exit.loopexit: 4747; PROLOG-BLOCK-NEXT: br label %exit 4748; PROLOG-BLOCK: exit: 4749; PROLOG-BLOCK-NEXT: ret void 4750; 4751 4752bb: 4753 br label %outerloop 4754 4755outerloop: ; preds = %innerH, %bb 4756 %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4757 br label %innerH 4758 4759innerH: ; preds = %latch, %outerloop 4760 %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 4761 %i4 = add nuw nsw i64 %i3, 1 4762 br i1 false, label %outerloop, label %latch 4763 4764latch: ; preds = %innerH 4765 %i6 = icmp ult i64 %i4, 100 4766 br i1 %i6, label %innerH, label %exit 4767 4768exit: ; preds = %latch 4769 ret void 4770} 4771 4772declare ptr addrspace(1) @foo(i32) 4773; inner loop prolog unrolled 4774; a value from outer loop is used in exit block of inner loop. 4775; Don't create VMap entries for such values (%trip). 4776define ptr addrspace(1) @test9(ptr nocapture readonly %arg, i32 %n) { 4777; EPILOG-LABEL: @test9( 4778; EPILOG-NEXT: bb: 4779; EPILOG-NEXT: %0 = add i32 %n, -1 4780; EPILOG-NEXT: br label %outerloopHdr 4781; EPILOG: outerloopHdr: 4782; EPILOG-NEXT: %trip = add i32 %n, -1 4783; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4784; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4785; EPILOG: preheader: 4786; EPILOG-NEXT: %i4 = zext i32 0 to i64 4787; EPILOG-NEXT: %1 = freeze i32 %0 4788; EPILOG-NEXT: %2 = add i32 %1, -1 4789; EPILOG-NEXT: %xtraiter = and i32 %1, 7 4790; EPILOG-NEXT: %3 = icmp ult i32 %2, 7 4791; EPILOG-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 4792; EPILOG: preheader.new: 4793; EPILOG-NEXT: %unroll_iter = sub i32 %1, %xtraiter 4794; EPILOG-NEXT: br label %header 4795; EPILOG: header: 4796; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ] 4797; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4798; EPILOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4799; EPILOG: innerexit.loopexit: 4800; 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 ] 4801; EPILOG-NEXT: br label %innerexit 4802; EPILOG: innerexit.loopexit1: 4803; EPILOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ] 4804; EPILOG-NEXT: br label %innerexit 4805; EPILOG: innerexit: 4806; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4807; EPILOG-NEXT: %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa) 4808; EPILOG-NEXT: ret ptr addrspace(1) %i9 4809; EPILOG: latch: 4810; EPILOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4811; EPILOG: latch.1: 4812; EPILOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4813; EPILOG: latch.2: 4814; EPILOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4815; EPILOG: latch.3: 4816; EPILOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4817; EPILOG: latch.4: 4818; EPILOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4819; EPILOG: latch.5: 4820; EPILOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4821; EPILOG: latch.6: 4822; EPILOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 4823; EPILOG: latch.7: 4824; EPILOG-NEXT: %iv.next.7 = add nuw nsw i64 %phi, 8 4825; EPILOG-NEXT: %niter.next.7 = add i32 %niter, 8 4826; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 4827; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit 4828; EPILOG: outerLatch.loopexit.unr-lcssa.loopexit: 4829; EPILOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ] 4830; EPILOG-NEXT: br label %outerLatch.loopexit.unr-lcssa 4831; EPILOG: outerLatch.loopexit.unr-lcssa: 4832; EPILOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ] 4833; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4834; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 4835; EPILOG: header.epil.preheader: 4836; EPILOG-NEXT: br label %header.epil 4837; EPILOG: header.epil: 4838; EPILOG-NEXT: %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ] 4839; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4840; EPILOG-NEXT: %i7.epil = trunc i64 %phi.epil to i32 4841; EPILOG-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 4842; EPILOG: latch.epil: 4843; EPILOG-NEXT: %i11.epil = add nsw i32 %i7.epil, 1 4844; EPILOG-NEXT: %innercnd.epil = icmp slt i32 %i11.epil, %trip 4845; EPILOG-NEXT: %iv.next.epil = add nuw nsw i64 %phi.epil, 1 4846; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 4847; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 4848; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13 4849; EPILOG: outerLatch.loopexit.epilog-lcssa: 4850; EPILOG-NEXT: br label %outerLatch.loopexit 4851; EPILOG: outerLatch.loopexit: 4852; EPILOG-NEXT: br label %outerLatch 4853; EPILOG: outerLatch: 4854; EPILOG-NEXT: br label %outerloopHdr 4855; 4856; EPILOG-BLOCK-LABEL: @test9( 4857; EPILOG-BLOCK-NEXT: bb: 4858; EPILOG-BLOCK-NEXT: %0 = add i32 %n, -1 4859; EPILOG-BLOCK-NEXT: br label %outerloopHdr 4860; EPILOG-BLOCK: outerloopHdr: 4861; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 4862; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 4863; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4864; EPILOG-BLOCK: preheader: 4865; EPILOG-BLOCK-NEXT: %1 = freeze i32 %0 4866; EPILOG-BLOCK-NEXT: %2 = add i32 %1, -1 4867; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 4868; EPILOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 4869; EPILOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 4870; EPILOG-BLOCK: preheader.new: 4871; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %1, %xtraiter 4872; EPILOG-BLOCK-NEXT: br label %header 4873; EPILOG-BLOCK: header: 4874; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ] 4875; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 4876; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 4877; EPILOG-BLOCK: innerexit.loopexit.loopexit: 4878; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 4879; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 4880; EPILOG-BLOCK: innerexit.loopexit.loopexit4: 4881; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph5 = phi i32 [ %trip.1, %latch.13 ], [ %trip.1, %header.1 ] 4882; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 4883; EPILOG-BLOCK: innerexit.loopexit: 4884; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph5, %innerexit.loopexit.loopexit4 ] 4885; EPILOG-BLOCK-NEXT: br label %innerexit 4886; EPILOG-BLOCK: innerexit.loopexit1: 4887; EPILOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ] 4888; EPILOG-BLOCK-NEXT: br label %innerexit 4889; EPILOG-BLOCK: innerexit: 4890; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4891; EPILOG-BLOCK-NEXT: %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa) 4892; EPILOG-BLOCK-NEXT: ret ptr addrspace(1) %i9 4893; EPILOG-BLOCK: latch: 4894; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 4895; EPILOG-BLOCK: latch.1: 4896; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %phi, 2 4897; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter, 2 4898; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 4899; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14 4900; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit: 4901; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa 4902; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa: 4903; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4904; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 4905; EPILOG-BLOCK: header.epil.preheader: 4906; EPILOG-BLOCK-NEXT: br label %header.epil 4907; EPILOG-BLOCK: header.epil: 4908; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 4909; EPILOG-BLOCK: latch.epil: 4910; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit 4911; EPILOG-BLOCK: outerLatch.loopexit: 4912; EPILOG-BLOCK-NEXT: br label %outerLatch 4913; EPILOG-BLOCK: outerLatch: 4914; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 4915; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 4916; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 4917; EPILOG-BLOCK: preheader.1: 4918; EPILOG-BLOCK-NEXT: %4 = freeze i32 %0 4919; EPILOG-BLOCK-NEXT: %5 = add i32 %4, -1 4920; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 4921; EPILOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 4922; EPILOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 4923; EPILOG-BLOCK: preheader.new.1: 4924; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %4, %xtraiter.1 4925; EPILOG-BLOCK-NEXT: br label %header.1 4926; EPILOG-BLOCK: header.1: 4927; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 4928; EPILOG-BLOCK-NEXT: %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 4929; EPILOG-BLOCK-NEXT: br i1 true, label %latch.13, label %innerexit.loopexit.loopexit4 4930; EPILOG-BLOCK: latch.13: 4931; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit4 4932; EPILOG-BLOCK: latch.1.1: 4933; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %phi.1, 2 4934; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i32 %niter.1, 2 4935; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1 4936; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14 4937; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit.1: 4938; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa.1 4939; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 4940; EPILOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 4941; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1 4942; EPILOG-BLOCK: header.epil.preheader.1: 4943; EPILOG-BLOCK-NEXT: br label %header.epil.1 4944; EPILOG-BLOCK: header.epil.1: 4945; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil.1, label %innerexit.loopexit1 4946; EPILOG-BLOCK: latch.epil.1: 4947; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 4948; EPILOG-BLOCK: outerLatch.loopexit.1: 4949; EPILOG-BLOCK-NEXT: br label %outerLatch.1 4950; EPILOG-BLOCK: outerLatch.1: 4951; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 4952; 4953; PROLOG-LABEL: @test9( 4954; PROLOG-NEXT: bb: 4955; PROLOG-NEXT: %0 = add i32 %n, -1 4956; PROLOG-NEXT: br label %outerloopHdr 4957; PROLOG: outerloopHdr: 4958; PROLOG-NEXT: %trip = add i32 %n, -1 4959; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 4960; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4961; PROLOG: preheader: 4962; PROLOG-NEXT: %i4 = zext i32 0 to i64 4963; PROLOG-NEXT: %1 = freeze i32 %0 4964; PROLOG-NEXT: %2 = add i32 %1, -1 4965; PROLOG-NEXT: %xtraiter = and i32 %1, 7 4966; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 4967; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4968; PROLOG: header.prol.preheader: 4969; PROLOG-NEXT: br label %header.prol 4970; PROLOG: header.prol: 4971; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 4972; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4973; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 4974; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 4975; PROLOG: latch.prol: 4976; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 4977; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 4978; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 4979; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 4980; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 4981; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13 4982; PROLOG: header.prol.loopexit.unr-lcssa: 4983; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 4984; PROLOG-NEXT: br label %header.prol.loopexit 4985; PROLOG: header.prol.loopexit: 4986; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 4987; PROLOG-NEXT: %3 = icmp ult i32 %2, 7 4988; PROLOG-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new 4989; PROLOG: preheader.new: 4990; PROLOG-NEXT: br label %header 4991; PROLOG: header: 4992; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 4993; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4994; PROLOG: innerexit.loopexit: 4995; 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 ] 4996; PROLOG-NEXT: br label %innerexit 4997; PROLOG: innerexit.loopexit1: 4998; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 4999; PROLOG-NEXT: br label %innerexit 5000; PROLOG: innerexit: 5001; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5002; PROLOG-NEXT: %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa) 5003; PROLOG-NEXT: ret ptr addrspace(1) %i9 5004; PROLOG: latch: 5005; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 5006; PROLOG: latch.1: 5007; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 5008; PROLOG: latch.2: 5009; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 5010; PROLOG: latch.3: 5011; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 5012; PROLOG: latch.4: 5013; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 5014; PROLOG: latch.5: 5015; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 5016; PROLOG: latch.6: 5017; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %phi, 7 5018; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 5019; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 5020; PROLOG: latch.7: 5021; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 5022; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 5023; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %phi, 8 5024; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 5025; PROLOG: outerLatch.loopexit.unr-lcssa: 5026; PROLOG-NEXT: br label %outerLatch.loopexit 5027; PROLOG: outerLatch.loopexit: 5028; PROLOG-NEXT: br label %outerLatch 5029; PROLOG: outerLatch: 5030; PROLOG-NEXT: br label %outerloopHdr 5031; 5032; PROLOG-BLOCK-LABEL: @test9( 5033; PROLOG-BLOCK-NEXT: bb: 5034; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 5035; PROLOG-BLOCK-NEXT: br label %outerloopHdr 5036; PROLOG-BLOCK: outerloopHdr: 5037; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 5038; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 5039; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5040; PROLOG-BLOCK: preheader: 5041; PROLOG-BLOCK-NEXT: %1 = freeze i32 %0 5042; PROLOG-BLOCK-NEXT: %2 = add i32 %1, -1 5043; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 5044; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5045; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5046; PROLOG-BLOCK: header.prol.preheader: 5047; PROLOG-BLOCK-NEXT: br label %header.prol 5048; PROLOG-BLOCK: header.prol: 5049; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5050; PROLOG-BLOCK: latch.prol: 5051; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 5052; PROLOG-BLOCK: header.prol.loopexit: 5053; PROLOG-BLOCK-NEXT: %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ] 5054; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 5055; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new 5056; PROLOG-BLOCK: preheader.new: 5057; PROLOG-BLOCK-NEXT: br label %header 5058; PROLOG-BLOCK: header: 5059; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ] 5060; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5061; PROLOG-BLOCK: innerexit.loopexit.loopexit: 5062; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5063; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5064; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 5065; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 5066; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5067; PROLOG-BLOCK: innerexit.loopexit: 5068; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 5069; PROLOG-BLOCK-NEXT: br label %innerexit 5070; PROLOG-BLOCK: innerexit.loopexit1: 5071; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 5072; PROLOG-BLOCK-NEXT: br label %innerexit 5073; PROLOG-BLOCK: innerexit: 5074; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5075; PROLOG-BLOCK-NEXT: %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa) 5076; PROLOG-BLOCK-NEXT: ret ptr addrspace(1) %i9 5077; PROLOG-BLOCK: latch: 5078; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5079; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 5080; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5081; PROLOG-BLOCK: latch.1: 5082; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 5083; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 5084; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %phi, 2 5085; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14 5086; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5087; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 5088; PROLOG-BLOCK: outerLatch.loopexit: 5089; PROLOG-BLOCK-NEXT: br label %outerLatch 5090; PROLOG-BLOCK: outerLatch: 5091; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5092; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5093; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5094; PROLOG-BLOCK: preheader.1: 5095; PROLOG-BLOCK-NEXT: %4 = freeze i32 %0 5096; PROLOG-BLOCK-NEXT: %5 = add i32 %4, -1 5097; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 5098; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5099; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1 5100; PROLOG-BLOCK: header.prol.preheader.1: 5101; PROLOG-BLOCK-NEXT: br label %header.prol.1 5102; PROLOG-BLOCK: header.prol.1: 5103; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 5104; PROLOG-BLOCK: latch.prol.1: 5105; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 5106; PROLOG-BLOCK: header.prol.loopexit.1: 5107; PROLOG-BLOCK-NEXT: %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ] 5108; PROLOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 5109; PROLOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1 5110; PROLOG-BLOCK: preheader.new.1: 5111; PROLOG-BLOCK-NEXT: br label %header.1 5112; PROLOG-BLOCK: header.1: 5113; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5114; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 5115; PROLOG-BLOCK: latch.14: 5116; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5117; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 5118; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 5119; PROLOG-BLOCK: latch.1.1: 5120; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 5121; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 5122; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %phi.1, 2 5123; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14 5124; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5125; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5126; PROLOG-BLOCK: outerLatch.loopexit.1: 5127; PROLOG-BLOCK-NEXT: br label %outerLatch.1 5128; PROLOG-BLOCK: outerLatch.1: 5129; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5130; 5131bb: 5132 br label %outerloopHdr 5133 5134outerloopHdr: ; preds = %outerLatch, %bb 5135 %trip = add i32 %n, -1 5136 %outercnd = icmp slt i32 0, %trip 5137 br i1 %outercnd, label %preheader, label %outerLatch 5138 5139preheader: ; preds = %outerloopHdr 5140 %i4 = zext i32 0 to i64 5141 br label %header 5142 5143header: ; preds = %latch, %preheader 5144 %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 5145 %i7 = trunc i64 %phi to i32 5146 br i1 true, label %latch, label %innerexit 5147 5148innerexit: ; preds = %header 5149 %i9 = call ptr addrspace(1) @foo(i32 %trip) 5150 ret ptr addrspace(1) %i9 5151 5152latch: ; preds = %header 5153 %i11 = add nsw i32 %i7, 1 5154 %innercnd = icmp slt i32 %i11, %trip 5155 %iv.next = add nuw nsw i64 %phi, 1 5156 br i1 %innercnd, label %header, label %outerLatch 5157 5158outerLatch: ; preds = %latch, %outerloopHdr 5159 br label %outerloopHdr 5160} 5161 5162declare void @bar() 5163 5164; This is a case where we should be able to eliminate N-1 copies 5165; of the early exit test in the main loop when runtime unrolling 5166; by N. 5167define void @test10(i64 %trip, i64 %trip2) { 5168; EPILOG-LABEL: @test10( 5169; EPILOG-NEXT: entry: 5170; EPILOG-NEXT: %0 = freeze i64 %trip 5171; EPILOG-NEXT: %1 = add i64 %0, -1 5172; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5173; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5174; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5175; EPILOG: entry.new: 5176; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5177; EPILOG-NEXT: br label %loop_header 5178; EPILOG: loop_header: 5179; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5180; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5181; EPILOG-NEXT: call void @bar() 5182; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5183; EPILOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5184; EPILOG: loop_latch: 5185; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5186; EPILOG-NEXT: call void @bar() 5187; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5188; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5189; EPILOG: loop_latch.1: 5190; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 5191; EPILOG-NEXT: call void @bar() 5192; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5193; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5194; EPILOG: loop_latch.2: 5195; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv, 3 5196; EPILOG-NEXT: call void @bar() 5197; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5198; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5199; EPILOG: loop_latch.3: 5200; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv, 4 5201; EPILOG-NEXT: call void @bar() 5202; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5203; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5204; EPILOG: loop_latch.4: 5205; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv, 5 5206; EPILOG-NEXT: call void @bar() 5207; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5208; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5209; EPILOG: loop_latch.5: 5210; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv, 6 5211; EPILOG-NEXT: call void @bar() 5212; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5213; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5214; EPILOG: loop_latch.6: 5215; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv, 7 5216; EPILOG-NEXT: call void @bar() 5217; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5218; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5219; EPILOG: loop_latch.7: 5220; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 5221; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 5222; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5223; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5224; EPILOG: exit1.loopexit: 5225; EPILOG-NEXT: br label %exit1 5226; EPILOG: exit1.loopexit1: 5227; EPILOG-NEXT: br label %exit1 5228; EPILOG: exit1: 5229; EPILOG-NEXT: ret void 5230; EPILOG: exit2.unr-lcssa.loopexit: 5231; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5232; EPILOG-NEXT: br label %exit2.unr-lcssa 5233; EPILOG: exit2.unr-lcssa: 5234; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5235; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5236; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5237; EPILOG: loop_header.epil.preheader: 5238; EPILOG-NEXT: br label %loop_header.epil 5239; EPILOG: loop_header.epil: 5240; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5241; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5242; EPILOG-NEXT: call void @bar() 5243; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5244; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1 5245; EPILOG: loop_latch.epil: 5246; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5247; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5248; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5249; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5250; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14 5251; EPILOG: exit2.epilog-lcssa: 5252; EPILOG-NEXT: br label %exit2 5253; EPILOG: exit2: 5254; EPILOG-NEXT: ret void 5255; 5256; EPILOG-BLOCK-LABEL: @test10( 5257; EPILOG-BLOCK-NEXT: entry: 5258; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 5259; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 5260; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5261; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5262; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5263; EPILOG-BLOCK: entry.new: 5264; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5265; EPILOG-BLOCK-NEXT: br label %loop_header 5266; EPILOG-BLOCK: loop_header: 5267; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5268; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5269; EPILOG-BLOCK-NEXT: call void @bar() 5270; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5271; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5272; EPILOG-BLOCK: loop_latch: 5273; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5274; EPILOG-BLOCK-NEXT: call void @bar() 5275; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5276; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5277; EPILOG-BLOCK: loop_latch.1: 5278; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 5279; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 5280; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5281; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16 5282; EPILOG-BLOCK: exit1.loopexit: 5283; EPILOG-BLOCK-NEXT: br label %exit1 5284; EPILOG-BLOCK: exit1: 5285; EPILOG-BLOCK-NEXT: ret void 5286; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5287; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 5288; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5289; EPILOG-BLOCK: exit2.unr-lcssa: 5290; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5291; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5292; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5293; EPILOG-BLOCK: loop_header.epil.preheader: 5294; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5295; EPILOG-BLOCK: loop_header.epil: 5296; EPILOG-BLOCK-NEXT: call void @bar() 5297; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 5298; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1 5299; EPILOG-BLOCK: loop_latch.epil: 5300; EPILOG-BLOCK-NEXT: br label %exit2 5301; EPILOG-BLOCK: exit2: 5302; EPILOG-BLOCK-NEXT: ret void 5303; 5304; PROLOG-LABEL: @test10( 5305; PROLOG-NEXT: entry: 5306; PROLOG-NEXT: %0 = freeze i64 %trip 5307; PROLOG-NEXT: %1 = add i64 %0, -1 5308; PROLOG-NEXT: %xtraiter = and i64 %0, 7 5309; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5310; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5311; PROLOG: loop_header.prol.preheader: 5312; PROLOG-NEXT: br label %loop_header.prol 5313; PROLOG: loop_header.prol: 5314; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5315; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5316; PROLOG-NEXT: call void @bar() 5317; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 5318; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1 5319; PROLOG: loop_latch.prol: 5320; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5321; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5322; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5323; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5324; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14 5325; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5326; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5327; PROLOG-NEXT: br label %loop_header.prol.loopexit 5328; PROLOG: loop_header.prol.loopexit: 5329; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5330; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 5331; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new 5332; PROLOG: entry.new: 5333; PROLOG-NEXT: br label %loop_header 5334; PROLOG: loop_header: 5335; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5336; PROLOG-NEXT: call void @bar() 5337; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5338; PROLOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5339; PROLOG: loop_latch: 5340; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5341; PROLOG-NEXT: call void @bar() 5342; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5343; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5344; PROLOG: loop_latch.1: 5345; PROLOG-NEXT: %iv_next.1 = add i64 %iv, 2 5346; PROLOG-NEXT: call void @bar() 5347; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5348; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5349; PROLOG: loop_latch.2: 5350; PROLOG-NEXT: %iv_next.2 = add i64 %iv, 3 5351; PROLOG-NEXT: call void @bar() 5352; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5353; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5354; PROLOG: loop_latch.3: 5355; PROLOG-NEXT: %iv_next.3 = add i64 %iv, 4 5356; PROLOG-NEXT: call void @bar() 5357; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5358; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5359; PROLOG: loop_latch.4: 5360; PROLOG-NEXT: %iv_next.4 = add i64 %iv, 5 5361; PROLOG-NEXT: call void @bar() 5362; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5363; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5364; PROLOG: loop_latch.5: 5365; PROLOG-NEXT: %iv_next.5 = add i64 %iv, 6 5366; PROLOG-NEXT: call void @bar() 5367; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5368; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5369; PROLOG: loop_latch.6: 5370; PROLOG-NEXT: %iv_next.6 = add i64 %iv, 7 5371; PROLOG-NEXT: call void @bar() 5372; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5373; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5374; PROLOG: loop_latch.7: 5375; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 5376; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5377; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5378; PROLOG: exit1.loopexit: 5379; PROLOG-NEXT: br label %exit1 5380; PROLOG: exit1.loopexit1: 5381; PROLOG-NEXT: br label %exit1 5382; PROLOG: exit1: 5383; PROLOG-NEXT: ret void 5384; PROLOG: exit2.unr-lcssa: 5385; PROLOG-NEXT: br label %exit2 5386; PROLOG: exit2: 5387; PROLOG-NEXT: ret void 5388; 5389; PROLOG-BLOCK-LABEL: @test10( 5390; PROLOG-BLOCK-NEXT: entry: 5391; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 5392; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 5393; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5394; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5395; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5396; PROLOG-BLOCK: loop_header.prol.preheader: 5397; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5398; PROLOG-BLOCK: loop_header.prol: 5399; PROLOG-BLOCK-NEXT: call void @bar() 5400; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 5401; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1 5402; PROLOG-BLOCK: loop_latch.prol: 5403; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5404; PROLOG-BLOCK: loop_header.prol.loopexit: 5405; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5406; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5407; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new 5408; PROLOG-BLOCK: entry.new: 5409; PROLOG-BLOCK-NEXT: br label %loop_header 5410; PROLOG-BLOCK: loop_header: 5411; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5412; PROLOG-BLOCK-NEXT: call void @bar() 5413; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5414; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5415; PROLOG-BLOCK: loop_latch: 5416; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5417; PROLOG-BLOCK-NEXT: call void @bar() 5418; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5419; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5420; PROLOG-BLOCK: loop_latch.1: 5421; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 5422; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5423; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16 5424; PROLOG-BLOCK: exit1.loopexit: 5425; PROLOG-BLOCK-NEXT: br label %exit1 5426; PROLOG-BLOCK: exit1: 5427; PROLOG-BLOCK-NEXT: ret void 5428; PROLOG-BLOCK: exit2.unr-lcssa: 5429; PROLOG-BLOCK-NEXT: br label %exit2 5430; PROLOG-BLOCK: exit2: 5431; PROLOG-BLOCK-NEXT: ret void 5432; 5433entry: 5434 br label %loop_header 5435 5436loop_header: 5437 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5438 call void @bar() 5439 %cmp_early = icmp ne i64 %iv, %trip2 5440 br i1 %cmp_early, label %loop_latch, label %exit1 5441 5442loop_latch: 5443 %iv_next = add i64 %iv, 1 5444 %cmp = icmp ne i64 %iv_next, %trip 5445 br i1 %cmp, label %loop_header, label %exit2 5446 5447exit1: 5448 ret void 5449 5450exit2: 5451 ret void 5452} 5453 5454; With a loop invariant, we can eliminate the last N-1 5455; copies of the exit test in the unrolled main loop body. 5456define void @test11(i64 %trip, i1 %cond) { 5457; EPILOG-LABEL: @test11( 5458; EPILOG-NEXT: entry: 5459; EPILOG-NEXT: %0 = freeze i64 %trip 5460; EPILOG-NEXT: %1 = add i64 %0, -1 5461; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5462; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5463; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5464; EPILOG: entry.new: 5465; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5466; EPILOG-NEXT: br label %loop_header 5467; EPILOG: loop_header: 5468; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5469; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5470; EPILOG-NEXT: call void @bar() 5471; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5472; EPILOG: loop_latch: 5473; EPILOG-NEXT: call void @bar() 5474; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5475; EPILOG: loop_latch.1: 5476; EPILOG-NEXT: call void @bar() 5477; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5478; EPILOG: loop_latch.2: 5479; EPILOG-NEXT: call void @bar() 5480; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5481; EPILOG: loop_latch.3: 5482; EPILOG-NEXT: call void @bar() 5483; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5484; EPILOG: loop_latch.4: 5485; EPILOG-NEXT: call void @bar() 5486; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5487; EPILOG: loop_latch.5: 5488; EPILOG-NEXT: call void @bar() 5489; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5490; EPILOG: loop_latch.6: 5491; EPILOG-NEXT: call void @bar() 5492; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5493; EPILOG: loop_latch.7: 5494; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 5495; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 5496; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5497; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5498; EPILOG: exit1.loopexit: 5499; EPILOG-NEXT: br label %exit1 5500; EPILOG: exit1.loopexit1: 5501; EPILOG-NEXT: br label %exit1 5502; EPILOG: exit1: 5503; EPILOG-NEXT: ret void 5504; EPILOG: exit2.unr-lcssa.loopexit: 5505; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5506; EPILOG-NEXT: br label %exit2.unr-lcssa 5507; EPILOG: exit2.unr-lcssa: 5508; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5509; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5510; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5511; EPILOG: loop_header.epil.preheader: 5512; EPILOG-NEXT: br label %loop_header.epil 5513; EPILOG: loop_header.epil: 5514; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5515; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5516; EPILOG-NEXT: call void @bar() 5517; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1 5518; EPILOG: loop_latch.epil: 5519; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5520; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5521; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5522; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5523; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15 5524; EPILOG: exit2.epilog-lcssa: 5525; EPILOG-NEXT: br label %exit2 5526; EPILOG: exit2: 5527; EPILOG-NEXT: ret void 5528; 5529; EPILOG-BLOCK-LABEL: @test11( 5530; EPILOG-BLOCK-NEXT: entry: 5531; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 5532; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 5533; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5534; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5535; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5536; EPILOG-BLOCK: entry.new: 5537; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5538; EPILOG-BLOCK-NEXT: br label %loop_header 5539; EPILOG-BLOCK: loop_header: 5540; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5541; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5542; EPILOG-BLOCK-NEXT: call void @bar() 5543; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5544; EPILOG-BLOCK: loop_latch: 5545; EPILOG-BLOCK-NEXT: call void @bar() 5546; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5547; EPILOG-BLOCK: loop_latch.1: 5548; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 5549; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 5550; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5551; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17 5552; EPILOG-BLOCK: exit1.loopexit: 5553; EPILOG-BLOCK-NEXT: br label %exit1 5554; EPILOG-BLOCK: exit1: 5555; EPILOG-BLOCK-NEXT: ret void 5556; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5557; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5558; EPILOG-BLOCK: exit2.unr-lcssa: 5559; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5560; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5561; EPILOG-BLOCK: loop_header.epil.preheader: 5562; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5563; EPILOG-BLOCK: loop_header.epil: 5564; EPILOG-BLOCK-NEXT: call void @bar() 5565; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1 5566; EPILOG-BLOCK: loop_latch.epil: 5567; EPILOG-BLOCK-NEXT: br label %exit2 5568; EPILOG-BLOCK: exit2: 5569; EPILOG-BLOCK-NEXT: ret void 5570; 5571; PROLOG-LABEL: @test11( 5572; PROLOG-NEXT: entry: 5573; PROLOG-NEXT: %0 = freeze i64 %trip 5574; PROLOG-NEXT: %1 = add i64 %0, -1 5575; PROLOG-NEXT: %xtraiter = and i64 %0, 7 5576; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5577; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5578; PROLOG: loop_header.prol.preheader: 5579; PROLOG-NEXT: br label %loop_header.prol 5580; PROLOG: loop_header.prol: 5581; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5582; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5583; PROLOG-NEXT: call void @bar() 5584; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1 5585; PROLOG: loop_latch.prol: 5586; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5587; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5588; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5589; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5590; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15 5591; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5592; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5593; PROLOG-NEXT: br label %loop_header.prol.loopexit 5594; PROLOG: loop_header.prol.loopexit: 5595; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5596; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 5597; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new 5598; PROLOG: entry.new: 5599; PROLOG-NEXT: br label %loop_header 5600; PROLOG: loop_header: 5601; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5602; PROLOG-NEXT: call void @bar() 5603; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5604; PROLOG: loop_latch: 5605; PROLOG-NEXT: call void @bar() 5606; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5607; PROLOG: loop_latch.1: 5608; PROLOG-NEXT: call void @bar() 5609; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5610; PROLOG: loop_latch.2: 5611; PROLOG-NEXT: call void @bar() 5612; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5613; PROLOG: loop_latch.3: 5614; PROLOG-NEXT: call void @bar() 5615; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5616; PROLOG: loop_latch.4: 5617; PROLOG-NEXT: call void @bar() 5618; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5619; PROLOG: loop_latch.5: 5620; PROLOG-NEXT: call void @bar() 5621; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5622; PROLOG: loop_latch.6: 5623; PROLOG-NEXT: call void @bar() 5624; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5625; PROLOG: loop_latch.7: 5626; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 5627; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5628; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5629; PROLOG: exit1.loopexit: 5630; PROLOG-NEXT: br label %exit1 5631; PROLOG: exit1.loopexit1: 5632; PROLOG-NEXT: br label %exit1 5633; PROLOG: exit1: 5634; PROLOG-NEXT: ret void 5635; PROLOG: exit2.unr-lcssa: 5636; PROLOG-NEXT: br label %exit2 5637; PROLOG: exit2: 5638; PROLOG-NEXT: ret void 5639; 5640; PROLOG-BLOCK-LABEL: @test11( 5641; PROLOG-BLOCK-NEXT: entry: 5642; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 5643; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 5644; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5645; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5646; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5647; PROLOG-BLOCK: loop_header.prol.preheader: 5648; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5649; PROLOG-BLOCK: loop_header.prol: 5650; PROLOG-BLOCK-NEXT: call void @bar() 5651; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1 5652; PROLOG-BLOCK: loop_latch.prol: 5653; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5654; PROLOG-BLOCK: loop_header.prol.loopexit: 5655; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5656; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5657; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new 5658; PROLOG-BLOCK: entry.new: 5659; PROLOG-BLOCK-NEXT: br label %loop_header 5660; PROLOG-BLOCK: loop_header: 5661; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5662; PROLOG-BLOCK-NEXT: call void @bar() 5663; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5664; PROLOG-BLOCK: loop_latch: 5665; PROLOG-BLOCK-NEXT: call void @bar() 5666; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5667; PROLOG-BLOCK: loop_latch.1: 5668; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 5669; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5670; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17 5671; PROLOG-BLOCK: exit1.loopexit: 5672; PROLOG-BLOCK-NEXT: br label %exit1 5673; PROLOG-BLOCK: exit1: 5674; PROLOG-BLOCK-NEXT: ret void 5675; PROLOG-BLOCK: exit2.unr-lcssa: 5676; PROLOG-BLOCK-NEXT: br label %exit2 5677; PROLOG-BLOCK: exit2: 5678; PROLOG-BLOCK-NEXT: ret void 5679; 5680entry: 5681 br label %loop_header 5682 5683loop_header: 5684 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5685 call void @bar() 5686 br i1 %cond, label %loop_latch, label %exit1 5687 5688loop_latch: 5689 %iv_next = add i64 %iv, 1 5690 %cmp = icmp ne i64 %iv_next, %trip 5691 br i1 %cmp, label %loop_header, label %exit2 5692 5693exit1: 5694 ret void 5695 5696exit2: 5697 ret void 5698} 5699 5700; Combine a computeable and invariant test to make sure 5701; the interaction of both doesn't do anything weird 5702define void @test12(i64 %trip, i64 %trip2, i1 %cond) { 5703; EPILOG-LABEL: @test12( 5704; EPILOG-NEXT: entry: 5705; EPILOG-NEXT: %0 = freeze i64 %trip 5706; EPILOG-NEXT: %1 = add i64 %0, -1 5707; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5708; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5709; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 5710; EPILOG: entry.new: 5711; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5712; EPILOG-NEXT: br label %loop_header 5713; EPILOG: loop_header: 5714; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5715; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5716; EPILOG-NEXT: call void @bar() 5717; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5718; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5719; EPILOG: loop_exiting_bb2: 5720; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5721; EPILOG: loop_latch: 5722; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5723; EPILOG-NEXT: call void @bar() 5724; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5725; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5726; EPILOG: loop_exiting_bb2.1: 5727; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5728; EPILOG: loop_latch.1: 5729; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 5730; EPILOG-NEXT: call void @bar() 5731; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5732; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 5733; EPILOG: loop_exiting_bb2.2: 5734; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 5735; EPILOG: loop_latch.2: 5736; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv, 3 5737; EPILOG-NEXT: call void @bar() 5738; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5739; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 5740; EPILOG: loop_exiting_bb2.3: 5741; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 5742; EPILOG: loop_latch.3: 5743; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv, 4 5744; EPILOG-NEXT: call void @bar() 5745; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5746; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 5747; EPILOG: loop_exiting_bb2.4: 5748; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 5749; EPILOG: loop_latch.4: 5750; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv, 5 5751; EPILOG-NEXT: call void @bar() 5752; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5753; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 5754; EPILOG: loop_exiting_bb2.5: 5755; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 5756; EPILOG: loop_latch.5: 5757; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv, 6 5758; EPILOG-NEXT: call void @bar() 5759; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5760; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 5761; EPILOG: loop_exiting_bb2.6: 5762; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 5763; EPILOG: loop_latch.6: 5764; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv, 7 5765; EPILOG-NEXT: call void @bar() 5766; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5767; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 5768; EPILOG: loop_exiting_bb2.7: 5769; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 5770; EPILOG: loop_latch.7: 5771; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 5772; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 5773; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5774; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 5775; EPILOG: exit1.unr-lcssa.loopexit: 5776; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5777; EPILOG-NEXT: br label %exit1.unr-lcssa 5778; EPILOG: exit1.unr-lcssa: 5779; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 5780; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5781; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 5782; EPILOG: loop_header.epil.preheader: 5783; EPILOG-NEXT: br label %loop_header.epil 5784; EPILOG: loop_header.epil: 5785; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 5786; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5787; EPILOG-NEXT: call void @bar() 5788; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5789; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 5790; EPILOG: loop_exiting_bb2.epil: 5791; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 5792; EPILOG: loop_latch.epil: 5793; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5794; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 5795; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 5796; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5797; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16 5798; EPILOG: exit1.epilog-lcssa.loopexit: 5799; EPILOG-NEXT: br label %exit1.epilog-lcssa 5800; EPILOG: exit1.epilog-lcssa.loopexit1: 5801; EPILOG-NEXT: br label %exit1.epilog-lcssa 5802; EPILOG: exit1.epilog-lcssa: 5803; EPILOG-NEXT: br label %exit1 5804; EPILOG: exit1: 5805; EPILOG-NEXT: ret void 5806; 5807; EPILOG-BLOCK-LABEL: @test12( 5808; EPILOG-BLOCK-NEXT: entry: 5809; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 5810; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 5811; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5812; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5813; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 5814; EPILOG-BLOCK: entry.new: 5815; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5816; EPILOG-BLOCK-NEXT: br label %loop_header 5817; EPILOG-BLOCK: loop_header: 5818; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5819; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5820; EPILOG-BLOCK-NEXT: call void @bar() 5821; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5822; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5823; EPILOG-BLOCK: loop_exiting_bb2: 5824; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5825; EPILOG-BLOCK: loop_latch: 5826; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 5827; EPILOG-BLOCK-NEXT: call void @bar() 5828; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5829; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5830; EPILOG-BLOCK: loop_exiting_bb2.1: 5831; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5832; EPILOG-BLOCK: loop_latch.1: 5833; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 5834; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 5835; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5836; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 5837; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 5838; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 5839; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 5840; EPILOG-BLOCK: exit1.unr-lcssa: 5841; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 5842; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5843; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 5844; EPILOG-BLOCK: loop_header.epil.preheader: 5845; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5846; EPILOG-BLOCK: loop_header.epil: 5847; EPILOG-BLOCK-NEXT: call void @bar() 5848; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 5849; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 5850; EPILOG-BLOCK: loop_exiting_bb2.epil: 5851; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa 5852; EPILOG-BLOCK: loop_latch.epil: 5853; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 5854; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 5855; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 5856; EPILOG-BLOCK: exit1.epilog-lcssa: 5857; EPILOG-BLOCK-NEXT: br label %exit1 5858; EPILOG-BLOCK: exit1: 5859; EPILOG-BLOCK-NEXT: ret void 5860; 5861; PROLOG-LABEL: @test12( 5862; PROLOG-NEXT: entry: 5863; PROLOG-NEXT: %0 = freeze i64 %trip 5864; PROLOG-NEXT: %1 = add i64 %0, -1 5865; PROLOG-NEXT: %xtraiter = and i64 %0, 7 5866; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5867; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5868; PROLOG: loop_header.prol.preheader: 5869; PROLOG-NEXT: br label %loop_header.prol 5870; PROLOG: loop_header.prol: 5871; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 5872; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5873; PROLOG-NEXT: call void @bar() 5874; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 5875; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 5876; PROLOG: loop_exiting_bb2.prol: 5877; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 5878; PROLOG: loop_latch.prol: 5879; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5880; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 5881; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 5882; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5883; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16 5884; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5885; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5886; PROLOG-NEXT: br label %loop_header.prol.loopexit 5887; PROLOG: loop_header.prol.loopexit: 5888; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5889; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 5890; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 5891; PROLOG: entry.new: 5892; PROLOG-NEXT: br label %loop_header 5893; PROLOG: loop_header: 5894; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5895; PROLOG-NEXT: call void @bar() 5896; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5897; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 5898; PROLOG: loop_exiting_bb2: 5899; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 5900; PROLOG: loop_latch: 5901; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5902; PROLOG-NEXT: call void @bar() 5903; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5904; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 5905; PROLOG: loop_exiting_bb2.1: 5906; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 5907; PROLOG: loop_latch.1: 5908; PROLOG-NEXT: %iv_next.1 = add i64 %iv, 2 5909; PROLOG-NEXT: call void @bar() 5910; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5911; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 5912; PROLOG: loop_exiting_bb2.2: 5913; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 5914; PROLOG: loop_latch.2: 5915; PROLOG-NEXT: %iv_next.2 = add i64 %iv, 3 5916; PROLOG-NEXT: call void @bar() 5917; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5918; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 5919; PROLOG: loop_exiting_bb2.3: 5920; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 5921; PROLOG: loop_latch.3: 5922; PROLOG-NEXT: %iv_next.3 = add i64 %iv, 4 5923; PROLOG-NEXT: call void @bar() 5924; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5925; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 5926; PROLOG: loop_exiting_bb2.4: 5927; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 5928; PROLOG: loop_latch.4: 5929; PROLOG-NEXT: %iv_next.4 = add i64 %iv, 5 5930; PROLOG-NEXT: call void @bar() 5931; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5932; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 5933; PROLOG: loop_exiting_bb2.5: 5934; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 5935; PROLOG: loop_latch.5: 5936; PROLOG-NEXT: %iv_next.5 = add i64 %iv, 6 5937; PROLOG-NEXT: call void @bar() 5938; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5939; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 5940; PROLOG: loop_exiting_bb2.6: 5941; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 5942; PROLOG: loop_latch.6: 5943; PROLOG-NEXT: %iv_next.6 = add i64 %iv, 7 5944; PROLOG-NEXT: call void @bar() 5945; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5946; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 5947; PROLOG: loop_exiting_bb2.7: 5948; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 5949; PROLOG: loop_latch.7: 5950; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 5951; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5952; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 5953; PROLOG: exit1.unr-lcssa.loopexit: 5954; PROLOG-NEXT: br label %exit1.unr-lcssa 5955; PROLOG: exit1.unr-lcssa.loopexit1: 5956; PROLOG-NEXT: br label %exit1.unr-lcssa 5957; PROLOG: exit1.unr-lcssa: 5958; PROLOG-NEXT: br label %exit1 5959; PROLOG: exit1: 5960; PROLOG-NEXT: ret void 5961; 5962; PROLOG-BLOCK-LABEL: @test12( 5963; PROLOG-BLOCK-NEXT: entry: 5964; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 5965; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 5966; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5967; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5968; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5969; PROLOG-BLOCK: loop_header.prol.preheader: 5970; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5971; PROLOG-BLOCK: loop_header.prol: 5972; PROLOG-BLOCK-NEXT: call void @bar() 5973; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 5974; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 5975; PROLOG-BLOCK: loop_exiting_bb2.prol: 5976; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa 5977; PROLOG-BLOCK: loop_latch.prol: 5978; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5979; PROLOG-BLOCK: loop_header.prol.loopexit: 5980; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5981; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5982; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 5983; PROLOG-BLOCK: entry.new: 5984; PROLOG-BLOCK-NEXT: br label %loop_header 5985; PROLOG-BLOCK: loop_header: 5986; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5987; PROLOG-BLOCK-NEXT: call void @bar() 5988; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5989; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 5990; PROLOG-BLOCK: loop_exiting_bb2: 5991; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 5992; PROLOG-BLOCK: loop_latch: 5993; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5994; PROLOG-BLOCK-NEXT: call void @bar() 5995; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5996; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 5997; PROLOG-BLOCK: loop_exiting_bb2.1: 5998; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 5999; PROLOG-BLOCK: loop_latch.1: 6000; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 6001; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6002; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6003; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6004; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6005; PROLOG-BLOCK: exit1.unr-lcssa: 6006; PROLOG-BLOCK-NEXT: br label %exit1 6007; PROLOG-BLOCK: exit1: 6008; PROLOG-BLOCK-NEXT: ret void 6009; 6010entry: 6011 br label %loop_header 6012 6013loop_header: 6014 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6015 call void @bar() 6016 %cmp_early = icmp ne i64 %iv, %trip2 6017 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6018 6019loop_exiting_bb2: 6020 br i1 %cond, label %loop_latch, label %exit1 6021 6022loop_latch: 6023 %iv_next = add i64 %iv, 1 6024 %cmp = icmp ne i64 %iv_next, %trip 6025 br i1 %cmp, label %loop_header, label %exit1 6026 6027exit1: 6028 ret void 6029} 6030 6031declare i1 @unknown_cond() 6032 6033; Mix of computable and uncompatable exits 6034define void @test13(i64 %trip, i64 %trip2) { 6035; EPILOG-LABEL: @test13( 6036; EPILOG-NEXT: entry: 6037; EPILOG-NEXT: %0 = freeze i64 %trip 6038; EPILOG-NEXT: %1 = add i64 %0, -1 6039; EPILOG-NEXT: %xtraiter = and i64 %0, 7 6040; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 6041; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6042; EPILOG: entry.new: 6043; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6044; EPILOG-NEXT: br label %loop_header 6045; EPILOG: loop_header: 6046; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6047; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6048; EPILOG-NEXT: call void @bar() 6049; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6050; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6051; EPILOG: loop_exiting_bb2: 6052; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6053; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6054; EPILOG: loop_latch: 6055; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6056; EPILOG-NEXT: call void @bar() 6057; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6058; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6059; EPILOG: loop_exiting_bb2.1: 6060; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6061; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6062; EPILOG: loop_latch.1: 6063; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv, 2 6064; EPILOG-NEXT: call void @bar() 6065; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6066; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6067; EPILOG: loop_exiting_bb2.2: 6068; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6069; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6070; EPILOG: loop_latch.2: 6071; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv, 3 6072; EPILOG-NEXT: call void @bar() 6073; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6074; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6075; EPILOG: loop_exiting_bb2.3: 6076; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6077; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6078; EPILOG: loop_latch.3: 6079; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv, 4 6080; EPILOG-NEXT: call void @bar() 6081; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6082; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6083; EPILOG: loop_exiting_bb2.4: 6084; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6085; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6086; EPILOG: loop_latch.4: 6087; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv, 5 6088; EPILOG-NEXT: call void @bar() 6089; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6090; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6091; EPILOG: loop_exiting_bb2.5: 6092; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6093; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6094; EPILOG: loop_latch.5: 6095; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv, 6 6096; EPILOG-NEXT: call void @bar() 6097; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6098; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6099; EPILOG: loop_exiting_bb2.6: 6100; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6101; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6102; EPILOG: loop_latch.6: 6103; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv, 7 6104; EPILOG-NEXT: call void @bar() 6105; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6106; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6107; EPILOG: loop_exiting_bb2.7: 6108; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6109; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6110; EPILOG: loop_latch.7: 6111; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 6112; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 6113; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6114; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6115; EPILOG: exit1.unr-lcssa.loopexit: 6116; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6117; EPILOG-NEXT: br label %exit1.unr-lcssa 6118; EPILOG: exit1.unr-lcssa: 6119; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6120; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6121; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6122; EPILOG: loop_header.epil.preheader: 6123; EPILOG-NEXT: br label %loop_header.epil 6124; EPILOG: loop_header.epil: 6125; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6126; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6127; EPILOG-NEXT: call void @bar() 6128; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 6129; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6130; EPILOG: loop_exiting_bb2.epil: 6131; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6132; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6133; EPILOG: loop_latch.epil: 6134; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6135; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6136; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6137; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6138; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17 6139; EPILOG: exit1.epilog-lcssa.loopexit: 6140; EPILOG-NEXT: br label %exit1.epilog-lcssa 6141; EPILOG: exit1.epilog-lcssa.loopexit1: 6142; EPILOG-NEXT: br label %exit1.epilog-lcssa 6143; EPILOG: exit1.epilog-lcssa: 6144; EPILOG-NEXT: br label %exit1 6145; EPILOG: exit1: 6146; EPILOG-NEXT: ret void 6147; 6148; EPILOG-BLOCK-LABEL: @test13( 6149; EPILOG-BLOCK-NEXT: entry: 6150; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 6151; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 6152; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6153; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6154; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6155; EPILOG-BLOCK: entry.new: 6156; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6157; EPILOG-BLOCK-NEXT: br label %loop_header 6158; EPILOG-BLOCK: loop_header: 6159; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6160; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6161; EPILOG-BLOCK-NEXT: call void @bar() 6162; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6163; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6164; EPILOG-BLOCK: loop_exiting_bb2: 6165; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6166; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6167; EPILOG-BLOCK: loop_latch: 6168; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 6169; EPILOG-BLOCK-NEXT: call void @bar() 6170; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6171; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6172; EPILOG-BLOCK: loop_exiting_bb2.1: 6173; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6174; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6175; EPILOG-BLOCK: loop_latch.1: 6176; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 6177; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 6178; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6179; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6180; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6181; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6182; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6183; EPILOG-BLOCK: exit1.unr-lcssa: 6184; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6185; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6186; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6187; EPILOG-BLOCK: loop_header.epil.preheader: 6188; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6189; EPILOG-BLOCK: loop_header.epil: 6190; EPILOG-BLOCK-NEXT: call void @bar() 6191; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6192; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6193; EPILOG-BLOCK: loop_exiting_bb2.epil: 6194; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6195; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6196; EPILOG-BLOCK: loop_latch.epil: 6197; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6198; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6199; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6200; EPILOG-BLOCK: exit1.epilog-lcssa: 6201; EPILOG-BLOCK-NEXT: br label %exit1 6202; EPILOG-BLOCK: exit1: 6203; EPILOG-BLOCK-NEXT: ret void 6204; 6205; PROLOG-LABEL: @test13( 6206; PROLOG-NEXT: entry: 6207; PROLOG-NEXT: %0 = freeze i64 %trip 6208; PROLOG-NEXT: %1 = add i64 %0, -1 6209; PROLOG-NEXT: %xtraiter = and i64 %0, 7 6210; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6211; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6212; PROLOG: loop_header.prol.preheader: 6213; PROLOG-NEXT: br label %loop_header.prol 6214; PROLOG: loop_header.prol: 6215; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6216; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6217; PROLOG-NEXT: call void @bar() 6218; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6219; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6220; PROLOG: loop_exiting_bb2.prol: 6221; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6222; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6223; PROLOG: loop_latch.prol: 6224; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6225; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6226; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6227; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6228; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17 6229; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6230; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6231; PROLOG-NEXT: br label %loop_header.prol.loopexit 6232; PROLOG: loop_header.prol.loopexit: 6233; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6234; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 6235; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 6236; PROLOG: entry.new: 6237; PROLOG-NEXT: br label %loop_header 6238; PROLOG: loop_header: 6239; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6240; PROLOG-NEXT: call void @bar() 6241; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6242; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6243; PROLOG: loop_exiting_bb2: 6244; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6245; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6246; PROLOG: loop_latch: 6247; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6248; PROLOG-NEXT: call void @bar() 6249; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6250; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6251; PROLOG: loop_exiting_bb2.1: 6252; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6253; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6254; PROLOG: loop_latch.1: 6255; PROLOG-NEXT: %iv_next.1 = add i64 %iv, 2 6256; PROLOG-NEXT: call void @bar() 6257; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6258; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6259; PROLOG: loop_exiting_bb2.2: 6260; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6261; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6262; PROLOG: loop_latch.2: 6263; PROLOG-NEXT: %iv_next.2 = add i64 %iv, 3 6264; PROLOG-NEXT: call void @bar() 6265; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6266; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6267; PROLOG: loop_exiting_bb2.3: 6268; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6269; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6270; PROLOG: loop_latch.3: 6271; PROLOG-NEXT: %iv_next.3 = add i64 %iv, 4 6272; PROLOG-NEXT: call void @bar() 6273; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6274; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6275; PROLOG: loop_exiting_bb2.4: 6276; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6277; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6278; PROLOG: loop_latch.4: 6279; PROLOG-NEXT: %iv_next.4 = add i64 %iv, 5 6280; PROLOG-NEXT: call void @bar() 6281; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6282; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6283; PROLOG: loop_exiting_bb2.5: 6284; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6285; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6286; PROLOG: loop_latch.5: 6287; PROLOG-NEXT: %iv_next.5 = add i64 %iv, 6 6288; PROLOG-NEXT: call void @bar() 6289; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6290; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6291; PROLOG: loop_exiting_bb2.6: 6292; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6293; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6294; PROLOG: loop_latch.6: 6295; PROLOG-NEXT: %iv_next.6 = add i64 %iv, 7 6296; PROLOG-NEXT: call void @bar() 6297; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6298; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6299; PROLOG: loop_exiting_bb2.7: 6300; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6301; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6302; PROLOG: loop_latch.7: 6303; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 6304; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6305; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6306; PROLOG: exit1.unr-lcssa.loopexit: 6307; PROLOG-NEXT: br label %exit1.unr-lcssa 6308; PROLOG: exit1.unr-lcssa.loopexit1: 6309; PROLOG-NEXT: br label %exit1.unr-lcssa 6310; PROLOG: exit1.unr-lcssa: 6311; PROLOG-NEXT: br label %exit1 6312; PROLOG: exit1: 6313; PROLOG-NEXT: ret void 6314; 6315; PROLOG-BLOCK-LABEL: @test13( 6316; PROLOG-BLOCK-NEXT: entry: 6317; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 6318; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 6319; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6320; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6321; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6322; PROLOG-BLOCK: loop_header.prol.preheader: 6323; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6324; PROLOG-BLOCK: loop_header.prol: 6325; PROLOG-BLOCK-NEXT: call void @bar() 6326; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6327; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6328; PROLOG-BLOCK: loop_exiting_bb2.prol: 6329; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6330; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6331; PROLOG-BLOCK: loop_latch.prol: 6332; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6333; PROLOG-BLOCK: loop_header.prol.loopexit: 6334; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6335; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6336; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 6337; PROLOG-BLOCK: entry.new: 6338; PROLOG-BLOCK-NEXT: br label %loop_header 6339; PROLOG-BLOCK: loop_header: 6340; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6341; PROLOG-BLOCK-NEXT: call void @bar() 6342; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6343; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6344; PROLOG-BLOCK: loop_exiting_bb2: 6345; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6346; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6347; PROLOG-BLOCK: loop_latch: 6348; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6349; PROLOG-BLOCK-NEXT: call void @bar() 6350; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6351; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6352; PROLOG-BLOCK: loop_exiting_bb2.1: 6353; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6354; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6355; PROLOG-BLOCK: loop_latch.1: 6356; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 6357; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6358; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6359; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6360; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6361; PROLOG-BLOCK: exit1.unr-lcssa: 6362; PROLOG-BLOCK-NEXT: br label %exit1 6363; PROLOG-BLOCK: exit1: 6364; PROLOG-BLOCK-NEXT: ret void 6365; 6366entry: 6367 br label %loop_header 6368 6369loop_header: 6370 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6371 call void @bar() 6372 %cmp_early = icmp ne i64 %iv, %trip2 6373 br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6374 6375loop_exiting_bb2: 6376 %unknown = call i1 @unknown_cond() 6377 br i1 %unknown, label %loop_latch, label %exit1 6378 6379loop_latch: 6380 %iv_next = add i64 %iv, 1 6381 %cmp = icmp ne i64 %iv_next, %trip 6382 br i1 %cmp, label %loop_header, label %exit1 6383 6384exit1: 6385 ret void 6386} 6387 6388; Mix of invariant and (even in theory) uncomputable exits 6389define void @test14(i64 %trip, i1 %cond) { 6390; EPILOG-LABEL: @test14( 6391; EPILOG-NEXT: entry: 6392; EPILOG-NEXT: %0 = freeze i64 %trip 6393; EPILOG-NEXT: %1 = add i64 %0, -1 6394; EPILOG-NEXT: %xtraiter = and i64 %0, 7 6395; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 6396; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6397; EPILOG: entry.new: 6398; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6399; EPILOG-NEXT: br label %loop_header 6400; EPILOG: loop_header: 6401; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6402; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6403; EPILOG-NEXT: call void @bar() 6404; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6405; EPILOG: loop_exiting_bb2: 6406; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6407; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6408; EPILOG: loop_latch: 6409; EPILOG-NEXT: call void @bar() 6410; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6411; EPILOG: loop_exiting_bb2.1: 6412; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6413; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6414; EPILOG: loop_latch.1: 6415; EPILOG-NEXT: call void @bar() 6416; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6417; EPILOG: loop_exiting_bb2.2: 6418; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6419; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6420; EPILOG: loop_latch.2: 6421; EPILOG-NEXT: call void @bar() 6422; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6423; EPILOG: loop_exiting_bb2.3: 6424; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6425; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6426; EPILOG: loop_latch.3: 6427; EPILOG-NEXT: call void @bar() 6428; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6429; EPILOG: loop_exiting_bb2.4: 6430; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6431; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6432; EPILOG: loop_latch.4: 6433; EPILOG-NEXT: call void @bar() 6434; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6435; EPILOG: loop_exiting_bb2.5: 6436; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6437; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6438; EPILOG: loop_latch.5: 6439; EPILOG-NEXT: call void @bar() 6440; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6441; EPILOG: loop_exiting_bb2.6: 6442; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6443; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6444; EPILOG: loop_latch.6: 6445; EPILOG-NEXT: call void @bar() 6446; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6447; EPILOG: loop_exiting_bb2.7: 6448; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6449; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6450; EPILOG: loop_latch.7: 6451; EPILOG-NEXT: %iv_next.7 = add i64 %iv, 8 6452; EPILOG-NEXT: %niter.next.7 = add i64 %niter, 8 6453; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6454; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6455; EPILOG: exit1.unr-lcssa.loopexit: 6456; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6457; EPILOG-NEXT: br label %exit1.unr-lcssa 6458; EPILOG: exit1.unr-lcssa: 6459; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6460; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6461; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6462; EPILOG: loop_header.epil.preheader: 6463; EPILOG-NEXT: br label %loop_header.epil 6464; EPILOG: loop_header.epil: 6465; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 6466; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6467; EPILOG-NEXT: call void @bar() 6468; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6469; EPILOG: loop_exiting_bb2.epil: 6470; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6471; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6472; EPILOG: loop_latch.epil: 6473; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6474; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 6475; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 6476; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6477; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18 6478; EPILOG: exit1.epilog-lcssa.loopexit: 6479; EPILOG-NEXT: br label %exit1.epilog-lcssa 6480; EPILOG: exit1.epilog-lcssa.loopexit1: 6481; EPILOG-NEXT: br label %exit1.epilog-lcssa 6482; EPILOG: exit1.epilog-lcssa: 6483; EPILOG-NEXT: br label %exit1 6484; EPILOG: exit1: 6485; EPILOG-NEXT: ret void 6486; 6487; EPILOG-BLOCK-LABEL: @test14( 6488; EPILOG-BLOCK-NEXT: entry: 6489; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 6490; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 6491; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6492; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6493; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6494; EPILOG-BLOCK: entry.new: 6495; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6496; EPILOG-BLOCK-NEXT: br label %loop_header 6497; EPILOG-BLOCK: loop_header: 6498; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6499; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6500; EPILOG-BLOCK-NEXT: call void @bar() 6501; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6502; EPILOG-BLOCK: loop_exiting_bb2: 6503; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6504; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6505; EPILOG-BLOCK: loop_latch: 6506; EPILOG-BLOCK-NEXT: call void @bar() 6507; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6508; EPILOG-BLOCK: loop_exiting_bb2.1: 6509; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6510; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6511; EPILOG-BLOCK: loop_latch.1: 6512; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 6513; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter, 2 6514; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6515; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6516; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6517; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6518; EPILOG-BLOCK: exit1.unr-lcssa: 6519; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6520; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6521; EPILOG-BLOCK: loop_header.epil.preheader: 6522; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6523; EPILOG-BLOCK: loop_header.epil: 6524; EPILOG-BLOCK-NEXT: call void @bar() 6525; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6526; EPILOG-BLOCK: loop_exiting_bb2.epil: 6527; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6528; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6529; EPILOG-BLOCK: loop_latch.epil: 6530; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6531; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6532; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6533; EPILOG-BLOCK: exit1.epilog-lcssa: 6534; EPILOG-BLOCK-NEXT: br label %exit1 6535; EPILOG-BLOCK: exit1: 6536; EPILOG-BLOCK-NEXT: ret void 6537; 6538; PROLOG-LABEL: @test14( 6539; PROLOG-NEXT: entry: 6540; PROLOG-NEXT: %0 = freeze i64 %trip 6541; PROLOG-NEXT: %1 = add i64 %0, -1 6542; PROLOG-NEXT: %xtraiter = and i64 %0, 7 6543; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6544; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6545; PROLOG: loop_header.prol.preheader: 6546; PROLOG-NEXT: br label %loop_header.prol 6547; PROLOG: loop_header.prol: 6548; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 6549; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6550; PROLOG-NEXT: call void @bar() 6551; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6552; PROLOG: loop_exiting_bb2.prol: 6553; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6554; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6555; PROLOG: loop_latch.prol: 6556; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6557; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 6558; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 6559; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6560; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18 6561; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6562; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6563; PROLOG-NEXT: br label %loop_header.prol.loopexit 6564; PROLOG: loop_header.prol.loopexit: 6565; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6566; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 6567; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 6568; PROLOG: entry.new: 6569; PROLOG-NEXT: br label %loop_header 6570; PROLOG: loop_header: 6571; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6572; PROLOG-NEXT: call void @bar() 6573; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6574; PROLOG: loop_exiting_bb2: 6575; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6576; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6577; PROLOG: loop_latch: 6578; PROLOG-NEXT: call void @bar() 6579; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6580; PROLOG: loop_exiting_bb2.1: 6581; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6582; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6583; PROLOG: loop_latch.1: 6584; PROLOG-NEXT: call void @bar() 6585; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6586; PROLOG: loop_exiting_bb2.2: 6587; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6588; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6589; PROLOG: loop_latch.2: 6590; PROLOG-NEXT: call void @bar() 6591; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6592; PROLOG: loop_exiting_bb2.3: 6593; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6594; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6595; PROLOG: loop_latch.3: 6596; PROLOG-NEXT: call void @bar() 6597; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6598; PROLOG: loop_exiting_bb2.4: 6599; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6600; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6601; PROLOG: loop_latch.4: 6602; PROLOG-NEXT: call void @bar() 6603; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6604; PROLOG: loop_exiting_bb2.5: 6605; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6606; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6607; PROLOG: loop_latch.5: 6608; PROLOG-NEXT: call void @bar() 6609; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6610; PROLOG: loop_exiting_bb2.6: 6611; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6612; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6613; PROLOG: loop_latch.6: 6614; PROLOG-NEXT: call void @bar() 6615; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6616; PROLOG: loop_exiting_bb2.7: 6617; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6618; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6619; PROLOG: loop_latch.7: 6620; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 6621; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6622; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6623; PROLOG: exit1.unr-lcssa.loopexit: 6624; PROLOG-NEXT: br label %exit1.unr-lcssa 6625; PROLOG: exit1.unr-lcssa.loopexit1: 6626; PROLOG-NEXT: br label %exit1.unr-lcssa 6627; PROLOG: exit1.unr-lcssa: 6628; PROLOG-NEXT: br label %exit1 6629; PROLOG: exit1: 6630; PROLOG-NEXT: ret void 6631; 6632; PROLOG-BLOCK-LABEL: @test14( 6633; PROLOG-BLOCK-NEXT: entry: 6634; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 6635; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 6636; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6637; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6638; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6639; PROLOG-BLOCK: loop_header.prol.preheader: 6640; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6641; PROLOG-BLOCK: loop_header.prol: 6642; PROLOG-BLOCK-NEXT: call void @bar() 6643; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6644; PROLOG-BLOCK: loop_exiting_bb2.prol: 6645; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6646; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6647; PROLOG-BLOCK: loop_latch.prol: 6648; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6649; PROLOG-BLOCK: loop_header.prol.loopexit: 6650; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6651; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6652; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 6653; PROLOG-BLOCK: entry.new: 6654; PROLOG-BLOCK-NEXT: br label %loop_header 6655; PROLOG-BLOCK: loop_header: 6656; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6657; PROLOG-BLOCK-NEXT: call void @bar() 6658; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6659; PROLOG-BLOCK: loop_exiting_bb2: 6660; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6661; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6662; PROLOG-BLOCK: loop_latch: 6663; PROLOG-BLOCK-NEXT: call void @bar() 6664; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6665; PROLOG-BLOCK: loop_exiting_bb2.1: 6666; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6667; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6668; PROLOG-BLOCK: loop_latch.1: 6669; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv, 2 6670; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6671; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6672; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6673; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6674; PROLOG-BLOCK: exit1.unr-lcssa: 6675; PROLOG-BLOCK-NEXT: br label %exit1 6676; PROLOG-BLOCK: exit1: 6677; PROLOG-BLOCK-NEXT: ret void 6678; 6679entry: 6680 br label %loop_header 6681 6682loop_header: 6683 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6684 call void @bar() 6685 br i1 %cond, label %loop_exiting_bb2, label %exit1 6686 6687loop_exiting_bb2: 6688 %unknown = call i1 @unknown_cond() 6689 br i1 %unknown, label %loop_latch, label %exit1 6690 6691loop_latch: 6692 %iv_next = add i64 %iv, 1 6693 %cmp = icmp ne i64 %iv_next, %trip 6694 br i1 %cmp, label %loop_header, label %exit1 6695 6696exit1: 6697 ret void 6698} 6699