1; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefix=EPILOG-NO-IC 2; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=EPILOG 3; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine 4; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=PROLOG 5; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine 6 7; the third and fifth RUNs generate an epilog/prolog remainder block for all the test 8; cases below (it does not generate a loop). 9 10; test with three exiting and three exit blocks. 11; none of the exit blocks have successors 12define void @test1(i64 %trip, i1 %cond) { 13; EPILOG: test1( 14; EPILOG-NEXT: entry: 15; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1 16; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7 17; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 18; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]] 19; EPILOG: entry.new: 20; EPILOG-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TRIP]], [[XTRAITER]] 21; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]] 22; EPILOG: loop_latch.epil: 23; EPILOG-NEXT: %epil.iter.sub = add i64 %epil.iter, -1 24; EPILOG-NEXT: %epil.iter.cmp = icmp eq i64 %epil.iter.sub, 0 25; EPILOG-NEXT: br i1 %epil.iter.cmp, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil 26; EPILOG: loop_latch.7: 27; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8 28; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 29; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header 30 31; PROLOG: test1( 32; PROLOG-NEXT: entry: 33; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1 34; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7 35; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0 36; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader 37; PROLOG: loop_header.prol: 38; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 39; PROLOG-NEXT: %prol.iter = phi i64 [ [[XTRAITER]], %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ] 40; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 41; PROLOG: loop_latch.prol: 42; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 43; PROLOG-NEXT: %prol.iter.sub = add i64 %prol.iter, -1 44; PROLOG-NEXT: %prol.iter.cmp = icmp eq i64 %prol.iter.sub, 0 45; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol.loopexit.unr-lcssa, label %loop_header.prol 46; PROLOG: loop_latch.7: 47; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8 48; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip 49; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header 50entry: 51 br label %loop_header 52 53loop_header: 54 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 55 br i1 %cond, label %loop_latch, label %loop_exiting_bb1 56 57loop_exiting_bb1: 58 br i1 false, label %loop_exiting_bb2, label %exit1 59 60loop_exiting_bb2: 61 br i1 false, label %loop_latch, label %exit3 62 63exit3: 64 ret void 65 66loop_latch: 67 %iv_next = add i64 %iv, 1 68 %cmp = icmp ne i64 %iv_next, %trip 69 br i1 %cmp, label %loop_header, label %exit2.loopexit 70 71exit1: 72 ret void 73 74exit2.loopexit: 75 ret void 76} 77 78 79; test with three exiting and two exit blocks. 80; The non-latch exit block has 2 unique predecessors. 81; There are 2 values passed to the exit blocks that are calculated at every iteration. 82; %sum.02 and %add. Both of these are incoming values for phi from every exiting 83; unrolled block. 84define i32 @test2(i32* nocapture %a, i64 %n) { 85; EPILOG: test2( 86; EPILOG: for.exit2.loopexit: 87; 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 ], 88; EPILOG-NEXT: br label %for.exit2 89; EPILOG: for.exit2.loopexit2: 90; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 91; EPILOG-NEXT: br label %for.exit2 92; EPILOG: for.exit2: 93; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 94; EPILOG-NEXT: ret i32 %retval 95; EPILOG: %niter.nsub.7 = add i64 %niter, -8 96 97; PROLOG: test2( 98; PROLOG: for.exit2.loopexit: 99; 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 ], 100; PROLOG-NEXT: br label %for.exit2 101; PROLOG: for.exit2.loopexit1: 102; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 103; PROLOG-NEXT: br label %for.exit2 104; PROLOG: for.exit2: 105; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 106; PROLOG-NEXT: ret i32 %retval 107; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8 108 109entry: 110 br label %header 111 112header: 113 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 114 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] 115 br i1 false, label %for.exit2, label %for.exiting_block 116 117for.exiting_block: 118 %cmp = icmp eq i64 %n, 42 119 br i1 %cmp, label %for.exit2, label %for.body 120 121for.body: 122 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 123 %0 = load i32, i32* %arrayidx, align 4 124 %add = add nsw i32 %0, %sum.02 125 %indvars.iv.next = add i64 %indvars.iv, 1 126 %exitcond = icmp eq i64 %indvars.iv.next, %n 127 br i1 %exitcond, label %for.end, label %header 128 129for.end: ; preds = %for.body 130 %sum.0.lcssa = phi i32 [ %add, %for.body ] 131 ret i32 %sum.0.lcssa 132 133for.exit2: 134 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 135 ret i32 %retval 136} 137 138; test with two exiting and three exit blocks. 139; the non-latch exiting block has a switch. 140define void @test3(i64 %trip, i64 %add) { 141; EPILOG: test3( 142; EPILOG-NEXT: entry: 143; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1 144; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7 145; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 146; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]] 147; EPILOG: entry.new: 148; EPILOG-NEXT: %unroll_iter = sub i64 [[TRIP]], [[XTRAITER]] 149; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]] 150; EPILOG: loop_header: 151; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 152; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ] 153; EPILOG: loop_exiting_bb1.7: 154; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 155; EPILOG: loop_latch.7: 156; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 157; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8 158; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0 159; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header 160 161; PROLOG: test3( 162; PROLOG-NEXT: entry: 163; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1 164; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7 165; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0 166; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader 167; PROLOG: loop_header: 168; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 169; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 170; PROLOG: loop_exiting_bb1.7: 171; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 172; PROLOG: loop_latch.7: 173; PROLOG-NEXT: %iv_next.7 = add nsw i64 %iv, 8 174; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 175; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip 176; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header 177entry: 178 br label %loop_header 179 180loop_header: 181 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 182 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 183 br i1 undef, label %loop_latch, label %loop_exiting_bb1 184 185loop_exiting_bb1: 186 switch i64 %sum, label %loop_latch [ 187 i64 24, label %exit1 188 i64 42, label %exit3 189 ] 190 191exit3: 192 ret void 193 194loop_latch: 195 %iv_next = add nuw nsw i64 %iv, 1 196 %sum.next = add i64 %sum, %add 197 %cmp = icmp ne i64 %iv_next, %trip 198 br i1 %cmp, label %loop_header, label %exit2.loopexit 199 200exit1: 201 ret void 202 203exit2.loopexit: 204 ret void 205} 206 207; FIXME: Support multiple exiting blocks to the same latch exit block. 208define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) { 209; EPILOG: test4( 210; EPILOG-NOT: .unr 211; EPILOG-NOT: .epil 212 213; PROLOG: test4( 214; PROLOG-NOT: .unr 215; PROLOG-NOT: .prol 216entry: 217 br label %header 218 219header: 220 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 221 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] 222 br i1 %cond, label %for.end, label %for.exiting_block 223 224for.exiting_block: 225 %cmp = icmp eq i64 %n, 42 226 br i1 %cmp, label %for.exit2, label %for.body 227 228for.body: ; preds = %for.body, %entry 229 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 230 %0 = load i32, i32* %arrayidx, align 4 231 %add = add nsw i32 %0, %sum.02 232 %indvars.iv.next = add i64 %indvars.iv, 1 233 %exitcond = icmp eq i64 %indvars.iv.next, %n 234 br i1 %exitcond, label %for.end, label %header 235 236for.end: ; preds = %for.body, %entry 237 %sum.0.lcssa = phi i32 [ 0, %header ], [ %add, %for.body ] 238 ret i32 %sum.0.lcssa 239 240for.exit2: 241 ret i32 42 242} 243 244; FIXME: Support multiple exiting blocks to the unique exit block. 245define void @unique_exit(i32 %arg) { 246; EPILOG: unique_exit( 247; EPILOG-NOT: .unr 248; EPILOG-NOT: .epil 249 250; PROLOG: unique_exit( 251; PROLOG-NOT: .unr 252; PROLOG-NOT: .prol 253entry: 254 %tmp = icmp sgt i32 undef, %arg 255 br i1 %tmp, label %preheader, label %returnblock 256 257preheader: ; preds = %entry 258 br label %header 259 260LoopExit: ; preds = %header, %latch 261 %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ] 262 br label %returnblock 263 264returnblock: ; preds = %LoopExit, %entry 265 %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %LoopExit ] 266 ret void 267 268header: ; preds = %preheader, %latch 269 %tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] 270 %inc = add nsw i32 %tmp4, 1 271 br i1 true, label %LoopExit, label %latch 272 273latch: ; preds = %header 274 %cmp = icmp slt i32 %inc, undef 275 br i1 %cmp, label %header, label %LoopExit 276} 277 278; two exiting and two exit blocks. 279; the non-latch exiting block has duplicate edges to the non-latch exit block. 280define i64 @test5(i64 %trip, i64 %add, i1 %cond) { 281; EPILOG: test5( 282; EPILOG: exit1.loopexit: 283; 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 ], 284; EPILOG-NEXT: br label %exit1 285; EPILOG: exit1.loopexit2: 286; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 287; EPILOG-NEXT: br label %exit1 288; EPILOG: exit1: 289; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.epil, %exit1.loopexit2 ] 290; EPILOG-NEXT: ret i64 %result 291; EPILOG: loop_latch.7: 292; EPILOG: %niter.nsub.7 = add i64 %niter, -8 293 294; PROLOG: test5( 295; PROLOG: exit1.loopexit: 296; 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 ], 297; PROLOG-NEXT: br label %exit1 298; PROLOG: exit1.loopexit1: 299; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 300; PROLOG-NEXT: br label %exit1 301; PROLOG: exit1: 302; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.prol, %exit1.loopexit1 ] 303; PROLOG-NEXT: ret i64 %result 304; PROLOG: loop_latch.7: 305; PROLOG: %iv_next.7 = add nsw i64 %iv, 8 306entry: 307 br label %loop_header 308 309loop_header: 310 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 311 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 312 br i1 %cond, label %loop_latch, label %loop_exiting 313 314loop_exiting: 315 %ivy = add i64 %iv, %add 316 switch i64 %sum, label %loop_latch [ 317 i64 24, label %exit1 318 i64 42, label %exit1 319 ] 320 321loop_latch: 322 %iv_next = add nuw nsw i64 %iv, 1 323 %sum.next = add i64 %sum, %add 324 %cmp = icmp ne i64 %iv_next, %trip 325 br i1 %cmp, label %loop_header, label %latchexit 326 327exit1: 328 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 329 ret i64 %result 330 331latchexit: 332 ret i64 %sum.next 333} 334 335; test when exit blocks have successors. 336define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 337; EPILOG: test6( 338; EPILOG: for.exit2.loopexit: 339; 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 ], 340; EPILOG-NEXT: br label %for.exit2 341; EPILOG: for.exit2.loopexit2: 342; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 343; EPILOG-NEXT: br label %for.exit2 344; EPILOG: for.exit2: 345; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 346; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 347; EPILOG: latch.7: 348; EPILOG: %niter.nsub.7 = add i64 %niter, -8 349 350; PROLOG: test6( 351; PROLOG: for.exit2.loopexit: 352; 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 ], 353; PROLOG-NEXT: br label %for.exit2 354; PROLOG: for.exit2.loopexit1: 355; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 356; PROLOG-NEXT: br label %for.exit2 357; PROLOG: for.exit2: 358; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 359; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 360; PROLOG: latch.7: 361; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8 362entry: 363 br label %header 364 365header: 366 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 367 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 368 br i1 false, label %for.exit2, label %for.exiting_block 369 370for.exiting_block: 371 %cmp = icmp eq i64 %n, 42 372 br i1 %cmp, label %for.exit2, label %latch 373 374latch: 375 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 376 %load = load i32, i32* %arrayidx, align 4 377 %add = add nsw i32 %load, %sum.02 378 %indvars.iv.next = add i64 %indvars.iv, 1 379 %exitcond = icmp eq i64 %indvars.iv.next, %n 380 br i1 %exitcond, label %latch_exit, label %header 381 382latch_exit: 383 %sum.0.lcssa = phi i32 [ %add, %latch ] 384 ret i32 %sum.0.lcssa 385 386for.exit2: 387 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 388 %addx = add i32 %retval, %x 389 br i1 %cond, label %exit_true, label %exit_false 390 391exit_true: 392 ret i32 %retval 393 394exit_false: 395 ret i32 %addx 396} 397 398; test when value in exit block does not have VMap. 399define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 400; EPILOG-NO-IC: test7( 401; EPILOG-NO-IC: loopexit1.loopexit: 402; EPILOG-NO-IC-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 ] 403; EPILOG-NO-IC-NEXT: br label %loopexit1 404; EPILOG-NO-IC: loopexit1.loopexit1: 405; EPILOG-NO-IC-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 406; EPILOG-NO-IC-NEXT: br label %loopexit1 407; EPILOG-NO-IC: loopexit1: 408; EPILOG-NO-IC-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 409bb: 410 %tmp = icmp slt i32 undef, 2 411 %sext = sext i32 undef to i64 412 %shft = ashr exact i32 %arg, 16 413 br i1 %tmp, label %loopexit2, label %preheader 414 415preheader: ; preds = %bb2 416 br label %header 417 418header: ; preds = %latch, %preheader 419 %tmp6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 420 br i1 false, label %loopexit1, label %latch 421 422latch: ; preds = %header 423 %add = add nuw nsw i64 %tmp6, 1 424 %tmp9 = icmp slt i64 %add, %sext 425 br i1 %tmp9, label %header, label %latchexit 426 427latchexit: ; preds = %latch 428 unreachable 429 430loopexit2: ; preds = %bb2 431 ret i32 %shft 432 433loopexit1: ; preds = %header 434 %sext3 = phi i32 [ %shft, %header ] 435 ret i32 %sext3 436} 437 438; Nested loop and inner loop is unrolled 439; FIXME: we cannot unroll with epilog remainder currently, because 440; the outer loop does not contain the epilog preheader and epilog exit (while 441; infact it should). This causes us to choke up on LCSSA form being incorrect in 442; outer loop. However, the exit block where LCSSA fails, is infact still within 443; the outer loop. For now, we just bail out in presence of outer loop and epilog 444; loop is generated. 445; The outer loop header is the preheader for the inner loop and the inner header 446; branches back to the outer loop. 447define void @test8() { 448; EPILOG: test8( 449; EPILOG-NOT: niter 450 451; PROLOG: test8( 452; PROLOG: outerloop: 453; PROLOG-NEXT: phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 454; PROLOG: %lcmp.mod = icmp eq i64 455; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.loopexit, label %innerH.prol.preheader 456; PROLOG: latch.6: 457; PROLOG-NEXT: %tmp4.7 = add nsw i64 %tmp3, 8 458; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 459; PROLOG: latch.7 460; PROLOG-NEXT: %tmp6.7 = icmp ult i64 %tmp4.7, 100 461; PROLOG-NEXT: br i1 %tmp6.7, label %innerH, label %exit.unr-lcssa 462bb: 463 br label %outerloop 464 465outerloop: ; preds = %innerH, %bb 466 %tmp = phi i64 [ 3, %bb ], [ 0, %innerH ] 467 br label %innerH 468 469innerH: ; preds = %latch, %outerloop 470 %tmp3 = phi i64 [ %tmp4, %latch ], [ %tmp, %outerloop ] 471 %tmp4 = add nuw nsw i64 %tmp3, 1 472 br i1 false, label %outerloop, label %latch 473 474latch: ; preds = %innerH 475 %tmp6 = icmp ult i64 %tmp4, 100 476 br i1 %tmp6, label %innerH, label %exit 477 478exit: ; preds = %latch 479 ret void 480} 481