Lines Matching full:block

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
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
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
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
358 ; The non-latch exit block has 2 unique predecessors.
361 ; unrolled block.
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
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
791 ; the non-latch exiting block has a switch.
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
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
1198 ; FIXME: Support multiple exiting blocks to the same latch exit block.
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
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
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
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
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
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
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
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
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
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
3295 ; the non-latch exiting block has duplicate edges to the non-latch exit block.
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
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
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
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
4202 ; test when value in exit block does not have VMap.
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
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
4475 ; several blocks in the inner loop fall out of the outer block when we
4476 ; use the epilogue block remainder strategy.
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
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
4774 ; a value from outer loop is used in exit block of inner loop.
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
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
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
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
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
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
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
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
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
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
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
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