1911991d2SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p 2911991d2SPhilip Reames; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG 3911991d2SPhilip Reames; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG-BLOCK 4911991d2SPhilip Reames; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG 5911991d2SPhilip Reames; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG-BLOCK 6cee313d2SEric Christopher 7cee313d2SEric Christopher; REQUIRES: asserts 8cee313d2SEric Christopher 9cee313d2SEric Christopher; test with three exiting and three exit blocks. 10cee313d2SEric Christopher; none of the exit blocks have successors 11cee313d2SEric Christopherdefine void @test1(i64 %trip, i1 %cond) { 12911991d2SPhilip Reames; EPILOG-LABEL: @test1( 13cee313d2SEric Christopher; EPILOG-NEXT: entry: 14*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 15*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 16*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 17*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 18323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 19cee313d2SEric Christopher; EPILOG: entry.new: 20*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 21911991d2SPhilip Reames; EPILOG-NEXT: br label %loop_header 22911991d2SPhilip Reames; EPILOG: loop_header: 23911991d2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 2437ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 25911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 26911991d2SPhilip Reames; EPILOG: loop_exiting_bb1: 27911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 28911991d2SPhilip Reames; EPILOG: loop_exiting_bb2: 29911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 30911991d2SPhilip Reames; EPILOG: exit3.loopexit: 31911991d2SPhilip Reames; EPILOG-NEXT: br label %exit3 32911991d2SPhilip Reames; EPILOG: exit3.loopexit2: 33911991d2SPhilip Reames; EPILOG-NEXT: br label %exit3 34911991d2SPhilip Reames; EPILOG: exit3: 35911991d2SPhilip Reames; EPILOG-NEXT: ret void 36911991d2SPhilip Reames; EPILOG: loop_latch: 37911991d2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3837ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 39911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 40911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.1: 41911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 42911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.1: 43911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 44911991d2SPhilip Reames; EPILOG: loop_latch.1: 45911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 4637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 47911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 48911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.2: 49911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 50911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.2: 51911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 52911991d2SPhilip Reames; EPILOG: loop_latch.2: 53911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 5437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 55911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 56911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.3: 57911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 58911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.3: 59911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 60911991d2SPhilip Reames; EPILOG: loop_latch.3: 61911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 6237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 63911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 64911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.4: 65911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 66911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.4: 67911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 68911991d2SPhilip Reames; EPILOG: loop_latch.4: 69911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 7037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 71911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 72911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.5: 73911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 74911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.5: 75911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 76911991d2SPhilip Reames; EPILOG: loop_latch.5: 77911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 7837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 79911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 80911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.6: 81911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 82911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.6: 83911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 84911991d2SPhilip Reames; EPILOG: loop_latch.6: 85911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 8637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 87911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 88911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.7: 89911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 90911991d2SPhilip Reames; EPILOG: loop_exiting_bb2.7: 91911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 92cee313d2SEric Christopher; EPILOG: loop_latch.7: 93911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 9437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 9537ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 96911991d2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 97de2fed61SPhilip Reames; EPILOG: exit1.loopexit: 98de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 99de2fed61SPhilip Reames; EPILOG: exit1.loopexit1: 100de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 101de2fed61SPhilip Reames; EPILOG: exit1: 102de2fed61SPhilip Reames; EPILOG-NEXT: ret void 103de2fed61SPhilip Reames; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 104de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 105de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 106de2fed61SPhilip Reames; EPILOG: exit2.loopexit.unr-lcssa: 107de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 108de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 109de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 110de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 111de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 112de2fed61SPhilip Reames; EPILOG: loop_header.epil: 113de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 11437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 115de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 116de2fed61SPhilip Reames; EPILOG: loop_exiting_bb1.epil: 117de2fed61SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1 118de2fed61SPhilip Reames; EPILOG: loop_exiting_bb2.epil: 119de2fed61SPhilip Reames; EPILOG-NEXT: br i1 false, label %loop_latch.epil, label %exit3.loopexit2 120de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 121de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 122de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 12337ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 12437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 125de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0 126de2fed61SPhilip Reames; EPILOG: exit2.loopexit.epilog-lcssa: 127de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.loopexit 128de2fed61SPhilip Reames; EPILOG: exit2.loopexit: 129de2fed61SPhilip Reames; EPILOG-NEXT: ret void 130911991d2SPhilip Reames; 131911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test1( 132911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 133*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 134*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 135*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 136*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 137323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 138911991d2SPhilip Reames; EPILOG-BLOCK: entry.new: 139*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 140911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 141911991d2SPhilip Reames; EPILOG-BLOCK: loop_header: 142911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 14337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 144911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 145911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1: 146911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 147911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2: 148911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 149911991d2SPhilip Reames; EPILOG-BLOCK: exit3.loopexit: 150911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit3 151911991d2SPhilip Reames; EPILOG-BLOCK: exit3: 152911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 153911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch: 154911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 15537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 156911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 157de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1.1: 158de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 159de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.1: 160de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 161de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 162de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 16337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 16437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 165de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0 166911991d2SPhilip Reames; EPILOG-BLOCK: exit1.loopexit: 167911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 168911991d2SPhilip Reames; EPILOG-BLOCK: exit1: 169911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 170911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 171911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 172911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 173911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 174911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 175911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 176911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 177911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 178911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil 179911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1.epil: 180911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.epil, label %exit1 181911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.epil: 182911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loop_latch.epil, label %exit3 183911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 184911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 185911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit: 186911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 187911991d2SPhilip Reames; 188911991d2SPhilip Reames; PROLOG-LABEL: @test1( 189cee313d2SEric Christopher; PROLOG-NEXT: entry: 190*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 191*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 192*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 193911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 194*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 195911991d2SPhilip Reames; PROLOG: loop_header.prol.preheader: 196911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 197cee313d2SEric Christopher; PROLOG: loop_header.prol: 198cee313d2SEric Christopher; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 19937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 200cee313d2SEric Christopher; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 201911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.prol: 202911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1 203911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.prol: 204911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.prol, label %exit3.loopexit2 205cee313d2SEric Christopher; PROLOG: loop_latch.prol: 206cee313d2SEric Christopher; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 207911991d2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 20837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 20937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 210911991d2SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0 211911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 212911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 213911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 214911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 215911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 216*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 217323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 218911991d2SPhilip Reames; PROLOG: entry.new: 219911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header 220911991d2SPhilip Reames; PROLOG: loop_header: 221911991d2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 222911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 223911991d2SPhilip Reames; PROLOG: loop_exiting_bb1: 224911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 225911991d2SPhilip Reames; PROLOG: loop_exiting_bb2: 226911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 227911991d2SPhilip Reames; PROLOG: exit3.loopexit: 228911991d2SPhilip Reames; PROLOG-NEXT: br label %exit3 229911991d2SPhilip Reames; PROLOG: exit3.loopexit2: 230911991d2SPhilip Reames; PROLOG-NEXT: br label %exit3 231911991d2SPhilip Reames; PROLOG: exit3: 232911991d2SPhilip Reames; PROLOG-NEXT: ret void 233911991d2SPhilip Reames; PROLOG: loop_latch: 234911991d2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 235911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 236911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.1: 237911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 238911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.1: 239911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 240911991d2SPhilip Reames; PROLOG: loop_latch.1: 241911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 242911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2 243911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.2: 244911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit 245911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.2: 246911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.2, label %exit3.loopexit 247911991d2SPhilip Reames; PROLOG: loop_latch.2: 248911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 249911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3 250911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.3: 251911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit 252911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.3: 253911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.3, label %exit3.loopexit 254911991d2SPhilip Reames; PROLOG: loop_latch.3: 255911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 256911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4 257911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.4: 258911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit 259911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.4: 260911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.4, label %exit3.loopexit 261911991d2SPhilip Reames; PROLOG: loop_latch.4: 262911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 263911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5 264911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.5: 265911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit 266911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.5: 267911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.5, label %exit3.loopexit 268911991d2SPhilip Reames; PROLOG: loop_latch.5: 269911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 270911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6 271911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.6: 272911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit 273911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.6: 274911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.6, label %exit3.loopexit 275911991d2SPhilip Reames; PROLOG: loop_latch.6: 276911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 277911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7 278911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.7: 279911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit 280911991d2SPhilip Reames; PROLOG: loop_exiting_bb2.7: 281911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loop_latch.7, label %exit3.loopexit 282cee313d2SEric Christopher; PROLOG: loop_latch.7: 283911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 284911991d2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 285911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 286de2fed61SPhilip Reames; PROLOG: exit1.loopexit: 287de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 288de2fed61SPhilip Reames; PROLOG: exit1.loopexit1: 289de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 290de2fed61SPhilip Reames; PROLOG: exit1: 291de2fed61SPhilip Reames; PROLOG-NEXT: ret void 292de2fed61SPhilip Reames; PROLOG: exit2.loopexit.unr-lcssa: 293de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit2.loopexit 294de2fed61SPhilip Reames; PROLOG: exit2.loopexit: 295de2fed61SPhilip Reames; PROLOG-NEXT: ret void 296911991d2SPhilip Reames; 297911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test1( 298911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 299*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 300*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 301*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 302911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 303*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 304911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 305911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 306911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 307911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol 308911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1.prol: 309911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.prol, label %exit1 310911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.prol: 311911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.prol, label %exit3 312911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 313911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 314911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 315b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 316*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 317323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 318911991d2SPhilip Reames; PROLOG-BLOCK: entry.new: 319911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 320911991d2SPhilip Reames; PROLOG-BLOCK: loop_header: 321911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 322911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting_bb1 323911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1: 324911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2, label %exit1.loopexit 325911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2: 326911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch, label %exit3.loopexit 327911991d2SPhilip Reames; PROLOG-BLOCK: exit3.loopexit: 328911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit3 329911991d2SPhilip Reames; PROLOG-BLOCK: exit3: 330911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 331911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch: 332911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 333911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1 334911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1.1: 335911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit 336911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.1: 337911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loop_latch.1, label %exit3.loopexit 338911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 339911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 340911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 341911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0 342de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.loopexit: 343de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 344de2fed61SPhilip Reames; PROLOG-BLOCK: exit1: 345de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 346de2fed61SPhilip Reames; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 347de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 348de2fed61SPhilip Reames; PROLOG-BLOCK: exit2.loopexit: 349de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 350911991d2SPhilip Reames; 351911991d2SPhilip Reames 352cee313d2SEric Christopherentry: 353cee313d2SEric Christopher br label %loop_header 354cee313d2SEric Christopher 355cee313d2SEric Christopherloop_header: 356cee313d2SEric Christopher %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 357cee313d2SEric Christopher br i1 %cond, label %loop_latch, label %loop_exiting_bb1 358cee313d2SEric Christopher 359cee313d2SEric Christopherloop_exiting_bb1: 360cee313d2SEric Christopher br i1 false, label %loop_exiting_bb2, label %exit1 361cee313d2SEric Christopher 362cee313d2SEric Christopherloop_exiting_bb2: 363cee313d2SEric Christopher br i1 false, label %loop_latch, label %exit3 364cee313d2SEric Christopher 365cee313d2SEric Christopherexit3: 366cee313d2SEric Christopher ret void 367cee313d2SEric Christopher 368cee313d2SEric Christopherloop_latch: 369cee313d2SEric Christopher %iv_next = add i64 %iv, 1 370cee313d2SEric Christopher %cmp = icmp ne i64 %iv_next, %trip 371cee313d2SEric Christopher br i1 %cmp, label %loop_header, label %exit2.loopexit 372cee313d2SEric Christopher 373cee313d2SEric Christopherexit1: 374cee313d2SEric Christopher ret void 375cee313d2SEric Christopher 376cee313d2SEric Christopherexit2.loopexit: 377cee313d2SEric Christopher ret void 378cee313d2SEric Christopher} 379cee313d2SEric Christopher 380cee313d2SEric Christopher 381cee313d2SEric Christopher; test with three exiting and two exit blocks. 382cee313d2SEric Christopher; The non-latch exit block has 2 unique predecessors. 383cee313d2SEric Christopher; There are 2 values passed to the exit blocks that are calculated at every iteration. 384cee313d2SEric Christopher; %sum.02 and %add. Both of these are incoming values for phi from every exiting 385cee313d2SEric Christopher; unrolled block. 386cee313d2SEric Christopherdefine i32 @test2(i32* nocapture %a, i64 %n) { 387911991d2SPhilip Reames; EPILOG-LABEL: @test2( 388911991d2SPhilip Reames; EPILOG-NEXT: entry: 389*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 390*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 391*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 392*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 393323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new 394911991d2SPhilip Reames; EPILOG: entry.new: 395*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 396911991d2SPhilip Reames; EPILOG-NEXT: br label %header 397911991d2SPhilip Reames; EPILOG: header: 398911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 399911991d2SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ] 40037ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ] 401911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 402911991d2SPhilip Reames; EPILOG: for.exiting_block: 403911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 404911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 405911991d2SPhilip Reames; EPILOG: for.body: 406911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 407323514deSNikita Popov; EPILOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 408323514deSNikita Popov; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 409911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 41037ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 41172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 412de2fed61SPhilip Reames; EPILOG: for.exiting_block.1: 413de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 414de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 415de2fed61SPhilip Reames; EPILOG: for.body.1: 416de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 417323514deSNikita Popov; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 418323514deSNikita Popov; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 419de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 42037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 42172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 422de2fed61SPhilip Reames; EPILOG: for.exiting_block.2: 423de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 424de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 425de2fed61SPhilip Reames; EPILOG: for.body.2: 426de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 427323514deSNikita Popov; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 428323514deSNikita Popov; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 429de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 43037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 43172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 432de2fed61SPhilip Reames; EPILOG: for.exiting_block.3: 433de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 434de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 435de2fed61SPhilip Reames; EPILOG: for.body.3: 436de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 437323514deSNikita Popov; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 438323514deSNikita Popov; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 439de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 44037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 44172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 442de2fed61SPhilip Reames; EPILOG: for.exiting_block.4: 443de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 444de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 445de2fed61SPhilip Reames; EPILOG: for.body.4: 446de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 447323514deSNikita Popov; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 448323514deSNikita Popov; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 449de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 45037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 45172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 452de2fed61SPhilip Reames; EPILOG: for.exiting_block.5: 453de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 454de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 455de2fed61SPhilip Reames; EPILOG: for.body.5: 456de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 457323514deSNikita Popov; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 458323514deSNikita Popov; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 459de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 46037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 46172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 462de2fed61SPhilip Reames; EPILOG: for.exiting_block.6: 463de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 464de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 465de2fed61SPhilip Reames; EPILOG: for.body.6: 466de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 467323514deSNikita Popov; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 468323514deSNikita Popov; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 469de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 47037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 47172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 472de2fed61SPhilip Reames; EPILOG: for.exiting_block.7: 473de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 474de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 475de2fed61SPhilip Reames; EPILOG: for.body.7: 476de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 477323514deSNikita Popov; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 478323514deSNikita Popov; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 479de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 48037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 48137ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 482de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header 483911991d2SPhilip Reames; EPILOG: for.end.unr-lcssa.loopexit: 484911991d2SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ] 485911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ] 486911991d2SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ] 487911991d2SPhilip Reames; EPILOG-NEXT: br label %for.end.unr-lcssa 488911991d2SPhilip Reames; EPILOG: for.end.unr-lcssa: 489911991d2SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 490911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 491911991d2SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 492911991d2SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 493911991d2SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 494911991d2SPhilip Reames; EPILOG: header.epil.preheader: 495911991d2SPhilip Reames; EPILOG-NEXT: br label %header.epil 496911991d2SPhilip Reames; EPILOG: header.epil: 497911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 498911991d2SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ] 49937ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ] 500911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 501911991d2SPhilip Reames; EPILOG: for.exiting_block.epil: 502911991d2SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 503911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil 504911991d2SPhilip Reames; EPILOG: for.body.epil: 505911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 506323514deSNikita Popov; EPILOG-NEXT: %11 = load i32, i32* %arrayidx.epil, align 4 507323514deSNikita Popov; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 508911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 509911991d2SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 51037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 51137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 512911991d2SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2 513911991d2SPhilip Reames; EPILOG: for.end.epilog-lcssa: 514911991d2SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ] 515911991d2SPhilip Reames; EPILOG-NEXT: br label %for.end 516911991d2SPhilip Reames; EPILOG: for.end: 517911991d2SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ] 518911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %sum.0.lcssa 519cee313d2SEric Christopher; EPILOG: for.exit2.loopexit: 52072031407SPhilip Reames; EPILOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ] 521cee313d2SEric Christopher; EPILOG-NEXT: br label %for.exit2 522cee313d2SEric Christopher; EPILOG: for.exit2.loopexit2: 523cee313d2SEric Christopher; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 524cee313d2SEric Christopher; EPILOG-NEXT: br label %for.exit2 525cee313d2SEric Christopher; EPILOG: for.exit2: 526cee313d2SEric Christopher; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 527cee313d2SEric Christopher; EPILOG-NEXT: ret i32 %retval 528911991d2SPhilip Reames; 529911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test2( 530911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 531*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 532*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 533*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 534*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 535323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new 536911991d2SPhilip Reames; EPILOG-BLOCK: entry.new: 537*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 538911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 539911991d2SPhilip Reames; EPILOG-BLOCK: header: 540911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 541911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ] 54237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ] 543911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 544911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 545911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 546911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 547911991d2SPhilip Reames; EPILOG-BLOCK: for.body: 548911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 549323514deSNikita Popov; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 550323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 551911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 55237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 55372031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 554de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 555de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 556de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 557de2fed61SPhilip Reames; EPILOG-BLOCK: for.body.1: 558de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 559323514deSNikita Popov; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 560323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 561de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 56237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 56337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 564de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2 565911991d2SPhilip Reames; EPILOG-BLOCK: for.end.unr-lcssa.loopexit: 566911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ] 567911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ] 568911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ] 569911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.end.unr-lcssa 570911991d2SPhilip Reames; EPILOG-BLOCK: for.end.unr-lcssa: 571911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ] 572911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ] 573911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ] 574911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 575911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %for.end 576911991d2SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 577911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 578911991d2SPhilip Reames; EPILOG-BLOCK: header.epil: 579911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 580911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 581911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 582911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %for.body.epil 583911991d2SPhilip Reames; EPILOG-BLOCK: for.body.epil: 584b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 585323514deSNikita Popov; EPILOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.epil, align 4 586323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 587911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.end 588911991d2SPhilip Reames; EPILOG-BLOCK: for.end: 589b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ] 590911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 591911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 59272031407SPhilip Reames; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 593911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 594911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 595b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 596911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %retval 597911991d2SPhilip Reames; 598911991d2SPhilip Reames; PROLOG-LABEL: @test2( 599911991d2SPhilip Reames; PROLOG-NEXT: entry: 600*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 601*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 602*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 603911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 604*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 605911991d2SPhilip Reames; PROLOG: header.prol.preheader: 606911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol 607911991d2SPhilip Reames; PROLOG: header.prol: 608911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 609911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ] 61037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ] 611911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 612911991d2SPhilip Reames; PROLOG: for.exiting_block.prol: 613911991d2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 614911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol 615911991d2SPhilip Reames; PROLOG: for.body.prol: 616911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 617323514deSNikita Popov; PROLOG-NEXT: %2 = load i32, i32* %arrayidx.prol, align 4 618323514deSNikita Popov; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 619911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 620911991d2SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 62137ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 62237ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 623911991d2SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2 624911991d2SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 625911991d2SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 626911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ] 627911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ] 628911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 629911991d2SPhilip Reames; PROLOG: header.prol.loopexit: 630911991d2SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 631911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 632911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 633*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 634323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %for.end, label %entry.new 635911991d2SPhilip Reames; PROLOG: entry.new: 636911991d2SPhilip Reames; PROLOG-NEXT: br label %header 637911991d2SPhilip Reames; PROLOG: header: 638911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] 639911991d2SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ] 640911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 641911991d2SPhilip Reames; PROLOG: for.exiting_block: 642911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 643911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 644911991d2SPhilip Reames; PROLOG: for.body: 645911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 646323514deSNikita Popov; PROLOG-NEXT: %4 = load i32, i32* %arrayidx, align 4 647323514deSNikita Popov; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 648911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 64972031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 650911991d2SPhilip Reames; PROLOG: for.exiting_block.1: 651911991d2SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 652911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 653911991d2SPhilip Reames; PROLOG: for.body.1: 654911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 655323514deSNikita Popov; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 656323514deSNikita Popov; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 657911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 65872031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 659911991d2SPhilip Reames; PROLOG: for.exiting_block.2: 660911991d2SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 661911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2 662911991d2SPhilip Reames; PROLOG: for.body.2: 663911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 664323514deSNikita Popov; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.2, align 4 665323514deSNikita Popov; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 666911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 66772031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 668911991d2SPhilip Reames; PROLOG: for.exiting_block.3: 669911991d2SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 670911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3 671911991d2SPhilip Reames; PROLOG: for.body.3: 672911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 673323514deSNikita Popov; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.3, align 4 674323514deSNikita Popov; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 675911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 67672031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 677911991d2SPhilip Reames; PROLOG: for.exiting_block.4: 678911991d2SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 679911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4 680911991d2SPhilip Reames; PROLOG: for.body.4: 681911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 682323514deSNikita Popov; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.4, align 4 683323514deSNikita Popov; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 684911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 68572031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 686911991d2SPhilip Reames; PROLOG: for.exiting_block.5: 687911991d2SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 688911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5 689911991d2SPhilip Reames; PROLOG: for.body.5: 690911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 691323514deSNikita Popov; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.5, align 4 692323514deSNikita Popov; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 693911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 69472031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 695911991d2SPhilip Reames; PROLOG: for.exiting_block.6: 696911991d2SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 697911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6 698911991d2SPhilip Reames; PROLOG: for.body.6: 699911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 700323514deSNikita Popov; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.6, align 4 701323514deSNikita Popov; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 702911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 70372031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 704911991d2SPhilip Reames; PROLOG: for.exiting_block.7: 705911991d2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 706911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7 707911991d2SPhilip Reames; PROLOG: for.body.7: 708911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 709323514deSNikita Popov; PROLOG-NEXT: %11 = load i32, i32* %arrayidx.7, align 4 710323514deSNikita Popov; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 711911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 712911991d2SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 713911991d2SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %for.end.unr-lcssa, label %header 714de2fed61SPhilip Reames; PROLOG: for.end.unr-lcssa: 715de2fed61SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ] 716de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.end 717de2fed61SPhilip Reames; PROLOG: for.end: 718de2fed61SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 719de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %sum.0.lcssa 720de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 72172031407SPhilip Reames; PROLOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ] 722de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 723de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit1: 724de2fed61SPhilip Reames; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 725de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 726de2fed61SPhilip Reames; PROLOG: for.exit2: 727de2fed61SPhilip Reames; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 728de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %retval 729911991d2SPhilip Reames; 730911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test2( 731911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 732*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 733*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 734*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 735911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 736*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 737911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 738911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 739911991d2SPhilip Reames; PROLOG-BLOCK: header.prol: 740911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 741911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 742911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 743911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %for.body.prol 744911991d2SPhilip Reames; PROLOG-BLOCK: for.body.prol: 745323514deSNikita Popov; PROLOG-BLOCK-NEXT: %2 = load i32, i32* %a, align 4 746911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 747911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 748323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %2, %for.body.prol ] 749b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ] 750323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ] 751*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 752323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %for.end, label %entry.new 753911991d2SPhilip Reames; PROLOG-BLOCK: entry.new: 754911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 755911991d2SPhilip Reames; PROLOG-BLOCK: header: 756911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ] 757911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ] 758911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 759911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 760911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 761911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %for.body 762911991d2SPhilip Reames; PROLOG-BLOCK: for.body: 763911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 764323514deSNikita Popov; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx, align 4 765323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 766911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 76772031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 768de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 769de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 770de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1 771de2fed61SPhilip Reames; PROLOG-BLOCK: for.body.1: 772de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 773323514deSNikita Popov; PROLOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 774323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 775de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 776de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 777de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2 778911991d2SPhilip Reames; PROLOG-BLOCK: for.end.unr-lcssa: 779911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ] 780911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.end 781911991d2SPhilip Reames; PROLOG-BLOCK: for.end: 782911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ] 783911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 784911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 78572031407SPhilip Reames; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ] 786911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 787911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 788911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 789911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %retval 790911991d2SPhilip Reames; 791911991d2SPhilip Reames 792cee313d2SEric Christopher 793cee313d2SEric Christopherentry: 794cee313d2SEric Christopher br label %header 795cee313d2SEric Christopher 796cee313d2SEric Christopherheader: 797cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 798cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] 799cee313d2SEric Christopher br i1 false, label %for.exit2, label %for.exiting_block 800cee313d2SEric Christopher 801cee313d2SEric Christopherfor.exiting_block: 802cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 803cee313d2SEric Christopher br i1 %cmp, label %for.exit2, label %for.body 804cee313d2SEric Christopher 805cee313d2SEric Christopherfor.body: 806cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 807cee313d2SEric Christopher %0 = load i32, i32* %arrayidx, align 4 808cee313d2SEric Christopher %add = add nsw i32 %0, %sum.02 809cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 810cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 811cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %header 812cee313d2SEric Christopher 813cee313d2SEric Christopherfor.end: ; preds = %for.body 814cee313d2SEric Christopher %sum.0.lcssa = phi i32 [ %add, %for.body ] 815cee313d2SEric Christopher ret i32 %sum.0.lcssa 816cee313d2SEric Christopher 817cee313d2SEric Christopherfor.exit2: 818cee313d2SEric Christopher %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 819cee313d2SEric Christopher ret i32 %retval 820cee313d2SEric Christopher} 821cee313d2SEric Christopher 822cee313d2SEric Christopher; test with two exiting and three exit blocks. 823cee313d2SEric Christopher; the non-latch exiting block has a switch. 824cee313d2SEric Christopherdefine void @test3(i64 %trip, i64 %add) { 825911991d2SPhilip Reames; EPILOG-LABEL: @test3( 826cee313d2SEric Christopher; EPILOG-NEXT: entry: 827*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 828*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 829*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 830*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 831323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 832cee313d2SEric Christopher; EPILOG: entry.new: 833*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 834911991d2SPhilip Reames; EPILOG-NEXT: br label %loop_header 835cee313d2SEric Christopher; EPILOG: loop_header: 836911991d2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 837cee313d2SEric Christopher; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 83837ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 839911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 840911991d2SPhilip Reames; EPILOG: loop_exiting_bb1: 841911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 842911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 843911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 844911991d2SPhilip Reames; EPILOG-NEXT: ] 845911991d2SPhilip Reames; EPILOG: exit3.loopexit: 846911991d2SPhilip Reames; EPILOG-NEXT: br label %exit3 847911991d2SPhilip Reames; EPILOG: exit3.loopexit2: 848911991d2SPhilip Reames; EPILOG-NEXT: br label %exit3 849911991d2SPhilip Reames; EPILOG: exit3: 850911991d2SPhilip Reames; EPILOG-NEXT: ret void 851911991d2SPhilip Reames; EPILOG: loop_latch: 852911991d2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 853911991d2SPhilip Reames; EPILOG-NEXT: %sum.next = add i64 %sum, %add 85437ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 855911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 856911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.1: 857911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 858911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 859911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 860911991d2SPhilip Reames; EPILOG-NEXT: ] 861911991d2SPhilip Reames; EPILOG: loop_latch.1: 862911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 863911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 86437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 865911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 866911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.2: 867911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 868911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 869911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 870911991d2SPhilip Reames; EPILOG-NEXT: ] 871911991d2SPhilip Reames; EPILOG: loop_latch.2: 872911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 873911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 87437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 875911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 876911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.3: 877911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 878911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 879911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 880911991d2SPhilip Reames; EPILOG-NEXT: ] 881911991d2SPhilip Reames; EPILOG: loop_latch.3: 882911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 883911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 88437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 885911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 886911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.4: 887911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 888911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 889911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 890911991d2SPhilip Reames; EPILOG-NEXT: ] 891911991d2SPhilip Reames; EPILOG: loop_latch.4: 892911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 893911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 89437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 895911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 896911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.5: 897911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 898911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 899911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 900911991d2SPhilip Reames; EPILOG-NEXT: ] 901911991d2SPhilip Reames; EPILOG: loop_latch.5: 902911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 903911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 90437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 905911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 906911991d2SPhilip Reames; EPILOG: loop_exiting_bb1.6: 907911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 908911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 909911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 910911991d2SPhilip Reames; EPILOG-NEXT: ] 911911991d2SPhilip Reames; EPILOG: loop_latch.6: 912911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 913911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 91437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 915911991d2SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 916cee313d2SEric Christopher; EPILOG: loop_exiting_bb1.7: 917911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 918911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 919911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit 920911991d2SPhilip Reames; EPILOG-NEXT: ] 921cee313d2SEric Christopher; EPILOG: loop_latch.7: 922911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 923cee313d2SEric Christopher; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 92437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 92537ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 926911991d2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit 927de2fed61SPhilip Reames; EPILOG: exit1.loopexit: 928de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 929de2fed61SPhilip Reames; EPILOG: exit1.loopexit1: 930de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 931de2fed61SPhilip Reames; EPILOG: exit1: 932de2fed61SPhilip Reames; EPILOG-NEXT: ret void 933de2fed61SPhilip Reames; EPILOG: exit2.loopexit.unr-lcssa.loopexit: 934de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 935de2fed61SPhilip Reames; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 936de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.loopexit.unr-lcssa 937de2fed61SPhilip Reames; EPILOG: exit2.loopexit.unr-lcssa: 938de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 939de2fed61SPhilip Reames; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 940de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 941de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 942de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 943de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 944de2fed61SPhilip Reames; EPILOG: loop_header.epil: 945de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 946de2fed61SPhilip Reames; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 94737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 948de2fed61SPhilip Reames; EPILOG-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 949de2fed61SPhilip Reames; EPILOG: loop_exiting_bb1.epil: 950de2fed61SPhilip Reames; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 951de2fed61SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit1 952de2fed61SPhilip Reames; EPILOG-NEXT: i64 42, label %exit3.loopexit2 953de2fed61SPhilip Reames; EPILOG-NEXT: ] 954de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 955de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 956de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 957de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 95837ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 95937ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 960de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3 961de2fed61SPhilip Reames; EPILOG: exit2.loopexit.epilog-lcssa: 962de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.loopexit 963de2fed61SPhilip Reames; EPILOG: exit2.loopexit: 964de2fed61SPhilip Reames; EPILOG-NEXT: ret void 965911991d2SPhilip Reames; 966911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test3( 967911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 968*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 969*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 970*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 971*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 972323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new 973911991d2SPhilip Reames; EPILOG-BLOCK: entry.new: 974*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 975911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 976911991d2SPhilip Reames; EPILOG-BLOCK: loop_header: 977911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 978911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 97937ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 980911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 981911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1: 982911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 983911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 984911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 985911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ] 986911991d2SPhilip Reames; EPILOG-BLOCK: exit3.loopexit: 987911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit3 988911991d2SPhilip Reames; EPILOG-BLOCK: exit3: 989911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 990911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch: 991911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 992911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 99337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 994911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 995de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1.1: 996de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 997de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 998de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 999de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: ] 1000de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 1001de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1002de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 100337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 100437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 1005de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3 1006911991d2SPhilip Reames; EPILOG-BLOCK: exit1.loopexit: 1007911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 1008911991d2SPhilip Reames; EPILOG-BLOCK: exit1: 1009911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 1010911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit.unr-lcssa.loopexit: 1011911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 1012911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.loopexit.unr-lcssa 1013911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit.unr-lcssa: 1014911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ] 1015911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1016911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit 1017911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 1018911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 1019911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 1020911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil 1021911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb1.epil: 1022b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 1023911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1 1024911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit3 1025911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ] 1026911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 1027911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.loopexit 1028911991d2SPhilip Reames; EPILOG-BLOCK: exit2.loopexit: 1029911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 1030911991d2SPhilip Reames; 1031911991d2SPhilip Reames; PROLOG-LABEL: @test3( 1032cee313d2SEric Christopher; PROLOG-NEXT: entry: 1033*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 1034*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 1035*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 1036911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1037*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 1038911991d2SPhilip Reames; PROLOG: loop_header.prol.preheader: 1039911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 1040911991d2SPhilip Reames; PROLOG: loop_header.prol: 1041911991d2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 1042911991d2SPhilip Reames; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 104337ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 1044911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol 1045911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.prol: 1046911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 1047911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit1 1048911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit2 1049911991d2SPhilip Reames; PROLOG-NEXT: ] 1050911991d2SPhilip Reames; PROLOG: loop_latch.prol: 1051911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 1052911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 1053911991d2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 105437ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 105537ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 1056911991d2SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3 1057911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 1058911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 1059911991d2SPhilip Reames; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 1060911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 1061911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 1062911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1063911991d2SPhilip Reames; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 1064*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 1065323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 1066911991d2SPhilip Reames; PROLOG: entry.new: 1067911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header 1068cee313d2SEric Christopher; PROLOG: loop_header: 1069cee313d2SEric Christopher; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 1070cee313d2SEric Christopher; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 1071911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1072911991d2SPhilip Reames; PROLOG: loop_exiting_bb1: 1073911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 1074911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1075911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1076911991d2SPhilip Reames; PROLOG-NEXT: ] 1077911991d2SPhilip Reames; PROLOG: exit3.loopexit: 1078911991d2SPhilip Reames; PROLOG-NEXT: br label %exit3 1079911991d2SPhilip Reames; PROLOG: exit3.loopexit2: 1080911991d2SPhilip Reames; PROLOG-NEXT: br label %exit3 1081911991d2SPhilip Reames; PROLOG: exit3: 1082911991d2SPhilip Reames; PROLOG-NEXT: ret void 1083911991d2SPhilip Reames; PROLOG: loop_latch: 1084911991d2SPhilip Reames; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1085911991d2SPhilip Reames; PROLOG-NEXT: %sum.next = add i64 %sum, %add 1086911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1087911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.1: 1088911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1089911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1090911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1091911991d2SPhilip Reames; PROLOG-NEXT: ] 1092911991d2SPhilip Reames; PROLOG: loop_latch.1: 1093911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1094911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 1095911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2 1096911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.2: 1097911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 1098911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1099911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1100911991d2SPhilip Reames; PROLOG-NEXT: ] 1101911991d2SPhilip Reames; PROLOG: loop_latch.2: 1102911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 1103911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 1104911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3 1105911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.3: 1106911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 1107911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1108911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1109911991d2SPhilip Reames; PROLOG-NEXT: ] 1110911991d2SPhilip Reames; PROLOG: loop_latch.3: 1111911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 1112911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 1113911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4 1114911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.4: 1115911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 1116911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1117911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1118911991d2SPhilip Reames; PROLOG-NEXT: ] 1119911991d2SPhilip Reames; PROLOG: loop_latch.4: 1120911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 1121911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 1122911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5 1123911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.5: 1124911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 1125911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1126911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1127911991d2SPhilip Reames; PROLOG-NEXT: ] 1128911991d2SPhilip Reames; PROLOG: loop_latch.5: 1129911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 1130911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 1131911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6 1132911991d2SPhilip Reames; PROLOG: loop_exiting_bb1.6: 1133911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 1134911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1135911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1136911991d2SPhilip Reames; PROLOG-NEXT: ] 1137911991d2SPhilip Reames; PROLOG: loop_latch.6: 1138911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 1139911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 1140911991d2SPhilip Reames; PROLOG-NEXT: br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7 1141cee313d2SEric Christopher; PROLOG: loop_exiting_bb1.7: 1142911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 1143911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 1144911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit3.loopexit 1145911991d2SPhilip Reames; PROLOG-NEXT: ] 1146cee313d2SEric Christopher; PROLOG: loop_latch.7: 1147911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 1148cee313d2SEric Christopher; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 1149911991d2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 1150911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa 1151de2fed61SPhilip Reames; PROLOG: exit1.loopexit: 1152de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 1153de2fed61SPhilip Reames; PROLOG: exit1.loopexit1: 1154de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 1155de2fed61SPhilip Reames; PROLOG: exit1: 1156de2fed61SPhilip Reames; PROLOG-NEXT: ret void 1157de2fed61SPhilip Reames; PROLOG: exit2.loopexit.unr-lcssa: 1158de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit2.loopexit 1159de2fed61SPhilip Reames; PROLOG: exit2.loopexit: 1160de2fed61SPhilip Reames; PROLOG-NEXT: ret void 1161911991d2SPhilip Reames; 1162911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test3( 1163911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 1164*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 1165*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 1166*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1167911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1168*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 1169911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 1170911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 1171911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 1172911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol 1173911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1.prol: 1174911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 1175911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1 1176911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit3 1177911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ] 1178911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 1179911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 1180911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 1181b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 1182b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 1183*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1184323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new 1185911991d2SPhilip Reames; PROLOG-BLOCK: entry.new: 1186911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 1187911991d2SPhilip Reames; PROLOG-BLOCK: loop_header: 1188911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 1189911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 1190911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch, label %loop_exiting_bb1 1191911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1: 1192911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 1193911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1194911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1195911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ] 1196911991d2SPhilip Reames; PROLOG-BLOCK: exit3.loopexit: 1197911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit3 1198911991d2SPhilip Reames; PROLOG-BLOCK: exit3: 1199911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 1200911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch: 1201911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 1202911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 1203911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1 1204911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb1.1: 1205911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 1206911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 1207911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit3.loopexit 1208911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ] 1209911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 1210911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 1211911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 1212911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 1213911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3 1214de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.loopexit: 1215de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 1216de2fed61SPhilip Reames; PROLOG-BLOCK: exit1: 1217de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 1218de2fed61SPhilip Reames; PROLOG-BLOCK: exit2.loopexit.unr-lcssa: 1219de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit2.loopexit 1220de2fed61SPhilip Reames; PROLOG-BLOCK: exit2.loopexit: 1221de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 1222911991d2SPhilip Reames; 1223911991d2SPhilip Reames 1224cee313d2SEric Christopherentry: 1225cee313d2SEric Christopher br label %loop_header 1226cee313d2SEric Christopher 1227cee313d2SEric Christopherloop_header: 1228cee313d2SEric Christopher %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 1229cee313d2SEric Christopher %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 1230cee313d2SEric Christopher br i1 undef, label %loop_latch, label %loop_exiting_bb1 1231cee313d2SEric Christopher 1232cee313d2SEric Christopherloop_exiting_bb1: 1233cee313d2SEric Christopher switch i64 %sum, label %loop_latch [ 1234cee313d2SEric Christopher i64 24, label %exit1 1235cee313d2SEric Christopher i64 42, label %exit3 1236cee313d2SEric Christopher ] 1237cee313d2SEric Christopher 1238cee313d2SEric Christopherexit3: 1239cee313d2SEric Christopher ret void 1240cee313d2SEric Christopher 1241cee313d2SEric Christopherloop_latch: 1242cee313d2SEric Christopher %iv_next = add nuw nsw i64 %iv, 1 1243cee313d2SEric Christopher %sum.next = add i64 %sum, %add 1244cee313d2SEric Christopher %cmp = icmp ne i64 %iv_next, %trip 1245cee313d2SEric Christopher br i1 %cmp, label %loop_header, label %exit2.loopexit 1246cee313d2SEric Christopher 1247cee313d2SEric Christopherexit1: 1248cee313d2SEric Christopher ret void 1249cee313d2SEric Christopher 1250cee313d2SEric Christopherexit2.loopexit: 1251cee313d2SEric Christopher ret void 1252cee313d2SEric Christopher} 1253cee313d2SEric Christopher 1254cee313d2SEric Christopher; FIXME: Support multiple exiting blocks to the same latch exit block. 1255cee313d2SEric Christopher; Three exiting blocks where header and latch exit to same LatchExit. 1256cee313d2SEric Christopherdefine i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { 1257911991d2SPhilip Reames; EPILOG-LABEL: @hdr_latch_same_exit( 1258911991d2SPhilip Reames; EPILOG-NEXT: entry: 1259*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 1260*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 1261*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 1262*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 1263323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 126494d09142SPhilip Reames; EPILOG: entry.new: 1265*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1266911991d2SPhilip Reames; EPILOG-NEXT: br label %header 1267911991d2SPhilip Reames; EPILOG: header: 126894d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 126994d09142SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 127037ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 127194d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block 1272911991d2SPhilip Reames; EPILOG: for.exiting_block: 1273911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 127494d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1275911991d2SPhilip Reames; EPILOG: latch: 1276911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1277323514deSNikita Popov; EPILOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 1278323514deSNikita Popov; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 127994d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 128037ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 128172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1282de2fed61SPhilip Reames; EPILOG: for.exiting_block.1: 1283de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1284de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1285de2fed61SPhilip Reames; EPILOG: latch.1: 1286de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1287323514deSNikita Popov; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1288323514deSNikita Popov; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 1289de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 129037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 129172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2 1292de2fed61SPhilip Reames; EPILOG: for.exiting_block.2: 1293de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1294de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 1295de2fed61SPhilip Reames; EPILOG: latch.2: 1296de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1297323514deSNikita Popov; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1298323514deSNikita Popov; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1299de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 130037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 130172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3 1302de2fed61SPhilip Reames; EPILOG: for.exiting_block.3: 1303de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1304de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 1305de2fed61SPhilip Reames; EPILOG: latch.3: 1306de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1307323514deSNikita Popov; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1308323514deSNikita Popov; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1309de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 131037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 131172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4 1312de2fed61SPhilip Reames; EPILOG: for.exiting_block.4: 1313de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1314de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 1315de2fed61SPhilip Reames; EPILOG: latch.4: 1316de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1317323514deSNikita Popov; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1318323514deSNikita Popov; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1319de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 132037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 132172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5 1322de2fed61SPhilip Reames; EPILOG: for.exiting_block.5: 1323de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1324de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 1325de2fed61SPhilip Reames; EPILOG: latch.5: 1326de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1327323514deSNikita Popov; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1328323514deSNikita Popov; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1329de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 133037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 133172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6 1332de2fed61SPhilip Reames; EPILOG: for.exiting_block.6: 1333de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1334de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 1335de2fed61SPhilip Reames; EPILOG: latch.6: 1336de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1337323514deSNikita Popov; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 1338323514deSNikita Popov; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1339de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 134037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 134172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7 1342de2fed61SPhilip Reames; EPILOG: for.exiting_block.7: 1343de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1344de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 1345de2fed61SPhilip Reames; EPILOG: latch.7: 1346de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1347323514deSNikita Popov; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 1348323514deSNikita Popov; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1349de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 135037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 135137ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1352de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 135394d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa.loopexit: 135494d09142SPhilip Reames; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 135594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 135694d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 135794d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.unr-lcssa 135894d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa: 135994d09142SPhilip Reames; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 136094d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 136194d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 136294d09142SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 136394d09142SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 136494d09142SPhilip Reames; EPILOG: header.epil.preheader: 136594d09142SPhilip Reames; EPILOG-NEXT: br label %header.epil 136694d09142SPhilip Reames; EPILOG: header.epil: 136794d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 136894d09142SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 136937ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 137094d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil 137194d09142SPhilip Reames; EPILOG: for.exiting_block.epil: 137294d09142SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 137394d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil 137494d09142SPhilip Reames; EPILOG: latch.epil: 137594d09142SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1376323514deSNikita Popov; EPILOG-NEXT: %11 = load i32, i32* %arrayidx.epil, align 4 1377323514deSNikita Popov; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 137894d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 137994d09142SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 138037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 138137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 138294d09142SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4 138394d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit: 138472031407SPhilip Reames; EPILOG-NEXT: %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ] 138594d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 138694d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit2: 138794d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ] 138894d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 138994d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa: 139094d09142SPhilip Reames; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 139194d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit 1392911991d2SPhilip Reames; EPILOG: latchExit: 139394d09142SPhilip Reames; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1394911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %result 139594d09142SPhilip Reames; EPILOG: for.exit2.loopexit: 139694d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 139794d09142SPhilip Reames; EPILOG: for.exit2.loopexit4: 139894d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 1399911991d2SPhilip Reames; EPILOG: for.exit2: 1400911991d2SPhilip Reames; EPILOG-NEXT: ret i32 42 1401911991d2SPhilip Reames; 1402911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit( 1403911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 1404*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 1405*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 1406*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1407*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1408323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 140994d09142SPhilip Reames; EPILOG-BLOCK: entry.new: 1410*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1411911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 1412911991d2SPhilip Reames; EPILOG-BLOCK: header: 141394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 141494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 141537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 141694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block 1417911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 1418911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 141994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1420911991d2SPhilip Reames; EPILOG-BLOCK: latch: 1421911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1422323514deSNikita Popov; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 1423323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1424911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 142537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 142672031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1 1427de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 1428de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1429de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1430de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 1431de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1432323514deSNikita Popov; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1433323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1434de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 143537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 143637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1437de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 143894d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 143994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 144094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 144194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 144294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 144394d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa: 144494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 144594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 144694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 144794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 144894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 144994d09142SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 145094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 145194d09142SPhilip Reames; EPILOG-BLOCK: header.epil: 145294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil 145394d09142SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 145494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 145594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 145694d09142SPhilip Reames; EPILOG-BLOCK: latch.epil: 1457b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 1458323514deSNikita Popov; EPILOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.epil, align 4 1459323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 146094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 146194d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 146272031407SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ] 146394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 146494d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa: 146594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 146694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit 1467911991d2SPhilip Reames; EPILOG-BLOCK: latchExit: 146894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1469911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %result 147094d09142SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 147194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 1472911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 1473911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 42 1474911991d2SPhilip Reames; 1475911991d2SPhilip Reames; PROLOG-LABEL: @hdr_latch_same_exit( 1476911991d2SPhilip Reames; PROLOG-NEXT: entry: 1477*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 1478*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 1479*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 148017b9cb18SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1481*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 148217b9cb18SPhilip Reames; PROLOG: header.prol.preheader: 148317b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol 148417b9cb18SPhilip Reames; PROLOG: header.prol: 148517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 148617b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 148737ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 148817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol 148917b9cb18SPhilip Reames; PROLOG: for.exiting_block.prol: 149017b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 149117b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol 149217b9cb18SPhilip Reames; PROLOG: latch.prol: 149317b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 1494323514deSNikita Popov; PROLOG-NEXT: %2 = load i32, i32* %arrayidx.prol, align 4 1495323514deSNikita Popov; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 149617b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 149717b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 149837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 149937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 150017b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4 150117b9cb18SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 150217b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 150317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 150417b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 150517b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 150617b9cb18SPhilip Reames; PROLOG: header.prol.loopexit: 150717b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 150817b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 150917b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1510*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 1511323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 151217b9cb18SPhilip Reames; PROLOG: entry.new: 1513911991d2SPhilip Reames; PROLOG-NEXT: br label %header 1514911991d2SPhilip Reames; PROLOG: header: 151517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 151617b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 151717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1518911991d2SPhilip Reames; PROLOG: for.exiting_block: 1519911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 152017b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1521911991d2SPhilip Reames; PROLOG: latch: 1522911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1523323514deSNikita Popov; PROLOG-NEXT: %4 = load i32, i32* %arrayidx, align 4 1524323514deSNikita Popov; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 1525911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 152672031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 152717b9cb18SPhilip Reames; PROLOG: for.exiting_block.1: 152817b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 152917b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 153017b9cb18SPhilip Reames; PROLOG: latch.1: 153117b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1532323514deSNikita Popov; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 1533323514deSNikita Popov; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 153417b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 153572031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2 153617b9cb18SPhilip Reames; PROLOG: for.exiting_block.2: 153717b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 153817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 153917b9cb18SPhilip Reames; PROLOG: latch.2: 154017b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1541323514deSNikita Popov; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.2, align 4 1542323514deSNikita Popov; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 154317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 154472031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3 154517b9cb18SPhilip Reames; PROLOG: for.exiting_block.3: 154617b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 154717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 154817b9cb18SPhilip Reames; PROLOG: latch.3: 154917b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1550323514deSNikita Popov; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.3, align 4 1551323514deSNikita Popov; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 155217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 155372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4 155417b9cb18SPhilip Reames; PROLOG: for.exiting_block.4: 155517b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 155617b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 155717b9cb18SPhilip Reames; PROLOG: latch.4: 155817b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1559323514deSNikita Popov; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.4, align 4 1560323514deSNikita Popov; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 156117b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 156272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5 156317b9cb18SPhilip Reames; PROLOG: for.exiting_block.5: 156417b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 156517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 156617b9cb18SPhilip Reames; PROLOG: latch.5: 156717b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1568323514deSNikita Popov; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.5, align 4 1569323514deSNikita Popov; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 157017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 157172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6 157217b9cb18SPhilip Reames; PROLOG: for.exiting_block.6: 157317b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 157417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 157517b9cb18SPhilip Reames; PROLOG: latch.6: 157617b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1577323514deSNikita Popov; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.6, align 4 1578323514deSNikita Popov; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 157917b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 158072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7 158117b9cb18SPhilip Reames; PROLOG: for.exiting_block.7: 158217b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 158317b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 158417b9cb18SPhilip Reames; PROLOG: latch.7: 158517b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1586323514deSNikita Popov; PROLOG-NEXT: %11 = load i32, i32* %arrayidx.7, align 4 1587323514deSNikita Popov; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 158817b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 158917b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 159017b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 1591de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit: 159272031407SPhilip Reames; PROLOG-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ], [ %add.7, %latch.7 ] 1593de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 1594de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit1: 1595de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph2 = phi i32 [ 0, %header.prol ] 1596de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 1597de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa: 1598de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 1599de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit 1600de2fed61SPhilip Reames; PROLOG: latchExit: 1601de2fed61SPhilip Reames; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1602de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %result 1603de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 1604de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 1605de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit3: 1606de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 1607de2fed61SPhilip Reames; PROLOG: for.exit2: 1608de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 42 1609911991d2SPhilip Reames; 1610911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit( 1611911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 1612*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 1613*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 1614*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 161517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1616*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 161717b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 161817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 161917b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol: 162017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol 162117b9cb18SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 162217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 162317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 162417b9cb18SPhilip Reames; PROLOG-BLOCK: latch.prol: 1625323514deSNikita Popov; PROLOG-BLOCK-NEXT: %2 = load i32, i32* %a, align 4 162617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 162717b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 1628323514deSNikita Popov; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] 1629b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 1630323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 1631*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 1632323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 163317b9cb18SPhilip Reames; PROLOG-BLOCK: entry.new: 1634911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 1635911991d2SPhilip Reames; PROLOG-BLOCK: header: 163617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 163717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 163817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block 1639911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 1640911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 164117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 1642911991d2SPhilip Reames; PROLOG-BLOCK: latch: 1643911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1644323514deSNikita Popov; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx, align 4 1645323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 164617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 164772031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1 1648de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 1649de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1650de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 1651de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 1652de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1653323514deSNikita Popov; PROLOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 1654323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 1655de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 1656de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 1657de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4 165817b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 165972031407SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ] 166017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 166117b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa: 166217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 166317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit 1664911991d2SPhilip Reames; PROLOG-BLOCK: latchExit: 166517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 1666911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %result 166717b9cb18SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 166817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 1669911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 1670911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 42 1671911991d2SPhilip Reames; 1672cee313d2SEric Christopher 1673cee313d2SEric Christopherentry: 1674cee313d2SEric Christopher br label %header 1675cee313d2SEric Christopher 1676cee313d2SEric Christopherheader: 1677cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 1678cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 1679cee313d2SEric Christopher br i1 %cond, label %latchExit, label %for.exiting_block 1680cee313d2SEric Christopher 1681cee313d2SEric Christopherfor.exiting_block: 1682cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 1683cee313d2SEric Christopher br i1 %cmp, label %for.exit2, label %latch 1684cee313d2SEric Christopher 1685cee313d2SEric Christopherlatch: ; preds = %latch, %entry 1686cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1687cee313d2SEric Christopher %0 = load i32, i32* %arrayidx, align 4 1688cee313d2SEric Christopher %add = add nsw i32 %0, %sum.02 1689cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 1690cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 1691cee313d2SEric Christopher br i1 %exitcond, label %latchExit, label %header 1692cee313d2SEric Christopher 1693cee313d2SEric ChristopherlatchExit: ; preds = %latch, %entry 1694cee313d2SEric Christopher %result = phi i32 [ 0, %header ], [ %add, %latch ] 1695cee313d2SEric Christopher ret i32 %result 1696cee313d2SEric Christopher 1697cee313d2SEric Christopherfor.exit2: 1698cee313d2SEric Christopher ret i32 42 1699cee313d2SEric Christopher} 1700cee313d2SEric Christopher 1701cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a 1702cee313d2SEric Christopher; non-header 1703cee313d2SEric Christopher; FIXME: We should unroll this loop. 1704cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { 1705911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit( 1706911991d2SPhilip Reames; EPILOG-NEXT: entry: 1707*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 1708*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 1709*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 1710*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 1711323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 171294d09142SPhilip Reames; EPILOG: entry.new: 1713*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1714911991d2SPhilip Reames; EPILOG-NEXT: br label %header 1715911991d2SPhilip Reames; EPILOG: header: 171694d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 171794d09142SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 171837ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 171994d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1720911991d2SPhilip Reames; EPILOG: for.exiting_block: 1721911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 172294d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1723911991d2SPhilip Reames; EPILOG: latch: 1724911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1725323514deSNikita Popov; EPILOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 1726323514deSNikita Popov; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 172794d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 172837ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 172972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1730de2fed61SPhilip Reames; EPILOG: for.exiting_block.1: 1731de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 1732de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1733de2fed61SPhilip Reames; EPILOG: latch.1: 1734de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1735323514deSNikita Popov; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1736323514deSNikita Popov; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 1737de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 173837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 173972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 1740de2fed61SPhilip Reames; EPILOG: for.exiting_block.2: 1741de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 1742de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 1743de2fed61SPhilip Reames; EPILOG: latch.2: 1744de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1745323514deSNikita Popov; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 1746323514deSNikita Popov; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 1747de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 174837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 174972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 1750de2fed61SPhilip Reames; EPILOG: for.exiting_block.3: 1751de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 1752de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 1753de2fed61SPhilip Reames; EPILOG: latch.3: 1754de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1755323514deSNikita Popov; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 1756323514deSNikita Popov; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 1757de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 175837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 175972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 1760de2fed61SPhilip Reames; EPILOG: for.exiting_block.4: 1761de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 1762de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 1763de2fed61SPhilip Reames; EPILOG: latch.4: 1764de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 1765323514deSNikita Popov; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 1766323514deSNikita Popov; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 1767de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 176837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 176972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 1770de2fed61SPhilip Reames; EPILOG: for.exiting_block.5: 1771de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 1772de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 1773de2fed61SPhilip Reames; EPILOG: latch.5: 1774de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 1775323514deSNikita Popov; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 1776323514deSNikita Popov; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 1777de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 177837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 177972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 1780de2fed61SPhilip Reames; EPILOG: for.exiting_block.6: 1781de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 1782de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 1783de2fed61SPhilip Reames; EPILOG: latch.6: 1784de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 1785323514deSNikita Popov; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 1786323514deSNikita Popov; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 1787de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 178837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 178972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 1790de2fed61SPhilip Reames; EPILOG: for.exiting_block.7: 1791de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 1792de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 1793de2fed61SPhilip Reames; EPILOG: latch.7: 1794de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 1795323514deSNikita Popov; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 1796323514deSNikita Popov; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 1797de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 179837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 179937ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 1800de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 180194d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa.loopexit: 180294d09142SPhilip Reames; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 180394d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 180494d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 180594d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.unr-lcssa 180694d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa: 180794d09142SPhilip Reames; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 180894d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 180994d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 181094d09142SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 181194d09142SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 181294d09142SPhilip Reames; EPILOG: header.epil.preheader: 181394d09142SPhilip Reames; EPILOG-NEXT: br label %header.epil 181494d09142SPhilip Reames; EPILOG: header.epil: 181594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 181694d09142SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 181737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 181894d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 181994d09142SPhilip Reames; EPILOG: for.exiting_block.epil: 182094d09142SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 182194d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 182294d09142SPhilip Reames; EPILOG: latch.epil: 182394d09142SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 1824323514deSNikita Popov; EPILOG-NEXT: %11 = load i32, i32* %arrayidx.epil, align 4 1825323514deSNikita Popov; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 182694d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 182794d09142SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 182837ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 182937ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 183094d09142SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5 183194d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit: 183294d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ] 183394d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 183494d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit3: 183594d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 183694d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 183794d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa: 183894d09142SPhilip Reames; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 183994d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit 1840911991d2SPhilip Reames; EPILOG: latchExit: 184194d09142SPhilip Reames; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1842911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %result 184394d09142SPhilip Reames; EPILOG: for.exit2.loopexit: 184494d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 184594d09142SPhilip Reames; EPILOG: for.exit2.loopexit2: 184694d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 1847911991d2SPhilip Reames; EPILOG: for.exit2: 1848911991d2SPhilip Reames; EPILOG-NEXT: ret i32 42 1849911991d2SPhilip Reames; 1850911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit( 1851911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 1852*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 1853*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 1854*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 1855*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 1856323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 185794d09142SPhilip Reames; EPILOG-BLOCK: entry.new: 1858*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 1859911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 1860911991d2SPhilip Reames; EPILOG-BLOCK: header: 186194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 186294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 186337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 186494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1865911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 1866911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 186794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 1868911991d2SPhilip Reames; EPILOG-BLOCK: latch: 1869911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1870323514deSNikita Popov; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 1871323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 1872911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 187337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 187472031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 1875de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 1876de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 1877de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 1878de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 1879de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1880323514deSNikita Popov; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 1881323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 1882de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 188337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 188437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 1885de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 188694d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 188794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 188894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 188994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 189094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 189194d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa: 189294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 189394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 189494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 189594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 189694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 189794d09142SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 189894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 189994d09142SPhilip Reames; EPILOG-BLOCK: header.epil: 190094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 190194d09142SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 190294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 190394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 190494d09142SPhilip Reames; EPILOG-BLOCK: latch.epil: 1905b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 1906323514deSNikita Popov; EPILOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.epil, align 4 1907323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 190894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 190994d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 191094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ] 191194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 191294d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa: 191394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 191494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit 1915911991d2SPhilip Reames; EPILOG-BLOCK: latchExit: 191694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 1917911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %result 191894d09142SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 191994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 1920911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 1921911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 42 1922911991d2SPhilip Reames; 1923911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit( 1924911991d2SPhilip Reames; PROLOG-NEXT: entry: 1925*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 1926*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 1927*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 192817b9cb18SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 1929*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 193017b9cb18SPhilip Reames; PROLOG: header.prol.preheader: 193117b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol 193217b9cb18SPhilip Reames; PROLOG: header.prol: 193317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 193417b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 193537ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 193617b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 193717b9cb18SPhilip Reames; PROLOG: for.exiting_block.prol: 193817b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 193917b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 194017b9cb18SPhilip Reames; PROLOG: latch.prol: 194117b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 1942323514deSNikita Popov; PROLOG-NEXT: %2 = load i32, i32* %arrayidx.prol, align 4 1943323514deSNikita Popov; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 194417b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 194517b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 194637ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 194737ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 194817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5 194917b9cb18SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 195017b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 195117b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 195217b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 195317b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 195417b9cb18SPhilip Reames; PROLOG: header.prol.loopexit: 195517b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 195617b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 195717b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 1958*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 1959323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 196017b9cb18SPhilip Reames; PROLOG: entry.new: 1961911991d2SPhilip Reames; PROLOG-NEXT: br label %header 1962911991d2SPhilip Reames; PROLOG: header: 196317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 196417b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 196517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 1966911991d2SPhilip Reames; PROLOG: for.exiting_block: 1967911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 196817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 1969911991d2SPhilip Reames; PROLOG: latch: 1970911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 1971323514deSNikita Popov; PROLOG-NEXT: %4 = load i32, i32* %arrayidx, align 4 1972323514deSNikita Popov; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 1973911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 197472031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 197517b9cb18SPhilip Reames; PROLOG: for.exiting_block.1: 197617b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 197717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 197817b9cb18SPhilip Reames; PROLOG: latch.1: 197917b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 1980323514deSNikita Popov; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 1981323514deSNikita Popov; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 198217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 198372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 198417b9cb18SPhilip Reames; PROLOG: for.exiting_block.2: 198517b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 198617b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 198717b9cb18SPhilip Reames; PROLOG: latch.2: 198817b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 1989323514deSNikita Popov; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.2, align 4 1990323514deSNikita Popov; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 199117b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 199272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 199317b9cb18SPhilip Reames; PROLOG: for.exiting_block.3: 199417b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 199517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 199617b9cb18SPhilip Reames; PROLOG: latch.3: 199717b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 1998323514deSNikita Popov; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.3, align 4 1999323514deSNikita Popov; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 200017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 200172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 200217b9cb18SPhilip Reames; PROLOG: for.exiting_block.4: 200317b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 200417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 200517b9cb18SPhilip Reames; PROLOG: latch.4: 200617b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2007323514deSNikita Popov; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.4, align 4 2008323514deSNikita Popov; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 200917b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 201072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 201117b9cb18SPhilip Reames; PROLOG: for.exiting_block.5: 201217b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 201317b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 201417b9cb18SPhilip Reames; PROLOG: latch.5: 201517b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2016323514deSNikita Popov; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.5, align 4 2017323514deSNikita Popov; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 201817b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 201972031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 202017b9cb18SPhilip Reames; PROLOG: for.exiting_block.6: 202117b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 202217b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 202317b9cb18SPhilip Reames; PROLOG: latch.6: 202417b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2025323514deSNikita Popov; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.6, align 4 2026323514deSNikita Popov; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 202717b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 202872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 202917b9cb18SPhilip Reames; PROLOG: for.exiting_block.7: 203017b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 203117b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 203217b9cb18SPhilip Reames; PROLOG: latch.7: 203317b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2034323514deSNikita Popov; PROLOG-NEXT: %11 = load i32, i32* %arrayidx.7, align 4 2035323514deSNikita Popov; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 203617b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 203717b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 203817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2039de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit: 2040de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2041de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2042de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit2: 2043de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ] 2044de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2045de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa: 2046de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2047de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit 2048de2fed61SPhilip Reames; PROLOG: latchExit: 2049de2fed61SPhilip Reames; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2050de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %result 2051de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 2052de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2053de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit1: 2054de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2055de2fed61SPhilip Reames; PROLOG: for.exit2: 2056de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 42 2057911991d2SPhilip Reames; 2058911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit( 2059911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 2060*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 2061*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 2062*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 206317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2064*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 206517b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 206617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 206717b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol: 206817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 206917b9cb18SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 207017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 207117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 207217b9cb18SPhilip Reames; PROLOG-BLOCK: latch.prol: 2073323514deSNikita Popov; PROLOG-BLOCK-NEXT: %2 = load i32, i32* %a, align 4 207417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 207517b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 2076323514deSNikita Popov; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] 2077b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2078323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2079*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2080323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 208117b9cb18SPhilip Reames; PROLOG-BLOCK: entry.new: 2082911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 2083911991d2SPhilip Reames; PROLOG-BLOCK: header: 208417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 208517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 208617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2087911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 2088911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 208917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2090911991d2SPhilip Reames; PROLOG-BLOCK: latch: 2091911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2092323514deSNikita Popov; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx, align 4 2093323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 209417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 209572031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2096de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 2097de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2098de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2099de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 2100de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2101323514deSNikita Popov; PROLOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 2102323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2103de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2104de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2105de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5 210617b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 210717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 210817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 210917b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa: 211017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 211117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit 2112911991d2SPhilip Reames; PROLOG-BLOCK: latchExit: 211317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2114911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %result 211517b9cb18SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 211617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 2117911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 2118911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 42 2119911991d2SPhilip Reames; 2120cee313d2SEric Christopher 2121cee313d2SEric Christopherentry: 2122cee313d2SEric Christopher br label %header 2123cee313d2SEric Christopher 2124cee313d2SEric Christopherheader: 2125cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2126cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2127cee313d2SEric Christopher br i1 %cond, label %for.exit2, label %for.exiting_block 2128cee313d2SEric Christopher 2129cee313d2SEric Christopherfor.exiting_block: 2130cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 2131cee313d2SEric Christopher br i1 %cmp, label %latchExit, label %latch 2132cee313d2SEric Christopher 2133cee313d2SEric Christopherlatch: ; preds = %latch, %entry 2134cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2135cee313d2SEric Christopher %0 = load i32, i32* %arrayidx, align 4 2136cee313d2SEric Christopher %add = add nsw i32 %0, %sum.02 2137cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 2138cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 2139cee313d2SEric Christopher br i1 %exitcond, label %latchExit, label %header 2140cee313d2SEric Christopher 2141cee313d2SEric ChristopherlatchExit: ; preds = %latch, %entry 2142cee313d2SEric Christopher %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] 2143cee313d2SEric Christopher ret i32 %result 2144cee313d2SEric Christopher 2145cee313d2SEric Christopherfor.exit2: 2146cee313d2SEric Christopher ret i32 42 2147cee313d2SEric Christopher} 2148cee313d2SEric Christopher 2149cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a 2150cee313d2SEric Christopher; non-header 2151cee313d2SEric Christopher; Same as above test except the incoming value for latch Phi is from the header 2152cee313d2SEric Christopher; FIXME: We should be able to runtime unroll. 2153cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { 2154911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit2( 2155911991d2SPhilip Reames; EPILOG-NEXT: entry: 2156*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 2157*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 2158*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 2159*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 2160323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 216194d09142SPhilip Reames; EPILOG: entry.new: 2162*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2163911991d2SPhilip Reames; EPILOG-NEXT: br label %header 2164911991d2SPhilip Reames; EPILOG: header: 216594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 216694d09142SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 216737ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 216894d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2169911991d2SPhilip Reames; EPILOG: for.exiting_block: 2170911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 217194d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2172911991d2SPhilip Reames; EPILOG: latch: 2173911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2174323514deSNikita Popov; EPILOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 2175323514deSNikita Popov; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 217694d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 217737ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 217872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2179de2fed61SPhilip Reames; EPILOG: for.exiting_block.1: 2180de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2181de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2182de2fed61SPhilip Reames; EPILOG: latch.1: 2183de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2184323514deSNikita Popov; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2185323514deSNikita Popov; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2186de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 218737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 218872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2189de2fed61SPhilip Reames; EPILOG: for.exiting_block.2: 2190de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2191de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2192de2fed61SPhilip Reames; EPILOG: latch.2: 2193de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2194323514deSNikita Popov; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2195323514deSNikita Popov; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2196de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 219737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 219872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2199de2fed61SPhilip Reames; EPILOG: for.exiting_block.3: 2200de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2201de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2202de2fed61SPhilip Reames; EPILOG: latch.3: 2203de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2204323514deSNikita Popov; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2205323514deSNikita Popov; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2206de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 220737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 220872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2209de2fed61SPhilip Reames; EPILOG: for.exiting_block.4: 2210de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2211de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2212de2fed61SPhilip Reames; EPILOG: latch.4: 2213de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2214323514deSNikita Popov; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2215323514deSNikita Popov; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2216de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 221737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 221872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2219de2fed61SPhilip Reames; EPILOG: for.exiting_block.5: 2220de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2221de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2222de2fed61SPhilip Reames; EPILOG: latch.5: 2223de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2224323514deSNikita Popov; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2225323514deSNikita Popov; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2226de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 222737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 222872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2229de2fed61SPhilip Reames; EPILOG: for.exiting_block.6: 2230de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2231de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2232de2fed61SPhilip Reames; EPILOG: latch.6: 2233de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2234323514deSNikita Popov; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2235323514deSNikita Popov; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2236de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 223737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 223872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2239de2fed61SPhilip Reames; EPILOG: for.exiting_block.7: 2240de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2241de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2242de2fed61SPhilip Reames; EPILOG: latch.7: 2243de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2244323514deSNikita Popov; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2245323514deSNikita Popov; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2246de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 224737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 224837ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2249de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 225094d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa.loopexit: 225194d09142SPhilip Reames; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 225294d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 225394d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 225494d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.unr-lcssa 225594d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa: 225694d09142SPhilip Reames; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 225794d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 225894d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 225994d09142SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 226094d09142SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 226194d09142SPhilip Reames; EPILOG: header.epil.preheader: 226294d09142SPhilip Reames; EPILOG-NEXT: br label %header.epil 226394d09142SPhilip Reames; EPILOG: header.epil: 226494d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 226594d09142SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 226637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 226794d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 226894d09142SPhilip Reames; EPILOG: for.exiting_block.epil: 226994d09142SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 227094d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 227194d09142SPhilip Reames; EPILOG: latch.epil: 227294d09142SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2273323514deSNikita Popov; EPILOG-NEXT: %11 = load i32, i32* %arrayidx.epil, align 4 2274323514deSNikita Popov; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 227594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 227694d09142SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 227737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 227837ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 227994d09142SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6 228094d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit: 228194d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ] 228294d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 228394d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit3: 228494d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 228594d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 228694d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa: 228794d09142SPhilip Reames; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 228894d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit 2289911991d2SPhilip Reames; EPILOG: latchExit: 229094d09142SPhilip Reames; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2291911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %result 229294d09142SPhilip Reames; EPILOG: for.exit2.loopexit: 229394d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 229494d09142SPhilip Reames; EPILOG: for.exit2.loopexit2: 229594d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 2296911991d2SPhilip Reames; EPILOG: for.exit2: 2297911991d2SPhilip Reames; EPILOG-NEXT: ret i32 42 2298911991d2SPhilip Reames; 2299911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2300911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 2301*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 2302*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 2303*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2304*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 2305323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 230694d09142SPhilip Reames; EPILOG-BLOCK: entry.new: 2307*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2308911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 2309911991d2SPhilip Reames; EPILOG-BLOCK: header: 231094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 231194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 231237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 231394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2314911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 2315911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 231694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2317911991d2SPhilip Reames; EPILOG-BLOCK: latch: 2318911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2319323514deSNikita Popov; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 2320323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2321911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 232237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 232372031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2324de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 2325de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2326de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2327de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 2328de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2329323514deSNikita Popov; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2330323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2331de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 233237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 233337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2334de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 233594d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 233694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 233794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 233894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 233994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 234094d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa: 234194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 234294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 234394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 234494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 234594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 234694d09142SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 234794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 234894d09142SPhilip Reames; EPILOG-BLOCK: header.epil: 234994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 235094d09142SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 235194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 235294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 235394d09142SPhilip Reames; EPILOG-BLOCK: latch.epil: 2354b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 2355323514deSNikita Popov; EPILOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.epil, align 4 2356323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 235794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 235894d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 235994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 236094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 236194d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa: 2362b604fcb7SPhilip Reames; 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 ] 236394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit 2364911991d2SPhilip Reames; EPILOG-BLOCK: latchExit: 236594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2366911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %result 236794d09142SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 236894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 2369911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 2370911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 42 2371911991d2SPhilip Reames; 2372911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit2( 2373911991d2SPhilip Reames; PROLOG-NEXT: entry: 2374*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 2375*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 2376*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 237717b9cb18SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2378*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 237917b9cb18SPhilip Reames; PROLOG: header.prol.preheader: 238017b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol 238117b9cb18SPhilip Reames; PROLOG: header.prol: 238217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 238317b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 238437ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 238517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 238617b9cb18SPhilip Reames; PROLOG: for.exiting_block.prol: 238717b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 238817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 238917b9cb18SPhilip Reames; PROLOG: latch.prol: 239017b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 2391323514deSNikita Popov; PROLOG-NEXT: %2 = load i32, i32* %arrayidx.prol, align 4 2392323514deSNikita Popov; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 239317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 239417b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 239537ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 239637ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 239717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6 239817b9cb18SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 239917b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 240017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 240117b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 240217b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 240317b9cb18SPhilip Reames; PROLOG: header.prol.loopexit: 240417b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 240517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 240617b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2407*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 2408323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 240917b9cb18SPhilip Reames; PROLOG: entry.new: 2410911991d2SPhilip Reames; PROLOG-NEXT: br label %header 2411911991d2SPhilip Reames; PROLOG: header: 241217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 241317b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 241417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2415911991d2SPhilip Reames; PROLOG: for.exiting_block: 2416911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 241717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2418911991d2SPhilip Reames; PROLOG: latch: 2419911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2420323514deSNikita Popov; PROLOG-NEXT: %4 = load i32, i32* %arrayidx, align 4 2421323514deSNikita Popov; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 2422911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 242372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 242417b9cb18SPhilip Reames; PROLOG: for.exiting_block.1: 242517b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 242617b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 242717b9cb18SPhilip Reames; PROLOG: latch.1: 242817b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2429323514deSNikita Popov; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 2430323514deSNikita Popov; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 243117b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 243272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 243317b9cb18SPhilip Reames; PROLOG: for.exiting_block.2: 243417b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 243517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 243617b9cb18SPhilip Reames; PROLOG: latch.2: 243717b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2438323514deSNikita Popov; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.2, align 4 2439323514deSNikita Popov; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 244017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 244172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 244217b9cb18SPhilip Reames; PROLOG: for.exiting_block.3: 244317b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 244417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 244517b9cb18SPhilip Reames; PROLOG: latch.3: 244617b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2447323514deSNikita Popov; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.3, align 4 2448323514deSNikita Popov; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 244917b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 245072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 245117b9cb18SPhilip Reames; PROLOG: for.exiting_block.4: 245217b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 245317b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 245417b9cb18SPhilip Reames; PROLOG: latch.4: 245517b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2456323514deSNikita Popov; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.4, align 4 2457323514deSNikita Popov; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 245817b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 245972031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 246017b9cb18SPhilip Reames; PROLOG: for.exiting_block.5: 246117b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 246217b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 246317b9cb18SPhilip Reames; PROLOG: latch.5: 246417b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2465323514deSNikita Popov; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.5, align 4 2466323514deSNikita Popov; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 246717b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 246872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 246917b9cb18SPhilip Reames; PROLOG: for.exiting_block.6: 247017b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 247117b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 247217b9cb18SPhilip Reames; PROLOG: latch.6: 247317b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2474323514deSNikita Popov; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.6, align 4 2475323514deSNikita Popov; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 247617b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 247772031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 247817b9cb18SPhilip Reames; PROLOG: for.exiting_block.7: 247917b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 248017b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 248117b9cb18SPhilip Reames; PROLOG: latch.7: 248217b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2483323514deSNikita Popov; PROLOG-NEXT: %11 = load i32, i32* %arrayidx.7, align 4 2484323514deSNikita Popov; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 248517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 248617b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 248717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2488de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit: 2489de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2490de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2491de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit2: 2492de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2493de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2494de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa: 2495de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2496de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit 2497de2fed61SPhilip Reames; PROLOG: latchExit: 2498de2fed61SPhilip Reames; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2499de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %result 2500de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 2501de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2502de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit1: 2503de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2504de2fed61SPhilip Reames; PROLOG: for.exit2: 2505de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 42 2506911991d2SPhilip Reames; 2507911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2( 2508911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 2509*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 2510*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 2511*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 251217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2513*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 251417b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 251517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 251617b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol: 251717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 251817b9cb18SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 251917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 252017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 252117b9cb18SPhilip Reames; PROLOG-BLOCK: latch.prol: 2522323514deSNikita Popov; PROLOG-BLOCK-NEXT: %2 = load i32, i32* %a, align 4 252317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 252417b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 2525323514deSNikita Popov; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] 2526b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2527323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2528*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2529323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 253017b9cb18SPhilip Reames; PROLOG-BLOCK: entry.new: 2531911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 2532911991d2SPhilip Reames; PROLOG-BLOCK: header: 253317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 253417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 253517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2536911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 2537911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 253817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2539911991d2SPhilip Reames; PROLOG-BLOCK: latch: 2540911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2541323514deSNikita Popov; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx, align 4 2542323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 254317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 254472031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2545de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 2546de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2547de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 2548de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 2549de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2550323514deSNikita Popov; PROLOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 2551323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2552de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 2553de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 2554de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6 255517b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 255617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 255717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 255817b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa: 255917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 256017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit 2561911991d2SPhilip Reames; PROLOG-BLOCK: latchExit: 256217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2563911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %result 256417b9cb18SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 256517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 2566911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 2567911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 42 2568911991d2SPhilip Reames; 2569cee313d2SEric Christopher 2570cee313d2SEric Christopherentry: 2571cee313d2SEric Christopher br label %header 2572cee313d2SEric Christopher 2573cee313d2SEric Christopherheader: 2574cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 2575cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 2576cee313d2SEric Christopher br i1 %cond, label %for.exit2, label %for.exiting_block 2577cee313d2SEric Christopher 2578cee313d2SEric Christopherfor.exiting_block: 2579cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 2580cee313d2SEric Christopher br i1 %cmp, label %latchExit, label %latch 2581cee313d2SEric Christopher 2582cee313d2SEric Christopherlatch: ; preds = %latch, %entry 2583cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2584cee313d2SEric Christopher %0 = load i32, i32* %arrayidx, align 4 2585cee313d2SEric Christopher %add = add nsw i32 %0, %sum.02 2586cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 2587cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 2588cee313d2SEric Christopher br i1 %exitcond, label %latchExit, label %header 2589cee313d2SEric Christopher 2590cee313d2SEric ChristopherlatchExit: ; preds = %latch, %entry 2591cee313d2SEric Christopher %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 2592cee313d2SEric Christopher ret i32 %result 2593cee313d2SEric Christopher 2594cee313d2SEric Christopherfor.exit2: 2595cee313d2SEric Christopher ret i32 42 2596cee313d2SEric Christopher} 2597cee313d2SEric Christopher 2598cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a 2599cee313d2SEric Christopher; non-header 2600cee313d2SEric Christopher; Same as above test except the incoming value for cloned latch Phi is from the 2601cee313d2SEric Christopher; for.exiting_block. 2602cee313d2SEric Christopher; FIXME: We should be able to runtime unroll. 2603cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { 2604911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit3( 2605911991d2SPhilip Reames; EPILOG-NEXT: entry: 2606*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 2607*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 2608*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 2609*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 2610323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 261194d09142SPhilip Reames; EPILOG: entry.new: 2612*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2613911991d2SPhilip Reames; EPILOG-NEXT: br label %header 2614911991d2SPhilip Reames; EPILOG: header: 261594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 261694d09142SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 261737ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 261894d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2619911991d2SPhilip Reames; EPILOG: for.exiting_block: 2620911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2621323514deSNikita Popov; EPILOG-NEXT: %3 = load i32, i32* %arrayidx, align 4 2622323514deSNikita Popov; EPILOG-NEXT: %add = add nsw i32 %3, %sum.02 2623911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 262494d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2625911991d2SPhilip Reames; EPILOG: latch: 262694d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 262737ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 262872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2629de2fed61SPhilip Reames; EPILOG: for.exiting_block.1: 2630de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2631323514deSNikita Popov; EPILOG-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2632323514deSNikita Popov; EPILOG-NEXT: %add.1 = add nsw i32 %4, %add 2633de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 2634de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2635de2fed61SPhilip Reames; EPILOG: latch.1: 2636de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 263737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 263872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 2639de2fed61SPhilip Reames; EPILOG: for.exiting_block.2: 2640de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2641323514deSNikita Popov; EPILOG-NEXT: %5 = load i32, i32* %arrayidx.2, align 4 2642323514deSNikita Popov; EPILOG-NEXT: %add.2 = add nsw i32 %5, %add.1 2643de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 2644de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2 2645de2fed61SPhilip Reames; EPILOG: latch.2: 2646de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 264737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 264872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 2649de2fed61SPhilip Reames; EPILOG: for.exiting_block.3: 2650de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2651323514deSNikita Popov; EPILOG-NEXT: %6 = load i32, i32* %arrayidx.3, align 4 2652323514deSNikita Popov; EPILOG-NEXT: %add.3 = add nsw i32 %6, %add.2 2653de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 2654de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3 2655de2fed61SPhilip Reames; EPILOG: latch.3: 2656de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 265737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 265872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 2659de2fed61SPhilip Reames; EPILOG: for.exiting_block.4: 2660de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2661323514deSNikita Popov; EPILOG-NEXT: %7 = load i32, i32* %arrayidx.4, align 4 2662323514deSNikita Popov; EPILOG-NEXT: %add.4 = add nsw i32 %7, %add.3 2663de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 2664de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4 2665de2fed61SPhilip Reames; EPILOG: latch.4: 2666de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 266737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 266872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 2669de2fed61SPhilip Reames; EPILOG: for.exiting_block.5: 2670de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2671323514deSNikita Popov; EPILOG-NEXT: %8 = load i32, i32* %arrayidx.5, align 4 2672323514deSNikita Popov; EPILOG-NEXT: %add.5 = add nsw i32 %8, %add.4 2673de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 2674de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5 2675de2fed61SPhilip Reames; EPILOG: latch.5: 2676de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 267737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 267872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 2679de2fed61SPhilip Reames; EPILOG: for.exiting_block.6: 2680de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2681323514deSNikita Popov; EPILOG-NEXT: %9 = load i32, i32* %arrayidx.6, align 4 2682323514deSNikita Popov; EPILOG-NEXT: %add.6 = add nsw i32 %9, %add.5 2683de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 2684de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6 2685de2fed61SPhilip Reames; EPILOG: latch.6: 2686de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 268737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 268872031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 2689de2fed61SPhilip Reames; EPILOG: for.exiting_block.7: 2690de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2691323514deSNikita Popov; EPILOG-NEXT: %10 = load i32, i32* %arrayidx.7, align 4 2692323514deSNikita Popov; EPILOG-NEXT: %add.7 = add nsw i32 %10, %add.6 2693de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 2694de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7 2695de2fed61SPhilip Reames; EPILOG: latch.7: 2696de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 269737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 269837ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 2699de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header 270094d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa.loopexit: 270194d09142SPhilip Reames; EPILOG-NEXT: %result.ph.ph = phi i32 [ %add.7, %latch.7 ] 270294d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 270394d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 270494d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.unr-lcssa 270594d09142SPhilip Reames; EPILOG: latchExit.unr-lcssa: 270694d09142SPhilip Reames; EPILOG-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 270794d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 270894d09142SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 270994d09142SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 271094d09142SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 271194d09142SPhilip Reames; EPILOG: header.epil.preheader: 271294d09142SPhilip Reames; EPILOG-NEXT: br label %header.epil 271394d09142SPhilip Reames; EPILOG: header.epil: 271494d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 271594d09142SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 271637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 271794d09142SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil 271894d09142SPhilip Reames; EPILOG: for.exiting_block.epil: 271994d09142SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 2720323514deSNikita Popov; EPILOG-NEXT: %11 = load i32, i32* %arrayidx.epil, align 4 2721323514deSNikita Popov; EPILOG-NEXT: %add.epil = add nsw i32 %11, %sum.02.epil 272294d09142SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 272394d09142SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil 272494d09142SPhilip Reames; EPILOG: latch.epil: 272594d09142SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 272694d09142SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 272737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 272837ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 272994d09142SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7 273094d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit: 273194d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ] 273294d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 273394d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit3: 273494d09142SPhilip Reames; EPILOG-NEXT: %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ] 273594d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 273694d09142SPhilip Reames; EPILOG: latchExit.epilog-lcssa: 273794d09142SPhilip Reames; EPILOG-NEXT: %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ] 273894d09142SPhilip Reames; EPILOG-NEXT: br label %latchExit 2739911991d2SPhilip Reames; EPILOG: latchExit: 274094d09142SPhilip Reames; EPILOG-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2741911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %result 274294d09142SPhilip Reames; EPILOG: for.exit2.loopexit: 274394d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 274494d09142SPhilip Reames; EPILOG: for.exit2.loopexit2: 274594d09142SPhilip Reames; EPILOG-NEXT: br label %for.exit2 2746911991d2SPhilip Reames; EPILOG: for.exit2: 2747911991d2SPhilip Reames; EPILOG-NEXT: ret i32 42 2748911991d2SPhilip Reames; 2749911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2750911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 2751*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 2752*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 2753*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 2754*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 2755323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %entry.new 275694d09142SPhilip Reames; EPILOG-BLOCK: entry.new: 2757*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 2758911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 2759911991d2SPhilip Reames; EPILOG-BLOCK: header: 276094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 276194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 276237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 276394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2764911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 2765911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2766323514deSNikita Popov; EPILOG-BLOCK-NEXT: %3 = load i32, i32* %arrayidx, align 4 2767323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add = add nsw i32 %3, %sum.02 2768911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 276994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch 2770911991d2SPhilip Reames; EPILOG-BLOCK: latch: 2771911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 277237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 277372031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2774de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 2775de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2776323514deSNikita Popov; EPILOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx.1, align 4 2777323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %4, %add 2778de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 2779de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1 2780de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 2781de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 278237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 278337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 2784de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 278594d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 278694d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %add.1, %latch.1 ] 278794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 278894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 278994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 279094d09142SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa: 279194d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 279294d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ] 279394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ] 279494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 279594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 279694d09142SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 279794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 279894d09142SPhilip Reames; EPILOG-BLOCK: header.epil: 279994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.epil 280094d09142SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 2801b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 2802323514deSNikita Popov; EPILOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.epil, align 4 2803323514deSNikita Popov; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %5, %sum.02.unr 280494d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 280594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil 280694d09142SPhilip Reames; EPILOG-BLOCK: latch.epil: 280794d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 280894d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 280994d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ] 281094d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 281194d09142SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa: 2812b604fcb7SPhilip Reames; 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 ] 281394d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit 2814911991d2SPhilip Reames; EPILOG-BLOCK: latchExit: 281594d09142SPhilip Reames; EPILOG-BLOCK-NEXT: %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ] 2816911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %result 281794d09142SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 281894d09142SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 2819911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 2820911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 42 2821911991d2SPhilip Reames; 2822911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit3( 2823911991d2SPhilip Reames; PROLOG-NEXT: entry: 2824*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 2825*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 2826*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 282717b9cb18SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2828*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 282917b9cb18SPhilip Reames; PROLOG: header.prol.preheader: 283017b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol 283117b9cb18SPhilip Reames; PROLOG: header.prol: 283217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 283317b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 283437ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 283517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol 283617b9cb18SPhilip Reames; PROLOG: for.exiting_block.prol: 283717b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 2838323514deSNikita Popov; PROLOG-NEXT: %2 = load i32, i32* %arrayidx.prol, align 4 2839323514deSNikita Popov; PROLOG-NEXT: %add.prol = add nsw i32 %2, %sum.02.prol 284017b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 284117b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol 284217b9cb18SPhilip Reames; PROLOG: latch.prol: 284317b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 284417b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 284537ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 284637ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 284717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7 284817b9cb18SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 284917b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr.ph = phi i32 [ %add.prol, %latch.prol ] 285017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 285117b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 285217b9cb18SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 285317b9cb18SPhilip Reames; PROLOG: header.prol.loopexit: 285417b9cb18SPhilip Reames; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ] 285517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 285617b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 2857*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 2858323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new 285917b9cb18SPhilip Reames; PROLOG: entry.new: 2860911991d2SPhilip Reames; PROLOG-NEXT: br label %header 2861911991d2SPhilip Reames; PROLOG: header: 286217b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 286317b9cb18SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 286417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2865911991d2SPhilip Reames; PROLOG: for.exiting_block: 2866911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2867323514deSNikita Popov; PROLOG-NEXT: %4 = load i32, i32* %arrayidx, align 4 2868323514deSNikita Popov; PROLOG-NEXT: %add = add nsw i32 %4, %sum.02 2869911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 287017b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2871911991d2SPhilip Reames; PROLOG: latch: 2872911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 287372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 287417b9cb18SPhilip Reames; PROLOG: for.exiting_block.1: 287517b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2876323514deSNikita Popov; PROLOG-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 2877323514deSNikita Popov; PROLOG-NEXT: %add.1 = add nsw i32 %5, %add 287817b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 287917b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 288017b9cb18SPhilip Reames; PROLOG: latch.1: 288117b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 288272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2 288317b9cb18SPhilip Reames; PROLOG: for.exiting_block.2: 288417b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 2885323514deSNikita Popov; PROLOG-NEXT: %6 = load i32, i32* %arrayidx.2, align 4 2886323514deSNikita Popov; PROLOG-NEXT: %add.2 = add nsw i32 %6, %add.1 288717b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 288817b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2 288917b9cb18SPhilip Reames; PROLOG: latch.2: 289017b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 289172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3 289217b9cb18SPhilip Reames; PROLOG: for.exiting_block.3: 289317b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 2894323514deSNikita Popov; PROLOG-NEXT: %7 = load i32, i32* %arrayidx.3, align 4 2895323514deSNikita Popov; PROLOG-NEXT: %add.3 = add nsw i32 %7, %add.2 289617b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 289717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3 289817b9cb18SPhilip Reames; PROLOG: latch.3: 289917b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 290072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4 290117b9cb18SPhilip Reames; PROLOG: for.exiting_block.4: 290217b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 2903323514deSNikita Popov; PROLOG-NEXT: %8 = load i32, i32* %arrayidx.4, align 4 2904323514deSNikita Popov; PROLOG-NEXT: %add.4 = add nsw i32 %8, %add.3 290517b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 290617b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4 290717b9cb18SPhilip Reames; PROLOG: latch.4: 290817b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 290972031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5 291017b9cb18SPhilip Reames; PROLOG: for.exiting_block.5: 291117b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 2912323514deSNikita Popov; PROLOG-NEXT: %9 = load i32, i32* %arrayidx.5, align 4 2913323514deSNikita Popov; PROLOG-NEXT: %add.5 = add nsw i32 %9, %add.4 291417b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 291517b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5 291617b9cb18SPhilip Reames; PROLOG: latch.5: 291717b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 291872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6 291917b9cb18SPhilip Reames; PROLOG: for.exiting_block.6: 292017b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 2921323514deSNikita Popov; PROLOG-NEXT: %10 = load i32, i32* %arrayidx.6, align 4 2922323514deSNikita Popov; PROLOG-NEXT: %add.6 = add nsw i32 %10, %add.5 292317b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 292417b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6 292517b9cb18SPhilip Reames; PROLOG: latch.6: 292617b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 292772031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7 292817b9cb18SPhilip Reames; PROLOG: for.exiting_block.7: 292917b9cb18SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 2930323514deSNikita Popov; PROLOG-NEXT: %11 = load i32, i32* %arrayidx.7, align 4 2931323514deSNikita Popov; PROLOG-NEXT: %add.7 = add nsw i32 %11, %add.6 293217b9cb18SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 293317b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7 293417b9cb18SPhilip Reames; PROLOG: latch.7: 293517b9cb18SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 293617b9cb18SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 293717b9cb18SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header 2938de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit: 2939de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ] 2940de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2941de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit2: 2942de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ] 2943de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 2944de2fed61SPhilip Reames; PROLOG: latchExit.unr-lcssa: 2945de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ] 2946de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchExit 2947de2fed61SPhilip Reames; PROLOG: latchExit: 2948de2fed61SPhilip Reames; PROLOG-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 2949de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %result 2950de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 2951de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2952de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit1: 2953de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 2954de2fed61SPhilip Reames; PROLOG: for.exit2: 2955de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 42 2956911991d2SPhilip Reames; 2957911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3( 2958911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 2959*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 2960*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 2961*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 296217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 2963*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 296417b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 296517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 296617b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol: 296717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2, label %for.exiting_block.prol 296817b9cb18SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 2969323514deSNikita Popov; PROLOG-BLOCK-NEXT: %2 = load i32, i32* %a, align 4 297017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 297117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol 297217b9cb18SPhilip Reames; PROLOG-BLOCK: latch.prol: 297317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 297417b9cb18SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 2975323514deSNikita Popov; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] 2976b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 2977323514deSNikita Popov; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] 2978*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 2979323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new 298017b9cb18SPhilip Reames; PROLOG-BLOCK: entry.new: 2981911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 2982911991d2SPhilip Reames; PROLOG-BLOCK: header: 298317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 298417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 298517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block 2986911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 2987911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 2988323514deSNikita Popov; PROLOG-BLOCK-NEXT: %4 = load i32, i32* %arrayidx, align 4 2989323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add = add nsw i32 %4, %sum.02 2990911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 299117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch 2992911991d2SPhilip Reames; PROLOG-BLOCK: latch: 299317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 299472031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1 2995de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 2996de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 2997323514deSNikita Popov; PROLOG-BLOCK-NEXT: %5 = load i32, i32* %arrayidx.1, align 4 2998323514deSNikita Popov; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %5, %add 2999de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 3000de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1 3001de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 3002de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 3003de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 3004de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7 300517b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 300617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ] 300717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 300817b9cb18SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa: 300917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ] 301017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit 3011911991d2SPhilip Reames; PROLOG-BLOCK: latchExit: 301217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ] 3013911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %result 301417b9cb18SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 301517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 3016911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 3017911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 42 3018911991d2SPhilip Reames; 3019cee313d2SEric Christopher 3020cee313d2SEric Christopherentry: 3021cee313d2SEric Christopher br label %header 3022cee313d2SEric Christopher 3023cee313d2SEric Christopherheader: 3024cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 3025cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 3026cee313d2SEric Christopher br i1 %cond, label %for.exit2, label %for.exiting_block 3027cee313d2SEric Christopher 3028cee313d2SEric Christopherfor.exiting_block: 3029cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3030cee313d2SEric Christopher %0 = load i32, i32* %arrayidx, align 4 3031cee313d2SEric Christopher %add = add nsw i32 %0, %sum.02 3032cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 3033cee313d2SEric Christopher br i1 %cmp, label %latchExit, label %latch 3034cee313d2SEric Christopher 3035cee313d2SEric Christopherlatch: ; preds = %latch, %entry 3036cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 3037cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 3038cee313d2SEric Christopher br i1 %exitcond, label %latchExit, label %header 3039cee313d2SEric Christopher 3040cee313d2SEric ChristopherlatchExit: ; preds = %latch, %entry 3041cee313d2SEric Christopher %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] 3042cee313d2SEric Christopher ret i32 %result 3043cee313d2SEric Christopher 3044cee313d2SEric Christopherfor.exit2: 3045cee313d2SEric Christopher ret i32 42 3046cee313d2SEric Christopher} 3047cee313d2SEric Christopher 3048da327e72SPhilip Reames; Show a case where we have multiple exits, but (provably) exit on the 3049da327e72SPhilip Reames; first iteration and thus have nothing to unroll 3050da327e72SPhilip Reamesdefine void @non_loop(i32 %arg) { 3051da327e72SPhilip Reames; CHECK-LABEL: @non_loop( 3052911991d2SPhilip Reames; CHECK-NEXT: entry: 3053911991d2SPhilip Reames; CHECK-NEXT: %i = icmp sgt i32 undef, %arg 3054911991d2SPhilip Reames; CHECK-NEXT: br i1 %i, label %preheader, label %returnblock 3055911991d2SPhilip Reames; CHECK: preheader: 3056911991d2SPhilip Reames; CHECK-NEXT: br label %header 3057911991d2SPhilip Reames; CHECK: header: 3058911991d2SPhilip Reames; CHECK-NEXT: br i1 true, label %latchExit, label %latch 3059911991d2SPhilip Reames; CHECK: latch: 3060911991d2SPhilip Reames; CHECK-NEXT: br label %latchExit 3061911991d2SPhilip Reames; CHECK: latchExit: 3062911991d2SPhilip Reames; CHECK-NEXT: %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ] 3063911991d2SPhilip Reames; CHECK-NEXT: br label %returnblock 3064911991d2SPhilip Reames; CHECK: returnblock: 3065911991d2SPhilip Reames; CHECK-NEXT: %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 3066911991d2SPhilip Reames; CHECK-NEXT: ret void 3067911991d2SPhilip Reames; 3068cee313d2SEric Christopher 3069cee313d2SEric Christopherentry: 307017a15c32SRoman Lebedev %i = icmp sgt i32 undef, %arg 307117a15c32SRoman Lebedev br i1 %i, label %preheader, label %returnblock 3072cee313d2SEric Christopher 3073cee313d2SEric Christopherpreheader: ; preds = %entry 3074cee313d2SEric Christopher br label %header 3075cee313d2SEric Christopher 3076cee313d2SEric Christopherheader: ; preds = %preheader, %latch 307717a15c32SRoman Lebedev %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ] 307817a15c32SRoman Lebedev %inc = add nsw i32 %i4, 1 3079cee313d2SEric Christopher br i1 true, label %latchExit, label %latch 3080cee313d2SEric Christopher 3081cee313d2SEric Christopherlatch: ; preds = %header 3082cee313d2SEric Christopher %cmp = icmp slt i32 %inc, undef 3083cee313d2SEric Christopher br i1 %cmp, label %header, label %latchExit 3084cee313d2SEric Christopher 3085cee313d2SEric ChristopherlatchExit: ; preds = %header, %latch 308617a15c32SRoman Lebedev %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3087cee313d2SEric Christopher br label %returnblock 3088cee313d2SEric Christopher 3089cee313d2SEric Christopherreturnblock: ; preds = %latchExit, %entry 309017a15c32SRoman Lebedev %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ] 3091cee313d2SEric Christopher ret void 3092cee313d2SEric Christopher} 3093cee313d2SEric Christopher 3094da327e72SPhilip Reames; Latch exit is shared by all exiting blocks 3095da327e72SPhilip Reamesdefine void @unique_exit(i32 %N, i32 %M) { 3096da327e72SPhilip Reames; EPILOG-LABEL: @unique_exit( 3097da327e72SPhilip Reames; EPILOG-NEXT: preheader: 30988906a0feSPhilip Reames; EPILOG-NEXT: %M.shifted = shl i32 %M, 3 30998906a0feSPhilip Reames; EPILOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3100*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i32 %umax 3101*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i32 %0, -1 3102*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i32 %0, 7 3103*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 3104323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3105da327e72SPhilip Reames; EPILOG: preheader.new: 3106*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter 3107da327e72SPhilip Reames; EPILOG-NEXT: br label %header 3108da327e72SPhilip Reames; EPILOG: header: 3109da327e72SPhilip Reames; EPILOG-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ] 3110da327e72SPhilip Reames; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 3111da327e72SPhilip Reames; EPILOG-NEXT: %inc = add nuw nsw i32 %i4, 1 3112da327e72SPhilip Reames; EPILOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3113da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3114da327e72SPhilip Reames; EPILOG: latch: 3115da327e72SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3116da327e72SPhilip Reames; EPILOG-NEXT: %inc.1 = add nuw nsw i32 %inc, 1 3117da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3118da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3119da327e72SPhilip Reames; EPILOG: latch.1: 3120da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 3121da327e72SPhilip Reames; EPILOG-NEXT: %inc.2 = add nuw nsw i32 %inc.1, 1 3122da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3123da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit 3124da327e72SPhilip Reames; EPILOG: latch.2: 3125da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 3126da327e72SPhilip Reames; EPILOG-NEXT: %inc.3 = add nuw nsw i32 %inc.2, 1 3127da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3128da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit 3129da327e72SPhilip Reames; EPILOG: latch.3: 3130da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 3131da327e72SPhilip Reames; EPILOG-NEXT: %inc.4 = add nuw nsw i32 %inc.3, 1 3132da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3133da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit 3134da327e72SPhilip Reames; EPILOG: latch.4: 3135da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 3136da327e72SPhilip Reames; EPILOG-NEXT: %inc.5 = add nuw nsw i32 %inc.4, 1 3137da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3138da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit 3139da327e72SPhilip Reames; EPILOG: latch.5: 3140da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 3141da327e72SPhilip Reames; EPILOG-NEXT: %inc.6 = add nuw nsw i32 %inc.5, 1 3142da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3143da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit 3144da327e72SPhilip Reames; EPILOG: latch.6: 3145da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 3146da327e72SPhilip Reames; EPILOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3147da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3148da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit 3149da327e72SPhilip Reames; EPILOG: latch.7: 3150da327e72SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 3151da327e72SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 3152da327e72SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3153da327e72SPhilip Reames; EPILOG: latchExit.unr-lcssa.loopexit: 3154da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ] 3155da327e72SPhilip Reames; EPILOG-NEXT: %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ] 3156da327e72SPhilip Reames; EPILOG-NEXT: br label %latchExit.unr-lcssa 3157da327e72SPhilip Reames; EPILOG: latchExit.unr-lcssa: 3158da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3159da327e72SPhilip Reames; EPILOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3160da327e72SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3161da327e72SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3162da327e72SPhilip Reames; EPILOG: header.epil.preheader: 3163da327e72SPhilip Reames; EPILOG-NEXT: br label %header.epil 3164da327e72SPhilip Reames; EPILOG: header.epil: 3165da327e72SPhilip Reames; EPILOG-NEXT: %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ] 3166da327e72SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3167da327e72SPhilip Reames; EPILOG-NEXT: %inc.epil = add nuw i32 %i4.epil, 1 3168da327e72SPhilip Reames; EPILOG-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3169da327e72SPhilip Reames; EPILOG-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2 3170da327e72SPhilip Reames; EPILOG: latch.epil: 3171da327e72SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ult i32 %inc.epil, %M.shifted 3172da327e72SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 3173da327e72SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 3174da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8 3175da327e72SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit: 3176da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ] 3177da327e72SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3178da327e72SPhilip Reames; EPILOG: latchExit.epilog-lcssa.loopexit2: 3179da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ] 3180da327e72SPhilip Reames; EPILOG-NEXT: br label %latchExit.epilog-lcssa 3181da327e72SPhilip Reames; EPILOG: latchExit.epilog-lcssa: 3182da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ] 3183da327e72SPhilip Reames; EPILOG-NEXT: br label %latchExit 3184da327e72SPhilip Reames; EPILOG: latchExit: 3185da327e72SPhilip Reames; EPILOG-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3186da327e72SPhilip Reames; EPILOG-NEXT: ret void 3187da327e72SPhilip Reames; 3188da327e72SPhilip Reames; EPILOG-BLOCK-LABEL: @unique_exit( 3189da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: preheader: 31908906a0feSPhilip Reames; EPILOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 31918906a0feSPhilip Reames; EPILOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3192*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i32 %umax 3193*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i32 %0, -1 3194*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 3195*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3196323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new 3197da327e72SPhilip Reames; EPILOG-BLOCK: preheader.new: 3198*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter 3199da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 3200da327e72SPhilip Reames; EPILOG-BLOCK: header: 3201da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ] 3202da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 3203da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %inc = add nuw nsw i32 %i4, 1 3204da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3205da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit 3206da327e72SPhilip Reames; EPILOG-BLOCK: latch: 3207da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 3208da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3209da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3210da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit 3211da327e72SPhilip Reames; EPILOG-BLOCK: latch.1: 3212da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 3213da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 3214da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3215da327e72SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa.loopexit: 3216da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ] 3217da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ] 3218da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3219da327e72SPhilip Reames; EPILOG-BLOCK: latchExit.unr-lcssa: 3220da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3221da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ] 3222da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3223da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit 3224da327e72SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 3225da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 3226da327e72SPhilip Reames; EPILOG-BLOCK: header.epil: 3227da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %inc.epil = add nuw i32 %i4.unr, 1 3228da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp1.epil = icmp ult i32 %inc.epil, %N 3229da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa 3230da327e72SPhilip Reames; EPILOG-BLOCK: latch.epil: 3231da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3232da327e72SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa.loopexit: 3233da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ] 3234da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit.epilog-lcssa 3235da327e72SPhilip Reames; EPILOG-BLOCK: latchExit.epilog-lcssa: 3236da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ] 3237da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchExit 3238da327e72SPhilip Reames; EPILOG-BLOCK: latchExit: 3239da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ] 3240da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 3241da327e72SPhilip Reames; 3242da327e72SPhilip Reames; PROLOG-LABEL: @unique_exit( 3243da327e72SPhilip Reames; PROLOG-NEXT: preheader: 32448906a0feSPhilip Reames; PROLOG-NEXT: %M.shifted = shl i32 %M, 3 32458906a0feSPhilip Reames; PROLOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3246*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i32 %umax 3247*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i32 %0, -1 3248*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i32 %0, 7 3249da327e72SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3250*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3251da327e72SPhilip Reames; PROLOG: header.prol.preheader: 3252da327e72SPhilip Reames; PROLOG-NEXT: br label %header.prol 3253da327e72SPhilip Reames; PROLOG: header.prol: 3254da327e72SPhilip Reames; PROLOG-NEXT: %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ] 3255da327e72SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 3256da327e72SPhilip Reames; PROLOG-NEXT: %inc.prol = add nuw i32 %i4.prol, 1 3257da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.prol = icmp ult i32 %inc.prol, %N 3258da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1 3259da327e72SPhilip Reames; PROLOG: latch.prol: 3260da327e72SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ult i32 %inc.prol, %M.shifted 3261da327e72SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 3262da327e72SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 3263da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8 3264da327e72SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 3265da327e72SPhilip Reames; PROLOG-NEXT: %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ] 3266da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ] 3267da327e72SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 3268da327e72SPhilip Reames; PROLOG: header.prol.loopexit: 3269da327e72SPhilip Reames; PROLOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ] 3270da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ] 3271*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 3272323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %latchExit, label %preheader.new 3273da327e72SPhilip Reames; PROLOG: preheader.new: 3274da327e72SPhilip Reames; PROLOG-NEXT: br label %header 3275da327e72SPhilip Reames; PROLOG: header: 3276da327e72SPhilip Reames; PROLOG-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ] 3277da327e72SPhilip Reames; PROLOG-NEXT: %inc = add nuw i32 %i4, 1 3278da327e72SPhilip Reames; PROLOG-NEXT: %cmp1 = icmp ult i32 %inc, %N 3279da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3280da327e72SPhilip Reames; PROLOG: latch: 3281da327e72SPhilip Reames; PROLOG-NEXT: %inc.1 = add nuw i32 %inc, 1 3282da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3283da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3284da327e72SPhilip Reames; PROLOG: latch.1: 3285da327e72SPhilip Reames; PROLOG-NEXT: %inc.2 = add nuw i32 %inc.1, 1 3286da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.2 = icmp ult i32 %inc.2, %N 3287da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit 3288da327e72SPhilip Reames; PROLOG: latch.2: 3289da327e72SPhilip Reames; PROLOG-NEXT: %inc.3 = add nuw i32 %inc.2, 1 3290da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.3 = icmp ult i32 %inc.3, %N 3291da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit 3292da327e72SPhilip Reames; PROLOG: latch.3: 3293da327e72SPhilip Reames; PROLOG-NEXT: %inc.4 = add nuw i32 %inc.3, 1 3294da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.4 = icmp ult i32 %inc.4, %N 3295da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit 3296da327e72SPhilip Reames; PROLOG: latch.4: 3297da327e72SPhilip Reames; PROLOG-NEXT: %inc.5 = add nuw i32 %inc.4, 1 3298da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.5 = icmp ult i32 %inc.5, %N 3299da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit 3300da327e72SPhilip Reames; PROLOG: latch.5: 3301da327e72SPhilip Reames; PROLOG-NEXT: %inc.6 = add nuw i32 %inc.5, 1 3302da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.6 = icmp ult i32 %inc.6, %N 3303da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit 3304da327e72SPhilip Reames; PROLOG: latch.6: 3305da327e72SPhilip Reames; PROLOG-NEXT: %inc.7 = add nuw i32 %inc.6, 1 3306da327e72SPhilip Reames; PROLOG-NEXT: %cmp1.7 = icmp ult i32 %inc.7, %N 3307da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit 3308da327e72SPhilip Reames; PROLOG: latch.7: 3309da327e72SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ult i32 %inc.7, %M.shifted 3310da327e72SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit 3311da327e72SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit: 3312da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ] 3313da327e72SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 3314da327e72SPhilip Reames; PROLOG: latchExit.unr-lcssa.loopexit1: 3315da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ] 3316da327e72SPhilip Reames; PROLOG-NEXT: br label %latchExit.unr-lcssa 3317da327e72SPhilip Reames; PROLOG: latchExit.unr-lcssa: 3318da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ] 3319da327e72SPhilip Reames; PROLOG-NEXT: br label %latchExit 3320da327e72SPhilip Reames; PROLOG: latchExit: 3321da327e72SPhilip Reames; PROLOG-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3322da327e72SPhilip Reames; PROLOG-NEXT: ret void 3323da327e72SPhilip Reames; 3324da327e72SPhilip Reames; PROLOG-BLOCK-LABEL: @unique_exit( 3325da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: preheader: 33268906a0feSPhilip Reames; PROLOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 33278906a0feSPhilip Reames; PROLOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) 3328*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i32 %umax 3329*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i32 %0, -1 3330*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 3331da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 3332*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 3333da327e72SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 3334da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 3335da327e72SPhilip Reames; PROLOG-BLOCK: header.prol: 3336da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp1.prol = icmp ult i32 1, %N 3337da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa 3338da327e72SPhilip Reames; PROLOG-BLOCK: latch.prol: 3339da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 3340da327e72SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 3341da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ] 3342da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ] 3343*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 3344323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %preheader.new 3345da327e72SPhilip Reames; PROLOG-BLOCK: preheader.new: 3346da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 3347da327e72SPhilip Reames; PROLOG-BLOCK: header: 3348da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ] 3349da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %inc = add nuw i32 %i4, 1 3350da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp1 = icmp ult i32 %inc, %N 3351da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit 3352da327e72SPhilip Reames; PROLOG-BLOCK: latch: 3353da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %inc.1 = add nuw i32 %inc, 1 3354da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp1.1 = icmp ult i32 %inc.1, %N 3355da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit 3356da327e72SPhilip Reames; PROLOG-BLOCK: latch.1: 3357da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ult i32 %inc.1, %M.shifted 3358da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8 3359da327e72SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa.loopexit: 3360da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ] 3361da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit.unr-lcssa 3362da327e72SPhilip Reames; PROLOG-BLOCK: latchExit.unr-lcssa: 3363da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ] 3364da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchExit 3365da327e72SPhilip Reames; PROLOG-BLOCK: latchExit: 3366da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ] 3367da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 3368da327e72SPhilip Reames; 3369da327e72SPhilip Reames 3370da327e72SPhilip Reamespreheader: 3371da327e72SPhilip Reames %M.shifted = shl nuw i32 %M, 3 3372da327e72SPhilip Reames br label %header 3373da327e72SPhilip Reames 3374da327e72SPhilip Reamesheader: ; preds = %preheader, %latch 3375da327e72SPhilip Reames %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ] 3376da327e72SPhilip Reames %inc = add nuw i32 %i4, 1 3377da327e72SPhilip Reames %cmp1 = icmp ult i32 %inc, %N 3378da327e72SPhilip Reames br i1 %cmp1, label %latch, label %latchExit 3379da327e72SPhilip Reames 3380da327e72SPhilip Reameslatch: ; preds = %header 3381da327e72SPhilip Reames %cmp = icmp ult i32 %inc, %M.shifted 3382da327e72SPhilip Reames br i1 %cmp, label %header, label %latchExit 3383da327e72SPhilip Reames 3384da327e72SPhilip ReameslatchExit: ; preds = %header, %latch 3385da327e72SPhilip Reames %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ] 3386da327e72SPhilip Reames ret void 3387da327e72SPhilip Reames} 3388da327e72SPhilip Reames 3389da327e72SPhilip Reames 3390cee313d2SEric Christopher; two exiting and two exit blocks. 3391cee313d2SEric Christopher; the non-latch exiting block has duplicate edges to the non-latch exit block. 3392cee313d2SEric Christopherdefine i64 @test5(i64 %trip, i64 %add, i1 %cond) { 3393911991d2SPhilip Reames; EPILOG-LABEL: @test5( 3394911991d2SPhilip Reames; EPILOG-NEXT: entry: 3395*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 3396*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 3397*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 3398*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 3399323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %entry.new 3400911991d2SPhilip Reames; EPILOG: entry.new: 3401*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3402911991d2SPhilip Reames; EPILOG-NEXT: br label %loop_header 3403911991d2SPhilip Reames; EPILOG: loop_header: 3404911991d2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3405911991d2SPhilip Reames; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 340637ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 3407911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3408911991d2SPhilip Reames; EPILOG: loop_exiting: 3409911991d2SPhilip Reames; EPILOG-NEXT: %ivy = add i64 %iv, %add 3410911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum, label %loop_latch [ 3411911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3412911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3413911991d2SPhilip Reames; EPILOG-NEXT: ] 3414911991d2SPhilip Reames; EPILOG: loop_latch: 3415911991d2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3416911991d2SPhilip Reames; EPILOG-NEXT: %sum.next = add i64 %sum, %add 341737ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3418911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3419911991d2SPhilip Reames; EPILOG: loop_exiting.1: 3420911991d2SPhilip Reames; EPILOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3421911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3422911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3423911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3424911991d2SPhilip Reames; EPILOG-NEXT: ] 3425911991d2SPhilip Reames; EPILOG: loop_latch.1: 3426911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3427911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 342837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 3429911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3430911991d2SPhilip Reames; EPILOG: loop_exiting.2: 3431911991d2SPhilip Reames; EPILOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3432911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3433911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3434911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3435911991d2SPhilip Reames; EPILOG-NEXT: ] 3436911991d2SPhilip Reames; EPILOG: loop_latch.2: 3437911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3438911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 343937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 3440911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3441911991d2SPhilip Reames; EPILOG: loop_exiting.3: 3442911991d2SPhilip Reames; EPILOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3443911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3444911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3445911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3446911991d2SPhilip Reames; EPILOG-NEXT: ] 3447911991d2SPhilip Reames; EPILOG: loop_latch.3: 3448911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3449911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 345037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 3451911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3452911991d2SPhilip Reames; EPILOG: loop_exiting.4: 3453911991d2SPhilip Reames; EPILOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3454911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3455911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3456911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3457911991d2SPhilip Reames; EPILOG-NEXT: ] 3458911991d2SPhilip Reames; EPILOG: loop_latch.4: 3459911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3460911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 346137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 3462911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3463911991d2SPhilip Reames; EPILOG: loop_exiting.5: 3464911991d2SPhilip Reames; EPILOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3465911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3466911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3467911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3468911991d2SPhilip Reames; EPILOG-NEXT: ] 3469911991d2SPhilip Reames; EPILOG: loop_latch.5: 3470911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3471911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 347237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 3473911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3474911991d2SPhilip Reames; EPILOG: loop_exiting.6: 3475911991d2SPhilip Reames; EPILOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3476911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3477911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3478911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3479911991d2SPhilip Reames; EPILOG-NEXT: ] 3480911991d2SPhilip Reames; EPILOG: loop_latch.6: 3481911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3482911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 348337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 3484911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3485911991d2SPhilip Reames; EPILOG: loop_exiting.7: 3486911991d2SPhilip Reames; EPILOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3487911991d2SPhilip Reames; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3488911991d2SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit 3489911991d2SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit 3490911991d2SPhilip Reames; EPILOG-NEXT: ] 3491cee313d2SEric Christopher; EPILOG: loop_latch.7: 3492911991d2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3493911991d2SPhilip Reames; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 349437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 349537ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 3496911991d2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit 3497de2fed61SPhilip Reames; EPILOG: exit1.loopexit: 3498de2fed61SPhilip Reames; EPILOG-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ] 3499de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 3500de2fed61SPhilip Reames; EPILOG: exit1.loopexit2: 3501de2fed61SPhilip Reames; EPILOG-NEXT: %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ] 3502de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 3503de2fed61SPhilip Reames; EPILOG: exit1: 3504de2fed61SPhilip Reames; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ] 3505de2fed61SPhilip Reames; EPILOG-NEXT: ret i64 %result 3506de2fed61SPhilip Reames; EPILOG: latchexit.unr-lcssa.loopexit: 3507de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3508de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 3509de2fed61SPhilip Reames; EPILOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3510de2fed61SPhilip Reames; EPILOG-NEXT: br label %latchexit.unr-lcssa 3511de2fed61SPhilip Reames; EPILOG: latchexit.unr-lcssa: 3512de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3513de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3514de2fed61SPhilip Reames; EPILOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3515de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3516de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3517de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 3518de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 3519de2fed61SPhilip Reames; EPILOG: loop_header.epil: 3520de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 3521de2fed61SPhilip Reames; EPILOG-NEXT: %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ] 352237ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 3523de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3524de2fed61SPhilip Reames; EPILOG: loop_exiting.epil: 3525de2fed61SPhilip Reames; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add 3526de2fed61SPhilip Reames; EPILOG-NEXT: switch i64 %sum.epil, label %loop_latch.epil [ 3527de2fed61SPhilip Reames; EPILOG-NEXT: i64 24, label %exit1.loopexit2 3528de2fed61SPhilip Reames; EPILOG-NEXT: i64 42, label %exit1.loopexit2 3529de2fed61SPhilip Reames; EPILOG-NEXT: ] 3530de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 3531de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add nuw nsw i64 %iv.epil, 1 3532de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.epil = add i64 %sum.epil, %add 3533de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 353437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 353537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3536da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9 3537de2fed61SPhilip Reames; EPILOG: latchexit.epilog-lcssa: 3538de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ] 3539de2fed61SPhilip Reames; EPILOG-NEXT: br label %latchexit 3540de2fed61SPhilip Reames; EPILOG: latchexit: 3541de2fed61SPhilip Reames; EPILOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ] 3542de2fed61SPhilip Reames; EPILOG-NEXT: ret i64 %sum.next.lcssa 3543911991d2SPhilip Reames; 3544911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test5( 3545911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 3546*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 3547*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 3548*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3549*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3550323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latchexit.unr-lcssa, label %entry.new 3551911991d2SPhilip Reames; EPILOG-BLOCK: entry.new: 3552*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3553911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 3554911991d2SPhilip Reames; EPILOG-BLOCK: loop_header: 3555911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3556911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 355737ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 3558911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3559911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting: 3560911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3561911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3562911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3563911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3564911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ] 3565911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch: 3566911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3567911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 356837ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 3569911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3570de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting.1: 3571de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3572de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3573de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3574de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3575de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: ] 3576de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 3577de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3578de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 357937ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 358037ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 3581da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9 3582911991d2SPhilip Reames; EPILOG-BLOCK: exit1.loopexit: 3583911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3584911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 3585911991d2SPhilip Reames; EPILOG-BLOCK: exit1: 3586911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ] 3587911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i64 %result 3588911991d2SPhilip Reames; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 3589911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3590911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 3591911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3592911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 3593911991d2SPhilip Reames; EPILOG-BLOCK: latchexit.unr-lcssa: 3594911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ] 3595911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ] 3596911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ] 3597911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3598911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit 3599911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 3600911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 3601911991d2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 3602911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil 3603911991d2SPhilip Reames; EPILOG-BLOCK: loop_exiting.epil: 3604b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %ivy.epil = add i64 %iv.unr, %add 3605b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: switch i64 %sum.unr, label %loop_latch.epil [ 3606911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 24, label %exit1 3607911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: i64 42, label %exit1 3608911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ] 3609911991d2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 3610b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.epil = add i64 %sum.unr, %add 3611911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchexit 3612911991d2SPhilip Reames; EPILOG-BLOCK: latchexit: 3613b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ] 3614911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3615911991d2SPhilip Reames; 3616911991d2SPhilip Reames; PROLOG-LABEL: @test5( 3617911991d2SPhilip Reames; PROLOG-NEXT: entry: 3618*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 3619*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 3620*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 3621911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3622*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3623911991d2SPhilip Reames; PROLOG: loop_header.prol.preheader: 3624911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 3625911991d2SPhilip Reames; PROLOG: loop_header.prol: 3626911991d2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 3627911991d2SPhilip Reames; PROLOG-NEXT: %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ] 362837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 3629911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3630911991d2SPhilip Reames; PROLOG: loop_exiting.prol: 3631911991d2SPhilip Reames; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add 3632911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.prol, label %loop_latch.prol [ 3633911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit1 3634911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit1 3635911991d2SPhilip Reames; PROLOG-NEXT: ] 3636911991d2SPhilip Reames; PROLOG: loop_latch.prol: 3637911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add nuw nsw i64 %iv.prol, 1 3638911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.prol = add i64 %sum.prol, %add 3639911991d2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 364037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 364137ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 3642da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9 3643911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 3644911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 3645911991d2SPhilip Reames; PROLOG-NEXT: %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3646911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ] 3647911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 3648911991d2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 3649911991d2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3650911991d2SPhilip Reames; PROLOG-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3651911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 3652*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 3653323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %latchexit, label %entry.new 3654911991d2SPhilip Reames; PROLOG: entry.new: 3655911991d2SPhilip Reames; PROLOG-NEXT: br label %loop_header 3656911991d2SPhilip Reames; PROLOG: loop_header: 3657911991d2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 3658911991d2SPhilip Reames; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ] 3659911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3660911991d2SPhilip Reames; PROLOG: loop_exiting: 3661911991d2SPhilip Reames; PROLOG-NEXT: %ivy = add i64 %iv, %add 3662911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum, label %loop_latch [ 3663911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3664911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3665911991d2SPhilip Reames; PROLOG-NEXT: ] 3666911991d2SPhilip Reames; PROLOG: loop_latch: 3667911991d2SPhilip Reames; PROLOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3668911991d2SPhilip Reames; PROLOG-NEXT: %sum.next = add i64 %sum, %add 3669911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3670911991d2SPhilip Reames; PROLOG: loop_exiting.1: 3671911991d2SPhilip Reames; PROLOG-NEXT: %ivy.1 = add i64 %iv_next, %add 3672911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3673911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3674911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3675911991d2SPhilip Reames; PROLOG-NEXT: ] 3676911991d2SPhilip Reames; PROLOG: loop_latch.1: 3677911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3678911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.1 = add i64 %sum.next, %add 3679911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %loop_exiting.2 3680911991d2SPhilip Reames; PROLOG: loop_exiting.2: 3681911991d2SPhilip Reames; PROLOG-NEXT: %ivy.2 = add i64 %iv_next.1, %add 3682911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.1, label %loop_latch.2 [ 3683911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3684911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3685911991d2SPhilip Reames; PROLOG-NEXT: ] 3686911991d2SPhilip Reames; PROLOG: loop_latch.2: 3687911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 3688911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.2 = add i64 %sum.next.1, %add 3689911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %loop_exiting.3 3690911991d2SPhilip Reames; PROLOG: loop_exiting.3: 3691911991d2SPhilip Reames; PROLOG-NEXT: %ivy.3 = add i64 %iv_next.2, %add 3692911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.2, label %loop_latch.3 [ 3693911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3694911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3695911991d2SPhilip Reames; PROLOG-NEXT: ] 3696911991d2SPhilip Reames; PROLOG: loop_latch.3: 3697911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 3698911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.3 = add i64 %sum.next.2, %add 3699911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %loop_exiting.4 3700911991d2SPhilip Reames; PROLOG: loop_exiting.4: 3701911991d2SPhilip Reames; PROLOG-NEXT: %ivy.4 = add i64 %iv_next.3, %add 3702911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.3, label %loop_latch.4 [ 3703911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3704911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3705911991d2SPhilip Reames; PROLOG-NEXT: ] 3706911991d2SPhilip Reames; PROLOG: loop_latch.4: 3707911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 3708911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.4 = add i64 %sum.next.3, %add 3709911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %loop_exiting.5 3710911991d2SPhilip Reames; PROLOG: loop_exiting.5: 3711911991d2SPhilip Reames; PROLOG-NEXT: %ivy.5 = add i64 %iv_next.4, %add 3712911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.4, label %loop_latch.5 [ 3713911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3714911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3715911991d2SPhilip Reames; PROLOG-NEXT: ] 3716911991d2SPhilip Reames; PROLOG: loop_latch.5: 3717911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 3718911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.5 = add i64 %sum.next.4, %add 3719911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %loop_exiting.6 3720911991d2SPhilip Reames; PROLOG: loop_exiting.6: 3721911991d2SPhilip Reames; PROLOG-NEXT: %ivy.6 = add i64 %iv_next.5, %add 3722911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.5, label %loop_latch.6 [ 3723911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3724911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3725911991d2SPhilip Reames; PROLOG-NEXT: ] 3726911991d2SPhilip Reames; PROLOG: loop_latch.6: 3727911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 3728911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.6 = add i64 %sum.next.5, %add 3729911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %loop_exiting.7 3730911991d2SPhilip Reames; PROLOG: loop_exiting.7: 3731911991d2SPhilip Reames; PROLOG-NEXT: %ivy.7 = add i64 %iv_next.6, %add 3732911991d2SPhilip Reames; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7 [ 3733911991d2SPhilip Reames; PROLOG-NEXT: i64 24, label %exit1.loopexit 3734911991d2SPhilip Reames; PROLOG-NEXT: i64 42, label %exit1.loopexit 3735911991d2SPhilip Reames; PROLOG-NEXT: ] 3736cee313d2SEric Christopher; PROLOG: loop_latch.7: 3737911991d2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add nuw nsw i64 %iv_next.6, 1 3738911991d2SPhilip Reames; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add 3739911991d2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 3740911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa 3741de2fed61SPhilip Reames; PROLOG: exit1.loopexit: 3742de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ] 3743de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 3744de2fed61SPhilip Reames; PROLOG: exit1.loopexit1: 3745de2fed61SPhilip Reames; PROLOG-NEXT: %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ] 3746de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 3747de2fed61SPhilip Reames; PROLOG: exit1: 3748de2fed61SPhilip Reames; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ] 3749de2fed61SPhilip Reames; PROLOG-NEXT: ret i64 %result 3750de2fed61SPhilip Reames; PROLOG: latchexit.unr-lcssa: 3751de2fed61SPhilip Reames; PROLOG-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ] 3752de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchexit 3753de2fed61SPhilip Reames; PROLOG: latchexit: 3754de2fed61SPhilip Reames; PROLOG-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3755de2fed61SPhilip Reames; PROLOG-NEXT: ret i64 %sum.next.lcssa 3756911991d2SPhilip Reames; 3757911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test5( 3758911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 3759*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 3760*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 3761*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 3762911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3763*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 3764911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 3765911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 3766911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 3767911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol 3768911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting.prol: 3769911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 0, label %loop_latch.prol [ 3770911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1 3771911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit1 3772911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ] 3773911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 3774911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 3775911991d2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 3776b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 3777b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] 3778b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ] 3779*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 3780323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %entry.new 3781911991d2SPhilip Reames; PROLOG-BLOCK: entry.new: 3782911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 3783911991d2SPhilip Reames; PROLOG-BLOCK: loop_header: 3784911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 3785911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ] 3786911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %loop_exiting 3787911991d2SPhilip Reames; PROLOG-BLOCK: loop_exiting: 3788911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %ivy = add i64 %iv, %add 3789911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 %sum, label %loop_latch [ 3790911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3791911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3792911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ] 3793911991d2SPhilip Reames; PROLOG-BLOCK: loop_latch: 3794911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 3795911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next = add i64 %sum, %add 3796911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %loop_exiting.1 3797de2fed61SPhilip Reames; PROLOG-BLOCK: loop_exiting.1: 3798de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %ivy.1 = add i64 %iv_next, %add 3799de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: switch i64 %sum.next, label %loop_latch.1 [ 3800de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: i64 24, label %exit1.loopexit 3801de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: i64 42, label %exit1.loopexit 3802de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ] 3803de2fed61SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 3804de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 3805de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next.1 = add i64 %sum.next, %add 3806de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 3807da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9 3808911991d2SPhilip Reames; PROLOG-BLOCK: exit1.loopexit: 3809911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ] 3810911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 3811911991d2SPhilip Reames; PROLOG-BLOCK: exit1: 3812b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ] 3813911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i64 %result 3814911991d2SPhilip Reames; PROLOG-BLOCK: latchexit.unr-lcssa: 3815911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ] 3816911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchexit 3817911991d2SPhilip Reames; PROLOG-BLOCK: latchexit: 3818911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ] 3819911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i64 %sum.next.lcssa 3820911991d2SPhilip Reames; 3821911991d2SPhilip Reames 3822cee313d2SEric Christopherentry: 3823cee313d2SEric Christopher br label %loop_header 3824cee313d2SEric Christopher 3825cee313d2SEric Christopherloop_header: 3826cee313d2SEric Christopher %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 3827cee313d2SEric Christopher %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ] 3828cee313d2SEric Christopher br i1 %cond, label %loop_latch, label %loop_exiting 3829cee313d2SEric Christopher 3830cee313d2SEric Christopherloop_exiting: 3831cee313d2SEric Christopher %ivy = add i64 %iv, %add 3832cee313d2SEric Christopher switch i64 %sum, label %loop_latch [ 3833cee313d2SEric Christopher i64 24, label %exit1 3834cee313d2SEric Christopher i64 42, label %exit1 3835cee313d2SEric Christopher ] 3836cee313d2SEric Christopher 3837cee313d2SEric Christopherloop_latch: 3838cee313d2SEric Christopher %iv_next = add nuw nsw i64 %iv, 1 3839cee313d2SEric Christopher %sum.next = add i64 %sum, %add 3840cee313d2SEric Christopher %cmp = icmp ne i64 %iv_next, %trip 3841cee313d2SEric Christopher br i1 %cmp, label %loop_header, label %latchexit 3842cee313d2SEric Christopher 3843cee313d2SEric Christopherexit1: 3844cee313d2SEric Christopher %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ] 3845cee313d2SEric Christopher ret i64 %result 3846cee313d2SEric Christopher 3847cee313d2SEric Christopherlatchexit: 3848cee313d2SEric Christopher ret i64 %sum.next 3849cee313d2SEric Christopher} 3850cee313d2SEric Christopher 3851cee313d2SEric Christopher; test when exit blocks have successors. 3852cee313d2SEric Christopherdefine i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { 3853911991d2SPhilip Reames; EPILOG-LABEL: @test6( 3854911991d2SPhilip Reames; EPILOG-NEXT: entry: 3855*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %n 3856*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 3857*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 3858*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 3859323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new 3860911991d2SPhilip Reames; EPILOG: entry.new: 3861*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 3862911991d2SPhilip Reames; EPILOG-NEXT: br label %header 3863911991d2SPhilip Reames; EPILOG: header: 3864911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 3865911991d2SPhilip Reames; EPILOG-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ] 386637ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ] 3867911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 3868911991d2SPhilip Reames; EPILOG: for.exiting_block: 3869911991d2SPhilip Reames; EPILOG-NEXT: %cmp = icmp eq i64 %n, 42 3870911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 3871911991d2SPhilip Reames; EPILOG: latch: 3872911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 3873911991d2SPhilip Reames; EPILOG-NEXT: %load = load i32, i32* %arrayidx, align 4 3874911991d2SPhilip Reames; EPILOG-NEXT: %add = add nsw i32 %load, %sum.02 3875911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 387637ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 387772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 3878911991d2SPhilip Reames; EPILOG: for.exiting_block.1: 3879911991d2SPhilip Reames; EPILOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 3880911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 3881911991d2SPhilip Reames; EPILOG: latch.1: 3882911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 3883911991d2SPhilip Reames; EPILOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 3884911991d2SPhilip Reames; EPILOG-NEXT: %add.1 = add nsw i32 %load.1, %add 3885911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1 388637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 388772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 3888911991d2SPhilip Reames; EPILOG: for.exiting_block.2: 3889911991d2SPhilip Reames; EPILOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 3890911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 3891911991d2SPhilip Reames; EPILOG: latch.2: 3892911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 3893911991d2SPhilip Reames; EPILOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 3894911991d2SPhilip Reames; EPILOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 3895911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1 389637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 389772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 3898911991d2SPhilip Reames; EPILOG: for.exiting_block.3: 3899911991d2SPhilip Reames; EPILOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 3900911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 3901911991d2SPhilip Reames; EPILOG: latch.3: 3902911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 3903911991d2SPhilip Reames; EPILOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 3904911991d2SPhilip Reames; EPILOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 3905911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1 390637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 390772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 3908911991d2SPhilip Reames; EPILOG: for.exiting_block.4: 3909911991d2SPhilip Reames; EPILOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 3910911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 3911911991d2SPhilip Reames; EPILOG: latch.4: 3912911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 3913911991d2SPhilip Reames; EPILOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 3914911991d2SPhilip Reames; EPILOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 3915911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1 391637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 391772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 3918911991d2SPhilip Reames; EPILOG: for.exiting_block.5: 3919911991d2SPhilip Reames; EPILOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 3920911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 3921911991d2SPhilip Reames; EPILOG: latch.5: 3922911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 3923911991d2SPhilip Reames; EPILOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 3924911991d2SPhilip Reames; EPILOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 3925911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1 392637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 392772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 3928911991d2SPhilip Reames; EPILOG: for.exiting_block.6: 3929911991d2SPhilip Reames; EPILOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 3930911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 3931911991d2SPhilip Reames; EPILOG: latch.6: 3932911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 3933911991d2SPhilip Reames; EPILOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 3934911991d2SPhilip Reames; EPILOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 3935911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1 393637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 393772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 3938911991d2SPhilip Reames; EPILOG: for.exiting_block.7: 3939911991d2SPhilip Reames; EPILOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 3940911991d2SPhilip Reames; EPILOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 3941cee313d2SEric Christopher; EPILOG: latch.7: 3942911991d2SPhilip Reames; EPILOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 3943911991d2SPhilip Reames; EPILOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 3944911991d2SPhilip Reames; EPILOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 3945911991d2SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 394637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 394737ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter 3948911991d2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header 3949de2fed61SPhilip Reames; EPILOG: latch_exit.unr-lcssa.loopexit: 3950de2fed61SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ] 3951de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ] 3952de2fed61SPhilip Reames; EPILOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ] 3953de2fed61SPhilip Reames; EPILOG-NEXT: br label %latch_exit.unr-lcssa 3954de2fed61SPhilip Reames; EPILOG: latch_exit.unr-lcssa: 3955de2fed61SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 3956de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3957de2fed61SPhilip Reames; EPILOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 3958de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 3959de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 3960de2fed61SPhilip Reames; EPILOG: header.epil.preheader: 3961de2fed61SPhilip Reames; EPILOG-NEXT: br label %header.epil 3962de2fed61SPhilip Reames; EPILOG: header.epil: 3963de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ] 3964de2fed61SPhilip Reames; EPILOG-NEXT: %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ] 396537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 3966de2fed61SPhilip Reames; EPILOG-NEXT: br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil 3967de2fed61SPhilip Reames; EPILOG: for.exiting_block.epil: 3968de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp eq i64 %n, 42 3969de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil 3970de2fed61SPhilip Reames; EPILOG: latch.epil: 3971de2fed61SPhilip Reames; EPILOG-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil 3972de2fed61SPhilip Reames; EPILOG-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 3973de2fed61SPhilip Reames; EPILOG-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.epil 3974de2fed61SPhilip Reames; EPILOG-NEXT: %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1 3975de2fed61SPhilip Reames; EPILOG-NEXT: %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n 397637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 397737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 3978da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10 3979de2fed61SPhilip Reames; EPILOG: latch_exit.epilog-lcssa: 3980de2fed61SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ] 3981de2fed61SPhilip Reames; EPILOG-NEXT: br label %latch_exit 3982de2fed61SPhilip Reames; EPILOG: latch_exit: 3983de2fed61SPhilip Reames; EPILOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ] 3984de2fed61SPhilip Reames; EPILOG-NEXT: ret i32 %sum.0.lcssa 3985de2fed61SPhilip Reames; EPILOG: for.exit2.loopexit: 398672031407SPhilip Reames; EPILOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ] 3987de2fed61SPhilip Reames; EPILOG-NEXT: br label %for.exit2 3988de2fed61SPhilip Reames; EPILOG: for.exit2.loopexit2: 3989de2fed61SPhilip Reames; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ] 3990de2fed61SPhilip Reames; EPILOG-NEXT: br label %for.exit2 3991de2fed61SPhilip Reames; EPILOG: for.exit2: 3992de2fed61SPhilip Reames; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ] 3993de2fed61SPhilip Reames; EPILOG-NEXT: %addx = add i32 %retval, %x 3994de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 3995de2fed61SPhilip Reames; EPILOG: exit_true: 3996de2fed61SPhilip Reames; EPILOG-NEXT: ret i32 %retval 3997de2fed61SPhilip Reames; EPILOG: exit_false: 3998de2fed61SPhilip Reames; EPILOG-NEXT: ret i32 %addx 3999911991d2SPhilip Reames; 4000911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test6( 4001911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 4002*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n 4003*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 4004*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4005*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4006323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new 4007911991d2SPhilip Reames; EPILOG-BLOCK: entry.new: 4008*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4009911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 4010911991d2SPhilip Reames; EPILOG-BLOCK: header: 4011911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 4012911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ] 401337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ] 4014911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4015911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block: 4016911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 4017911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4018911991d2SPhilip Reames; EPILOG-BLOCK: latch: 4019911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4020911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 4021911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 4022911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 402337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 402472031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4025de2fed61SPhilip Reames; EPILOG-BLOCK: for.exiting_block.1: 4026de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4027de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4028de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 4029de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4030de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4031de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4032de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 403337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 403437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter 4035da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10 4036911991d2SPhilip Reames; EPILOG-BLOCK: latch_exit.unr-lcssa.loopexit: 4037911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ] 4038911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ] 4039911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ] 4040911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latch_exit.unr-lcssa 4041911991d2SPhilip Reames; EPILOG-BLOCK: latch_exit.unr-lcssa: 4042911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ] 4043911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4044911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ] 4045911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4046911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit 4047911991d2SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 4048911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 4049911991d2SPhilip Reames; EPILOG-BLOCK: header.epil: 4050911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.epil 4051911991d2SPhilip Reames; EPILOG-BLOCK: for.exiting_block.epil: 4052911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp.epil = icmp eq i64 %n, 42 4053911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp.epil, label %for.exit2, label %latch.epil 4054911991d2SPhilip Reames; EPILOG-BLOCK: latch.epil: 4055b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr 4056911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %load.epil = load i32, i32* %arrayidx.epil, align 4 4057b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %add.epil = add nsw i32 %load.epil, %sum.02.unr 4058911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latch_exit 4059911991d2SPhilip Reames; EPILOG-BLOCK: latch_exit: 4060b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ] 4061911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4062911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2.loopexit: 406372031407SPhilip Reames; EPILOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4064911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %for.exit2 4065911991d2SPhilip Reames; EPILOG-BLOCK: for.exit2: 4066b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT: %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ] 4067911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4068911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4069911991d2SPhilip Reames; EPILOG-BLOCK: exit_true: 4070911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %retval 4071911991d2SPhilip Reames; EPILOG-BLOCK: exit_false: 4072911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %addx 4073911991d2SPhilip Reames; 4074911991d2SPhilip Reames; PROLOG-LABEL: @test6( 4075911991d2SPhilip Reames; PROLOG-NEXT: entry: 4076*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %n 4077*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 4078*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4079911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4080*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4081911991d2SPhilip Reames; PROLOG: header.prol.preheader: 4082911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol 4083911991d2SPhilip Reames; PROLOG: header.prol: 4084911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ] 4085911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ] 408637ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4087911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol 4088911991d2SPhilip Reames; PROLOG: for.exiting_block.prol: 4089911991d2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp eq i64 %n, 42 4090911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol 4091911991d2SPhilip Reames; PROLOG: latch.prol: 4092911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol 4093911991d2SPhilip Reames; PROLOG-NEXT: %load.prol = load i32, i32* %arrayidx.prol, align 4 4094911991d2SPhilip Reames; PROLOG-NEXT: %add.prol = add nsw i32 %load.prol, %sum.02.prol 4095911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1 4096911991d2SPhilip Reames; PROLOG-NEXT: %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n 409737ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 409837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4099da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10 4100911991d2SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 4101911991d2SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4102911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ] 4103911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ] 4104911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 4105911991d2SPhilip Reames; PROLOG: header.prol.loopexit: 4106911991d2SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ] 4107911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ] 4108911991d2SPhilip Reames; PROLOG-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ] 4109*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4110323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %latch_exit, label %entry.new 4111911991d2SPhilip Reames; PROLOG: entry.new: 4112911991d2SPhilip Reames; PROLOG-NEXT: br label %header 4113911991d2SPhilip Reames; PROLOG: header: 4114911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] 4115911991d2SPhilip Reames; PROLOG-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ] 4116911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4117911991d2SPhilip Reames; PROLOG: for.exiting_block: 4118911991d2SPhilip Reames; PROLOG-NEXT: %cmp = icmp eq i64 %n, 42 4119911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4120911991d2SPhilip Reames; PROLOG: latch: 4121911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4122911991d2SPhilip Reames; PROLOG-NEXT: %load = load i32, i32* %arrayidx, align 4 4123911991d2SPhilip Reames; PROLOG-NEXT: %add = add nsw i32 %load, %sum.02 4124911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 412572031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4126911991d2SPhilip Reames; PROLOG: for.exiting_block.1: 4127911991d2SPhilip Reames; PROLOG-NEXT: %cmp.1 = icmp eq i64 %n, 42 4128911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4129911991d2SPhilip Reames; PROLOG: latch.1: 4130911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4131911991d2SPhilip Reames; PROLOG-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4132911991d2SPhilip Reames; PROLOG-NEXT: %add.1 = add nsw i32 %load.1, %add 4133911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 413472031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2 4135911991d2SPhilip Reames; PROLOG: for.exiting_block.2: 4136911991d2SPhilip Reames; PROLOG-NEXT: %cmp.2 = icmp eq i64 %n, 42 4137911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2 4138911991d2SPhilip Reames; PROLOG: latch.2: 4139911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1 4140911991d2SPhilip Reames; PROLOG-NEXT: %load.2 = load i32, i32* %arrayidx.2, align 4 4141911991d2SPhilip Reames; PROLOG-NEXT: %add.2 = add nsw i32 %load.2, %add.1 4142911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1 414372031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3 4144911991d2SPhilip Reames; PROLOG: for.exiting_block.3: 4145911991d2SPhilip Reames; PROLOG-NEXT: %cmp.3 = icmp eq i64 %n, 42 4146911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3 4147911991d2SPhilip Reames; PROLOG: latch.3: 4148911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2 4149911991d2SPhilip Reames; PROLOG-NEXT: %load.3 = load i32, i32* %arrayidx.3, align 4 4150911991d2SPhilip Reames; PROLOG-NEXT: %add.3 = add nsw i32 %load.3, %add.2 4151911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1 415272031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4 4153911991d2SPhilip Reames; PROLOG: for.exiting_block.4: 4154911991d2SPhilip Reames; PROLOG-NEXT: %cmp.4 = icmp eq i64 %n, 42 4155911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4 4156911991d2SPhilip Reames; PROLOG: latch.4: 4157911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3 4158911991d2SPhilip Reames; PROLOG-NEXT: %load.4 = load i32, i32* %arrayidx.4, align 4 4159911991d2SPhilip Reames; PROLOG-NEXT: %add.4 = add nsw i32 %load.4, %add.3 4160911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1 416172031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5 4162911991d2SPhilip Reames; PROLOG: for.exiting_block.5: 4163911991d2SPhilip Reames; PROLOG-NEXT: %cmp.5 = icmp eq i64 %n, 42 4164911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5 4165911991d2SPhilip Reames; PROLOG: latch.5: 4166911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4 4167911991d2SPhilip Reames; PROLOG-NEXT: %load.5 = load i32, i32* %arrayidx.5, align 4 4168911991d2SPhilip Reames; PROLOG-NEXT: %add.5 = add nsw i32 %load.5, %add.4 4169911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1 417072031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6 4171911991d2SPhilip Reames; PROLOG: for.exiting_block.6: 4172911991d2SPhilip Reames; PROLOG-NEXT: %cmp.6 = icmp eq i64 %n, 42 4173911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6 4174911991d2SPhilip Reames; PROLOG: latch.6: 4175911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5 4176911991d2SPhilip Reames; PROLOG-NEXT: %load.6 = load i32, i32* %arrayidx.6, align 4 4177911991d2SPhilip Reames; PROLOG-NEXT: %add.6 = add nsw i32 %load.6, %add.5 4178911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1 417972031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7 4180911991d2SPhilip Reames; PROLOG: for.exiting_block.7: 4181911991d2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp eq i64 %n, 42 4182911991d2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7 4183cee313d2SEric Christopher; PROLOG: latch.7: 4184911991d2SPhilip Reames; PROLOG-NEXT: %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6 4185911991d2SPhilip Reames; PROLOG-NEXT: %load.7 = load i32, i32* %arrayidx.7, align 4 4186911991d2SPhilip Reames; PROLOG-NEXT: %add.7 = add nsw i32 %load.7, %add.6 4187911991d2SPhilip Reames; PROLOG-NEXT: %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1 4188911991d2SPhilip Reames; PROLOG-NEXT: %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n 4189911991d2SPhilip Reames; PROLOG-NEXT: br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header 4190de2fed61SPhilip Reames; PROLOG: latch_exit.unr-lcssa: 4191de2fed61SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ] 4192de2fed61SPhilip Reames; PROLOG-NEXT: br label %latch_exit 4193de2fed61SPhilip Reames; PROLOG: latch_exit: 4194de2fed61SPhilip Reames; PROLOG-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4195de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %sum.0.lcssa 4196de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit: 419772031407SPhilip Reames; PROLOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ] 4198de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 4199de2fed61SPhilip Reames; PROLOG: for.exit2.loopexit1: 4200de2fed61SPhilip Reames; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ] 4201de2fed61SPhilip Reames; PROLOG-NEXT: br label %for.exit2 4202de2fed61SPhilip Reames; PROLOG: for.exit2: 4203de2fed61SPhilip Reames; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ] 4204de2fed61SPhilip Reames; PROLOG-NEXT: %addx = add i32 %retval, %x 4205de2fed61SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false 4206de2fed61SPhilip Reames; PROLOG: exit_true: 4207de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %retval 4208de2fed61SPhilip Reames; PROLOG: exit_false: 4209de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %addx 4210911991d2SPhilip Reames; 4211911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test6( 4212911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 4213*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n 4214*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 4215*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4216911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4217*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4218911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 4219911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 4220911991d2SPhilip Reames; PROLOG-BLOCK: header.prol: 4221911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2, label %for.exiting_block.prol 4222911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block.prol: 4223911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.prol = icmp eq i64 %n, 42 4224911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.prol, label %for.exit2, label %latch.prol 4225911991d2SPhilip Reames; PROLOG-BLOCK: latch.prol: 4226b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %load.prol = load i32, i32* %a, align 4 4227911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4228911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 4229b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ] 4230b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] 4231b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ] 4232*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4233323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %latch_exit, label %entry.new 4234911991d2SPhilip Reames; PROLOG-BLOCK: entry.new: 4235911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 4236911991d2SPhilip Reames; PROLOG-BLOCK: header: 4237911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ] 4238911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ] 4239911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block 4240911991d2SPhilip Reames; PROLOG-BLOCK: for.exiting_block: 4241911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp = icmp eq i64 %n, 42 4242911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp, label %for.exit2.loopexit, label %latch 4243911991d2SPhilip Reames; PROLOG-BLOCK: latch: 4244911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4245911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %load = load i32, i32* %arrayidx, align 4 4246911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %add = add nsw i32 %load, %sum.02 4247911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next = add i64 %indvars.iv, 1 424872031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1 4249de2fed61SPhilip Reames; PROLOG-BLOCK: for.exiting_block.1: 4250de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp eq i64 %n, 42 4251de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1 4252de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 4253de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next 4254de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %load.1 = load i32, i32* %arrayidx.1, align 4 4255de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %add.1 = add nsw i32 %load.1, %add 4256de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %indvars.iv.next.1 = add i64 %indvars.iv.next, 1 4257de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n 4258da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10 4259911991d2SPhilip Reames; PROLOG-BLOCK: latch_exit.unr-lcssa: 4260911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ] 4261911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latch_exit 4262911991d2SPhilip Reames; PROLOG-BLOCK: latch_exit: 4263911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ] 4264911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %sum.0.lcssa 4265911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2.loopexit: 426672031407SPhilip Reames; PROLOG-BLOCK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ] 4267911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %for.exit2 4268911991d2SPhilip Reames; PROLOG-BLOCK: for.exit2: 4269911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ] 4270911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %addx = add i32 %retval, %x 4271911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %exit_true, label %exit_false 4272911991d2SPhilip Reames; PROLOG-BLOCK: exit_true: 4273911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %retval 4274911991d2SPhilip Reames; PROLOG-BLOCK: exit_false: 4275911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %addx 4276911991d2SPhilip Reames; 4277911991d2SPhilip Reames 4278cee313d2SEric Christopherentry: 4279cee313d2SEric Christopher br label %header 4280cee313d2SEric Christopher 4281cee313d2SEric Christopherheader: 4282cee313d2SEric Christopher %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] 4283cee313d2SEric Christopher %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] 4284cee313d2SEric Christopher br i1 false, label %for.exit2, label %for.exiting_block 4285cee313d2SEric Christopher 4286cee313d2SEric Christopherfor.exiting_block: 4287cee313d2SEric Christopher %cmp = icmp eq i64 %n, 42 4288cee313d2SEric Christopher br i1 %cmp, label %for.exit2, label %latch 4289cee313d2SEric Christopher 4290cee313d2SEric Christopherlatch: 4291cee313d2SEric Christopher %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 4292cee313d2SEric Christopher %load = load i32, i32* %arrayidx, align 4 4293cee313d2SEric Christopher %add = add nsw i32 %load, %sum.02 4294cee313d2SEric Christopher %indvars.iv.next = add i64 %indvars.iv, 1 4295cee313d2SEric Christopher %exitcond = icmp eq i64 %indvars.iv.next, %n 4296cee313d2SEric Christopher br i1 %exitcond, label %latch_exit, label %header 4297cee313d2SEric Christopher 4298cee313d2SEric Christopherlatch_exit: 4299cee313d2SEric Christopher %sum.0.lcssa = phi i32 [ %add, %latch ] 4300cee313d2SEric Christopher ret i32 %sum.0.lcssa 4301cee313d2SEric Christopher 4302cee313d2SEric Christopherfor.exit2: 4303cee313d2SEric Christopher %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ] 4304cee313d2SEric Christopher %addx = add i32 %retval, %x 4305cee313d2SEric Christopher br i1 %cond, label %exit_true, label %exit_false 4306cee313d2SEric Christopher 4307cee313d2SEric Christopherexit_true: 4308cee313d2SEric Christopher ret i32 %retval 4309cee313d2SEric Christopher 4310cee313d2SEric Christopherexit_false: 4311cee313d2SEric Christopher ret i32 %addx 4312cee313d2SEric Christopher} 4313cee313d2SEric Christopher 4314cee313d2SEric Christopher; test when value in exit block does not have VMap. 4315cee313d2SEric Christopherdefine i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { 4316911991d2SPhilip Reames; EPILOG-LABEL: @test7( 4317911991d2SPhilip Reames; EPILOG-NEXT: bb: 4318911991d2SPhilip Reames; EPILOG-NEXT: %i = icmp slt i32 undef, 2 4319911991d2SPhilip Reames; EPILOG-NEXT: %sext = sext i32 undef to i64 4320911991d2SPhilip Reames; EPILOG-NEXT: %shft = ashr exact i32 %arg, 16 4321911991d2SPhilip Reames; EPILOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4322911991d2SPhilip Reames; EPILOG: preheader: 4323911991d2SPhilip Reames; EPILOG-NEXT: %0 = add nsw i64 %sext, -1 4324*81c648a3SNikita Popov; EPILOG-NEXT: %1 = freeze i64 %0 4325*81c648a3SNikita Popov; EPILOG-NEXT: %2 = add i64 %1, -1 4326*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %1, 7 4327*81c648a3SNikita Popov; EPILOG-NEXT: %3 = icmp ult i64 %2, 7 4328323514deSNikita Popov; EPILOG-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new 4329911991d2SPhilip Reames; EPILOG: preheader.new: 4330*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %1, %xtraiter 4331911991d2SPhilip Reames; EPILOG-NEXT: br label %header 4332911991d2SPhilip Reames; EPILOG: header: 4333911991d2SPhilip Reames; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] 433437ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4335911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4336911991d2SPhilip Reames; EPILOG: latch: 4337911991d2SPhilip Reames; EPILOG-NEXT: %add = add nuw nsw i64 %i6, 1 433837ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 433972031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4340de2fed61SPhilip Reames; EPILOG: latch.1: 4341de2fed61SPhilip Reames; EPILOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 434237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 434372031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4344de2fed61SPhilip Reames; EPILOG: latch.2: 4345de2fed61SPhilip Reames; EPILOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 434637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 434772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4348de2fed61SPhilip Reames; EPILOG: latch.3: 4349de2fed61SPhilip Reames; EPILOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 435037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 435172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4352de2fed61SPhilip Reames; EPILOG: latch.4: 4353de2fed61SPhilip Reames; EPILOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 435437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 435572031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4356de2fed61SPhilip Reames; EPILOG: latch.5: 4357de2fed61SPhilip Reames; EPILOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 435837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 435972031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4360de2fed61SPhilip Reames; EPILOG: latch.6: 4361de2fed61SPhilip Reames; EPILOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 436237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 436372031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4364de2fed61SPhilip Reames; EPILOG: latch.7: 4365de2fed61SPhilip Reames; EPILOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 436637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 436737ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4368de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit 4369911991d2SPhilip Reames; EPILOG: latchexit.unr-lcssa.loopexit: 4370911991d2SPhilip Reames; EPILOG-NEXT: %i6.unr.ph = phi i64 [ %add.7, %latch.7 ] 4371911991d2SPhilip Reames; EPILOG-NEXT: br label %latchexit.unr-lcssa 4372911991d2SPhilip Reames; EPILOG: latchexit.unr-lcssa: 4373911991d2SPhilip Reames; EPILOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ] 4374911991d2SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4375911991d2SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4376911991d2SPhilip Reames; EPILOG: header.epil.preheader: 4377911991d2SPhilip Reames; EPILOG-NEXT: br label %header.epil 4378911991d2SPhilip Reames; EPILOG: header.epil: 4379911991d2SPhilip Reames; EPILOG-NEXT: %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ] 438037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4381911991d2SPhilip Reames; EPILOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.epil 4382911991d2SPhilip Reames; EPILOG: latch.epil: 4383911991d2SPhilip Reames; EPILOG-NEXT: %add.epil = add nuw nsw i64 %i6.epil, 1 4384911991d2SPhilip Reames; EPILOG-NEXT: %i9.epil = icmp slt i64 %add.epil, %sext 438537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 438637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4387da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11 4388911991d2SPhilip Reames; EPILOG: latchexit.epilog-lcssa: 4389911991d2SPhilip Reames; EPILOG-NEXT: br label %latchexit 4390911991d2SPhilip Reames; EPILOG: latchexit: 4391911991d2SPhilip Reames; EPILOG-NEXT: unreachable 4392911991d2SPhilip Reames; EPILOG: loopexit2: 4393911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %shft 4394911991d2SPhilip Reames; EPILOG: loopexit1.loopexit: 439572031407SPhilip Reames; EPILOG-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ] 4396911991d2SPhilip Reames; EPILOG-NEXT: br label %loopexit1 4397911991d2SPhilip Reames; EPILOG: loopexit1.loopexit1: 4398911991d2SPhilip Reames; EPILOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ] 4399911991d2SPhilip Reames; EPILOG-NEXT: br label %loopexit1 4400911991d2SPhilip Reames; EPILOG: loopexit1: 4401911991d2SPhilip Reames; EPILOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4402911991d2SPhilip Reames; EPILOG-NEXT: ret i32 %sext3 4403911991d2SPhilip Reames; 4404911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test7( 4405911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: bb: 4406911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4407911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4408911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4409911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4410911991d2SPhilip Reames; EPILOG-BLOCK: preheader: 4411911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4412*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = freeze i64 %0 4413*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = add i64 %1, -1 4414*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 4415*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 4416323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new 4417911991d2SPhilip Reames; EPILOG-BLOCK: preheader.new: 4418*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %1, %xtraiter 4419911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 4420911991d2SPhilip Reames; EPILOG-BLOCK: header: 4421911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] 442237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 4423911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4424911991d2SPhilip Reames; EPILOG-BLOCK: latch: 4425911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 442637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 442772031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4428de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 4429de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 443037ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 443137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4432da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11 4433911991d2SPhilip Reames; EPILOG-BLOCK: latchexit.unr-lcssa.loopexit: 4434911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchexit.unr-lcssa 4435911991d2SPhilip Reames; EPILOG-BLOCK: latchexit.unr-lcssa: 4436911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4437911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit 4438911991d2SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 4439911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 4440911991d2SPhilip Reames; EPILOG-BLOCK: header.epil: 4441911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.epil 4442911991d2SPhilip Reames; EPILOG-BLOCK: latch.epil: 4443911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %latchexit 4444911991d2SPhilip Reames; EPILOG-BLOCK: latchexit: 4445911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: unreachable 4446911991d2SPhilip Reames; EPILOG-BLOCK: loopexit2: 4447911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %shft 4448911991d2SPhilip Reames; EPILOG-BLOCK: loopexit1.loopexit: 444972031407SPhilip Reames; EPILOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4450911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loopexit1 4451911991d2SPhilip Reames; EPILOG-BLOCK: loopexit1: 4452911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ] 4453911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i32 %sext3 4454911991d2SPhilip Reames; 4455911991d2SPhilip Reames; PROLOG-LABEL: @test7( 4456911991d2SPhilip Reames; PROLOG-NEXT: bb: 4457911991d2SPhilip Reames; PROLOG-NEXT: %i = icmp slt i32 undef, 2 4458911991d2SPhilip Reames; PROLOG-NEXT: %sext = sext i32 undef to i64 4459911991d2SPhilip Reames; PROLOG-NEXT: %shft = ashr exact i32 %arg, 16 4460911991d2SPhilip Reames; PROLOG-NEXT: br i1 %i, label %loopexit2, label %preheader 4461911991d2SPhilip Reames; PROLOG: preheader: 4462911991d2SPhilip Reames; PROLOG-NEXT: %0 = add nsw i64 %sext, -1 4463*81c648a3SNikita Popov; PROLOG-NEXT: %1 = freeze i64 %0 4464*81c648a3SNikita Popov; PROLOG-NEXT: %2 = add i64 %1, -1 4465*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %1, 7 4466911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4467*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4468911991d2SPhilip Reames; PROLOG: header.prol.preheader: 4469911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol 4470911991d2SPhilip Reames; PROLOG: header.prol: 4471911991d2SPhilip Reames; PROLOG-NEXT: %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ] 447237ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4473911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit1, label %latch.prol 4474911991d2SPhilip Reames; PROLOG: latch.prol: 4475911991d2SPhilip Reames; PROLOG-NEXT: %add.prol = add nuw nsw i64 %i6.prol, 1 4476911991d2SPhilip Reames; PROLOG-NEXT: %i9.prol = icmp slt i64 %add.prol, %sext 447737ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 447837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4479da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11 4480911991d2SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 4481911991d2SPhilip Reames; PROLOG-NEXT: %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ] 4482911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 4483911991d2SPhilip Reames; PROLOG: header.prol.loopexit: 4484911991d2SPhilip Reames; PROLOG-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ] 4485*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i64 %2, 7 4486323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %latchexit, label %preheader.new 4487911991d2SPhilip Reames; PROLOG: preheader.new: 4488911991d2SPhilip Reames; PROLOG-NEXT: br label %header 4489911991d2SPhilip Reames; PROLOG: header: 4490911991d2SPhilip Reames; PROLOG-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ] 4491911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4492911991d2SPhilip Reames; PROLOG: latch: 4493911991d2SPhilip Reames; PROLOG-NEXT: %add = add nuw nsw i64 %i6, 1 449472031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4495911991d2SPhilip Reames; PROLOG: latch.1: 4496911991d2SPhilip Reames; PROLOG-NEXT: %add.1 = add nuw nsw i64 %add, 1 449772031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.2 4498911991d2SPhilip Reames; PROLOG: latch.2: 4499911991d2SPhilip Reames; PROLOG-NEXT: %add.2 = add nuw nsw i64 %add.1, 1 450072031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.3 4501911991d2SPhilip Reames; PROLOG: latch.3: 4502911991d2SPhilip Reames; PROLOG-NEXT: %add.3 = add nuw nsw i64 %add.2, 1 450372031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.4 4504911991d2SPhilip Reames; PROLOG: latch.4: 4505911991d2SPhilip Reames; PROLOG-NEXT: %add.4 = add nuw nsw i64 %add.3, 1 450672031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.5 4507911991d2SPhilip Reames; PROLOG: latch.5: 4508911991d2SPhilip Reames; PROLOG-NEXT: %add.5 = add nuw nsw i64 %add.4, 1 450972031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.6 4510911991d2SPhilip Reames; PROLOG: latch.6: 4511911991d2SPhilip Reames; PROLOG-NEXT: %add.6 = add nuw nsw i64 %add.5, 1 451272031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.7 4513911991d2SPhilip Reames; PROLOG: latch.7: 4514911991d2SPhilip Reames; PROLOG-NEXT: %add.7 = add nuw nsw i64 %add.6, 1 4515911991d2SPhilip Reames; PROLOG-NEXT: %i9.7 = icmp slt i64 %add.7, %sext 4516911991d2SPhilip Reames; PROLOG-NEXT: br i1 %i9.7, label %header, label %latchexit.unr-lcssa 4517de2fed61SPhilip Reames; PROLOG: latchexit.unr-lcssa: 4518de2fed61SPhilip Reames; PROLOG-NEXT: br label %latchexit 4519de2fed61SPhilip Reames; PROLOG: latchexit: 4520de2fed61SPhilip Reames; PROLOG-NEXT: unreachable 4521de2fed61SPhilip Reames; PROLOG: loopexit2: 4522de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %shft 4523de2fed61SPhilip Reames; PROLOG: loopexit1.loopexit: 452472031407SPhilip Reames; PROLOG-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ] 4525de2fed61SPhilip Reames; PROLOG-NEXT: br label %loopexit1 4526de2fed61SPhilip Reames; PROLOG: loopexit1.loopexit1: 4527de2fed61SPhilip Reames; PROLOG-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.prol ] 4528de2fed61SPhilip Reames; PROLOG-NEXT: br label %loopexit1 4529de2fed61SPhilip Reames; PROLOG: loopexit1: 4530de2fed61SPhilip Reames; PROLOG-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ] 4531de2fed61SPhilip Reames; PROLOG-NEXT: ret i32 %sext3 4532911991d2SPhilip Reames; 4533911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test7( 4534911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: bb: 4535911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i = icmp slt i32 undef, 2 4536911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sext = sext i32 undef to i64 4537911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %shft = ashr exact i32 %arg, 16 4538911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %i, label %loopexit2, label %preheader 4539911991d2SPhilip Reames; PROLOG-BLOCK: preheader: 4540911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %0 = add nsw i64 %sext, -1 4541*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = freeze i64 %0 4542*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = add i64 %1, -1 4543*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 4544911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4545*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 4546911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 4547911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 4548911991d2SPhilip Reames; PROLOG-BLOCK: header.prol: 4549911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1, label %latch.prol 4550911991d2SPhilip Reames; PROLOG-BLOCK: latch.prol: 4551911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 4552911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 4553b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ] 4554*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 4555323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %latchexit, label %preheader.new 4556911991d2SPhilip Reames; PROLOG-BLOCK: preheader.new: 4557911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 4558911991d2SPhilip Reames; PROLOG-BLOCK: header: 4559911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ] 4560911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch 4561911991d2SPhilip Reames; PROLOG-BLOCK: latch: 4562911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %add = add nuw nsw i64 %i6, 1 456372031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %loopexit1.loopexit, label %latch.1 4564de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 4565de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %add.1 = add nuw nsw i64 %add, 1 4566de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i9.1 = icmp slt i64 %add.1, %sext 4567da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11 4568911991d2SPhilip Reames; PROLOG-BLOCK: latchexit.unr-lcssa: 4569911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %latchexit 4570911991d2SPhilip Reames; PROLOG-BLOCK: latchexit: 4571911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: unreachable 4572911991d2SPhilip Reames; PROLOG-BLOCK: loopexit2: 4573911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %shft 4574911991d2SPhilip Reames; PROLOG-BLOCK: loopexit1.loopexit: 457572031407SPhilip Reames; PROLOG-BLOCK-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ] 4576911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loopexit1 4577911991d2SPhilip Reames; PROLOG-BLOCK: loopexit1: 4578911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ] 4579911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i32 %sext3 4580911991d2SPhilip Reames; 4581cee313d2SEric Christopherbb: 458217a15c32SRoman Lebedev %i = icmp slt i32 undef, 2 4583cee313d2SEric Christopher %sext = sext i32 undef to i64 4584cee313d2SEric Christopher %shft = ashr exact i32 %arg, 16 458517a15c32SRoman Lebedev br i1 %i, label %loopexit2, label %preheader 4586cee313d2SEric Christopher 4587cee313d2SEric Christopherpreheader: ; preds = %bb2 4588cee313d2SEric Christopher br label %header 4589cee313d2SEric Christopher 4590cee313d2SEric Christopherheader: ; preds = %latch, %preheader 459117a15c32SRoman Lebedev %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ] 4592cee313d2SEric Christopher br i1 false, label %loopexit1, label %latch 4593cee313d2SEric Christopher 4594cee313d2SEric Christopherlatch: ; preds = %header 459517a15c32SRoman Lebedev %add = add nuw nsw i64 %i6, 1 459617a15c32SRoman Lebedev %i9 = icmp slt i64 %add, %sext 459717a15c32SRoman Lebedev br i1 %i9, label %header, label %latchexit 4598cee313d2SEric Christopher 4599cee313d2SEric Christopherlatchexit: ; preds = %latch 4600cee313d2SEric Christopher unreachable 4601cee313d2SEric Christopher 4602cee313d2SEric Christopherloopexit2: ; preds = %bb2 4603cee313d2SEric Christopher ret i32 %shft 4604cee313d2SEric Christopher 4605cee313d2SEric Christopherloopexit1: ; preds = %header 4606cee313d2SEric Christopher %sext3 = phi i32 [ %shft, %header ] 4607cee313d2SEric Christopher ret i32 %sext3 4608cee313d2SEric Christopher} 4609cee313d2SEric Christopher 4610fa82a3d0SPhilip Reames; Nested loop and inner loop is unrolled. The tricky bit here is that 4611fa82a3d0SPhilip Reames; several blocks in the inner loop fall out of the outer block when we 4612fa82a3d0SPhilip Reames; use the epilogue block remainder strategy. 4613cee313d2SEric Christopherdefine void @test8() { 4614911991d2SPhilip Reames; EPILOG-LABEL: @test8( 4615911991d2SPhilip Reames; EPILOG-NEXT: bb: 4616911991d2SPhilip Reames; EPILOG-NEXT: br label %outerloop 4617fa82a3d0SPhilip Reames; EPILOG: outerloop.loopexit.loopexit: 4618fa82a3d0SPhilip Reames; EPILOG-NEXT: br label %outerloop.loopexit 4619fa82a3d0SPhilip Reames; EPILOG: outerloop.loopexit.loopexit1: 4620fa82a3d0SPhilip Reames; EPILOG-NEXT: br label %outerloop.loopexit 4621911991d2SPhilip Reames; EPILOG: outerloop.loopexit: 4622911991d2SPhilip Reames; EPILOG-NEXT: br label %outerloop 4623911991d2SPhilip Reames; EPILOG: outerloop: 4624911991d2SPhilip Reames; EPILOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4625fa82a3d0SPhilip Reames; EPILOG-NEXT: %0 = sub i64 100, %i 4626fa82a3d0SPhilip Reames; EPILOG-NEXT: %1 = sub i64 99, %i 4627fa82a3d0SPhilip Reames; EPILOG-NEXT: %xtraiter = and i64 %0, 7 4628fa82a3d0SPhilip Reames; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 4629fa82a3d0SPhilip Reames; EPILOG-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4630fa82a3d0SPhilip Reames; EPILOG: outerloop.new: 4631fa82a3d0SPhilip Reames; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4632911991d2SPhilip Reames; EPILOG-NEXT: br label %innerH 4633911991d2SPhilip Reames; EPILOG: innerH: 4634fa82a3d0SPhilip Reames; EPILOG-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ] 463537ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ] 4636911991d2SPhilip Reames; EPILOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4637fa82a3d0SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4638911991d2SPhilip Reames; EPILOG: latch: 463937ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4640fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 464172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4642fa82a3d0SPhilip Reames; EPILOG: latch.1: 464337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 4644fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 464572031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4646fa82a3d0SPhilip Reames; EPILOG: latch.2: 464737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 4648fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 464972031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4650fa82a3d0SPhilip Reames; EPILOG: latch.3: 465137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 4652fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 465372031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4654fa82a3d0SPhilip Reames; EPILOG: latch.4: 465537ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 4656fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 465772031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4658fa82a3d0SPhilip Reames; EPILOG: latch.5: 465937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 4660fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 466172031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4662fa82a3d0SPhilip Reames; EPILOG: latch.6: 466337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 4664fa82a3d0SPhilip Reames; EPILOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 466572031407SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 4666fa82a3d0SPhilip Reames; EPILOG: latch.7: 466737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 466837ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 4669fa82a3d0SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit 4670de2fed61SPhilip Reames; EPILOG: exit.unr-lcssa.loopexit: 4671de2fed61SPhilip Reames; EPILOG-NEXT: %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ] 4672de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit.unr-lcssa 4673de2fed61SPhilip Reames; EPILOG: exit.unr-lcssa: 4674de2fed61SPhilip Reames; EPILOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ] 4675de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4676de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4677de2fed61SPhilip Reames; EPILOG: innerH.epil.preheader: 4678de2fed61SPhilip Reames; EPILOG-NEXT: br label %innerH.epil 4679de2fed61SPhilip Reames; EPILOG: innerH.epil: 4680de2fed61SPhilip Reames; EPILOG-NEXT: %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ] 468137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ] 4682de2fed61SPhilip Reames; EPILOG-NEXT: %i4.epil = add nuw nsw i64 %i3.epil, 1 4683de2fed61SPhilip Reames; EPILOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil 4684de2fed61SPhilip Reames; EPILOG: latch.epil: 4685de2fed61SPhilip Reames; EPILOG-NEXT: %i6.epil = icmp ult i64 %i4.epil, 100 468637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 468737ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 4688da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12 4689de2fed61SPhilip Reames; EPILOG: exit.epilog-lcssa: 4690de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit 4691de2fed61SPhilip Reames; EPILOG: exit.loopexit: 4692de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit 4693de2fed61SPhilip Reames; EPILOG: exit: 4694de2fed61SPhilip Reames; EPILOG-NEXT: ret void 4695911991d2SPhilip Reames; 4696911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test8( 4697911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: bb: 4698911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloop 4699fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerloop.loopexit.loopexit: 4700fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit 4701911991d2SPhilip Reames; EPILOG-BLOCK: outerloop.loopexit: 4702fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1 4703fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerloop.new.1: 4704fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerH.1 4705fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerH.1: 4706fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 470737ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 470837ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %i4.12 = add nuw nsw i64 %i3.1, 1 470937ead201SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14 471037ead201SPhilip Reames; EPILOG-BLOCK: latch.14: 471137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.13 = add nuw nsw i64 %niter.1, 1 471237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.12, 1 471372031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4714911991d2SPhilip Reames; EPILOG-BLOCK: latch.1.1: 471537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i64 %niter.next.13, 1 471637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100 4717da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12 4718fa82a3d0SPhilip Reames; EPILOG-BLOCK: exit.unr-lcssa.loopexit.1: 4719fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa.1 4720fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerloop.loopexit.loopexit.1: 4721fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4722fa82a3d0SPhilip Reames; EPILOG-BLOCK: exit.unr-lcssa.1: 4723fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit 4724fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerH.epil.preheader.1: 4725fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerH.epil.1 4726fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerH.epil.1: 4727fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.epil 4728911991d2SPhilip Reames; EPILOG-BLOCK: outerloop.loopexit.1: 4729da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4730de2fed61SPhilip Reames; EPILOG-BLOCK: outerloop: 4731de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4732de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %0 = sub i64 100, %i 4733de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %1 = sub i64 99, %i 4734de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4735de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4736de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %2, label %exit.unr-lcssa, label %outerloop.new 4737de2fed61SPhilip Reames; EPILOG-BLOCK: outerloop.new: 4738de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 4739de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerH 4740de2fed61SPhilip Reames; EPILOG-BLOCK: innerH: 4741de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ] 474237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ] 4743de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4744de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4745de2fed61SPhilip Reames; EPILOG-BLOCK: latch: 474637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 4747de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 474872031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4749de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 475037ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 475137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 4752da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4753de2fed61SPhilip Reames; EPILOG-BLOCK: exit.unr-lcssa.loopexit: 4754de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit.unr-lcssa 4755de2fed61SPhilip Reames; EPILOG-BLOCK: exit.unr-lcssa: 4756de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4757de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit 4758de2fed61SPhilip Reames; EPILOG-BLOCK: innerH.epil.preheader: 4759de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerH.epil 4760de2fed61SPhilip Reames; EPILOG-BLOCK: innerH.epil: 4761de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.epil 4762de2fed61SPhilip Reames; EPILOG-BLOCK: latch.epil: 4763de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit 4764de2fed61SPhilip Reames; EPILOG-BLOCK: exit.loopexit: 4765de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit 4766de2fed61SPhilip Reames; EPILOG-BLOCK: exit: 4767de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 4768911991d2SPhilip Reames; 4769911991d2SPhilip Reames; PROLOG-LABEL: @test8( 4770911991d2SPhilip Reames; PROLOG-NEXT: bb: 4771911991d2SPhilip Reames; PROLOG-NEXT: br label %outerloop 4772911991d2SPhilip Reames; PROLOG: outerloop.loopexit.loopexit: 4773911991d2SPhilip Reames; PROLOG-NEXT: br label %outerloop.loopexit 4774911991d2SPhilip Reames; PROLOG: outerloop.loopexit.loopexit1: 4775911991d2SPhilip Reames; PROLOG-NEXT: br label %outerloop.loopexit 4776911991d2SPhilip Reames; PROLOG: outerloop.loopexit: 4777911991d2SPhilip Reames; PROLOG-NEXT: br label %outerloop 4778cee313d2SEric Christopher; PROLOG: outerloop: 4779911991d2SPhilip Reames; PROLOG-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ] 4780911991d2SPhilip Reames; PROLOG-NEXT: %0 = sub i64 100, %i 4781911991d2SPhilip Reames; PROLOG-NEXT: %1 = sub i64 99, %i 4782911991d2SPhilip Reames; PROLOG-NEXT: %xtraiter = and i64 %0, 7 4783911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4784911991d2SPhilip Reames; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4785911991d2SPhilip Reames; PROLOG: innerH.prol.preheader: 4786911991d2SPhilip Reames; PROLOG-NEXT: br label %innerH.prol 4787911991d2SPhilip Reames; PROLOG: innerH.prol: 4788911991d2SPhilip Reames; PROLOG-NEXT: %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ] 478937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ] 4790911991d2SPhilip Reames; PROLOG-NEXT: %i4.prol = add nuw nsw i64 %i3.prol, 1 4791911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol 4792911991d2SPhilip Reames; PROLOG: latch.prol: 4793911991d2SPhilip Reames; PROLOG-NEXT: %i6.prol = icmp ult i64 %i4.prol, 100 479437ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 479537ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 4796da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12 4797911991d2SPhilip Reames; PROLOG: innerH.prol.loopexit.unr-lcssa: 4798911991d2SPhilip Reames; PROLOG-NEXT: %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ] 4799911991d2SPhilip Reames; PROLOG-NEXT: br label %innerH.prol.loopexit 4800911991d2SPhilip Reames; PROLOG: innerH.prol.loopexit: 4801911991d2SPhilip Reames; PROLOG-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ] 4802911991d2SPhilip Reames; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 4803911991d2SPhilip Reames; PROLOG-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4804911991d2SPhilip Reames; PROLOG: outerloop.new: 4805911991d2SPhilip Reames; PROLOG-NEXT: br label %innerH 4806911991d2SPhilip Reames; PROLOG: innerH: 4807911991d2SPhilip Reames; PROLOG-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ] 4808911991d2SPhilip Reames; PROLOG-NEXT: %i4 = add nuw nsw i64 %i3, 1 4809911991d2SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4810911991d2SPhilip Reames; PROLOG: latch: 4811911991d2SPhilip Reames; PROLOG-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 481272031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4813911991d2SPhilip Reames; PROLOG: latch.1: 4814911991d2SPhilip Reames; PROLOG-NEXT: %i4.2 = add nuw nsw i64 %i4.1, 1 481572031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.2 4816911991d2SPhilip Reames; PROLOG: latch.2: 4817911991d2SPhilip Reames; PROLOG-NEXT: %i4.3 = add nuw nsw i64 %i4.2, 1 481872031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.3 4819911991d2SPhilip Reames; PROLOG: latch.3: 4820911991d2SPhilip Reames; PROLOG-NEXT: %i4.4 = add nuw nsw i64 %i4.3, 1 482172031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.4 4822911991d2SPhilip Reames; PROLOG: latch.4: 4823911991d2SPhilip Reames; PROLOG-NEXT: %i4.5 = add nuw nsw i64 %i4.4, 1 482472031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.5 4825911991d2SPhilip Reames; PROLOG: latch.5: 4826911991d2SPhilip Reames; PROLOG-NEXT: %i4.6 = add nuw nsw i64 %i4.5, 1 482772031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.6 4828cee313d2SEric Christopher; PROLOG: latch.6: 4829911991d2SPhilip Reames; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i4.6, 1 483072031407SPhilip Reames; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7 48310f22e783SRoman Lebedev; PROLOG: latch.7: 4832911991d2SPhilip Reames; PROLOG-NEXT: %i6.7 = icmp ult i64 %i4.7, 100 483317a15c32SRoman Lebedev; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa 4834de2fed61SPhilip Reames; PROLOG: exit.unr-lcssa: 4835de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit 4836de2fed61SPhilip Reames; PROLOG: exit.loopexit: 4837de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit 4838de2fed61SPhilip Reames; PROLOG: exit: 4839de2fed61SPhilip Reames; PROLOG-NEXT: ret void 4840911991d2SPhilip Reames; 4841911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test8( 4842911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: bb: 4843911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloop 4844911991d2SPhilip Reames; PROLOG-BLOCK: outerloop.loopexit.loopexit: 4845911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit 4846911991d2SPhilip Reames; PROLOG-BLOCK: outerloop.loopexit: 4847b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1 4848de2fed61SPhilip Reames; PROLOG-BLOCK: innerH.prol.preheader.1: 4849de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH.prol.1 4850de2fed61SPhilip Reames; PROLOG-BLOCK: innerH.prol.1: 4851de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.1, label %latch.prol.1 4852de2fed61SPhilip Reames; PROLOG-BLOCK: latch.prol.1: 4853de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit.1 4854de2fed61SPhilip Reames; PROLOG-BLOCK: innerH.prol.loopexit.1: 4855de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ] 4856de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %exit.loopexit, label %outerloop.new.1 4857de2fed61SPhilip Reames; PROLOG-BLOCK: outerloop.new.1: 4858de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH.1 4859de2fed61SPhilip Reames; PROLOG-BLOCK: innerH.1: 4860de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ] 4861de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i4.11 = add nuw nsw i64 %i3.1, 1 4862de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12 4863de2fed61SPhilip Reames; PROLOG-BLOCK: latch.12: 4864de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i4.1.1 = add nuw nsw i64 %i4.11, 1 486572031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1 4866de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1.1: 4867de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i6.1.1 = icmp ult i64 %i4.1.1, 100 4868da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12 4869de2fed61SPhilip Reames; PROLOG-BLOCK: outerloop.loopexit.loopexit.1: 4870de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloop.loopexit.1 4871de2fed61SPhilip Reames; PROLOG-BLOCK: outerloop.loopexit.1: 4872da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloop, !llvm.loop !13 4873911991d2SPhilip Reames; PROLOG-BLOCK: outerloop: 4874911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ] 4875911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %0 = sub i64 100, %i 4876911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %1 = sub i64 99, %i 4877911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 4878911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 4879b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit 4880911991d2SPhilip Reames; PROLOG-BLOCK: innerH.prol.preheader: 4881911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH.prol 4882911991d2SPhilip Reames; PROLOG-BLOCK: innerH.prol: 4883911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i4.prol = add nuw nsw i64 %i, 1 4884911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit, label %latch.prol 4885911991d2SPhilip Reames; PROLOG-BLOCK: latch.prol: 4886911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH.prol.loopexit 4887911991d2SPhilip Reames; PROLOG-BLOCK: innerH.prol.loopexit: 4888b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ] 4889911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 4890911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %2, label %exit.loopexit, label %outerloop.new 4891911991d2SPhilip Reames; PROLOG-BLOCK: outerloop.new: 4892911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerH 4893911991d2SPhilip Reames; PROLOG-BLOCK: innerH: 4894b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ] 4895911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i4 = add nuw nsw i64 %i3, 1 4896911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch 4897911991d2SPhilip Reames; PROLOG-BLOCK: latch: 4898911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i4.1 = add nuw nsw i64 %i4, 1 489972031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.1 4900de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 4901de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i6.1 = icmp ult i64 %i4.1, 100 4902da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12 4903911991d2SPhilip Reames; PROLOG-BLOCK: exit.unr-lcssa.loopexit: 4904911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4905911991d2SPhilip Reames; PROLOG-BLOCK: exit.unr-lcssa.loopexit3: 4906911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit.unr-lcssa 4907911991d2SPhilip Reames; PROLOG-BLOCK: exit.unr-lcssa: 4908911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit 4909911991d2SPhilip Reames; PROLOG-BLOCK: exit.loopexit: 4910911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit 4911911991d2SPhilip Reames; PROLOG-BLOCK: exit: 4912911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 4913911991d2SPhilip Reames; 4914911991d2SPhilip Reames 4915cee313d2SEric Christopherbb: 4916cee313d2SEric Christopher br label %outerloop 4917cee313d2SEric Christopher 4918cee313d2SEric Christopherouterloop: ; preds = %innerH, %bb 491917a15c32SRoman Lebedev %i = phi i64 [ 3, %bb ], [ 0, %innerH ] 4920cee313d2SEric Christopher br label %innerH 4921cee313d2SEric Christopher 4922cee313d2SEric ChristopherinnerH: ; preds = %latch, %outerloop 492317a15c32SRoman Lebedev %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ] 492417a15c32SRoman Lebedev %i4 = add nuw nsw i64 %i3, 1 4925cee313d2SEric Christopher br i1 false, label %outerloop, label %latch 4926cee313d2SEric Christopher 4927cee313d2SEric Christopherlatch: ; preds = %innerH 492817a15c32SRoman Lebedev %i6 = icmp ult i64 %i4, 100 492917a15c32SRoman Lebedev br i1 %i6, label %innerH, label %exit 4930cee313d2SEric Christopher 4931cee313d2SEric Christopherexit: ; preds = %latch 4932cee313d2SEric Christopher ret void 4933cee313d2SEric Christopher} 4934cee313d2SEric Christopher 4935cee313d2SEric Christopherdeclare i8 addrspace(1)* @foo(i32) 4936cee313d2SEric Christopher; inner loop prolog unrolled 4937cee313d2SEric Christopher; a value from outer loop is used in exit block of inner loop. 4938cee313d2SEric Christopher; Don't create VMap entries for such values (%trip). 4939cee313d2SEric Christopherdefine i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { 4940911991d2SPhilip Reames; EPILOG-LABEL: @test9( 4941911991d2SPhilip Reames; EPILOG-NEXT: bb: 4942fa82a3d0SPhilip Reames; EPILOG-NEXT: %0 = add i32 %n, -1 4943911991d2SPhilip Reames; EPILOG-NEXT: br label %outerloopHdr 4944911991d2SPhilip Reames; EPILOG: outerloopHdr: 4945911991d2SPhilip Reames; EPILOG-NEXT: %trip = add i32 %n, -1 4946911991d2SPhilip Reames; EPILOG-NEXT: %outercnd = icmp slt i32 0, %trip 4947911991d2SPhilip Reames; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 4948911991d2SPhilip Reames; EPILOG: preheader: 4949911991d2SPhilip Reames; EPILOG-NEXT: %i4 = zext i32 0 to i64 4950*81c648a3SNikita Popov; EPILOG-NEXT: %1 = freeze i32 %0 4951*81c648a3SNikita Popov; EPILOG-NEXT: %2 = add i32 %1, -1 4952*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i32 %1, 7 4953*81c648a3SNikita Popov; EPILOG-NEXT: %3 = icmp ult i32 %2, 7 4954323514deSNikita Popov; EPILOG-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 4955fa82a3d0SPhilip Reames; EPILOG: preheader.new: 4956*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i32 %1, %xtraiter 4957911991d2SPhilip Reames; EPILOG-NEXT: br label %header 4958911991d2SPhilip Reames; EPILOG: header: 4959fa82a3d0SPhilip Reames; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ] 496037ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ] 4961fa82a3d0SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 4962fa82a3d0SPhilip Reames; EPILOG: innerexit.loopexit: 496372031407SPhilip Reames; EPILOG-NEXT: %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ] 4964fa82a3d0SPhilip Reames; EPILOG-NEXT: br label %innerexit 4965fa82a3d0SPhilip Reames; EPILOG: innerexit.loopexit1: 4966fa82a3d0SPhilip Reames; EPILOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ] 4967fa82a3d0SPhilip Reames; EPILOG-NEXT: br label %innerexit 4968911991d2SPhilip Reames; EPILOG: innerexit: 4969fa82a3d0SPhilip Reames; EPILOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 4970911991d2SPhilip Reames; EPILOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 4971911991d2SPhilip Reames; EPILOG-NEXT: ret i8 addrspace(1)* %i9 4972911991d2SPhilip Reames; EPILOG: latch: 4973911991d2SPhilip Reames; EPILOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 497437ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i32 %niter, 1 497572031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 4976fa82a3d0SPhilip Reames; EPILOG: latch.1: 4977fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 497837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i32 %niter.next, 1 497972031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 4980fa82a3d0SPhilip Reames; EPILOG: latch.2: 4981fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 498237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i32 %niter.next.1, 1 498372031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 4984fa82a3d0SPhilip Reames; EPILOG: latch.3: 4985fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 498637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i32 %niter.next.2, 1 498772031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 4988fa82a3d0SPhilip Reames; EPILOG: latch.4: 4989fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 499037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i32 %niter.next.3, 1 499172031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 4992fa82a3d0SPhilip Reames; EPILOG: latch.5: 4993fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 499437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i32 %niter.next.4, 1 499572031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 4996fa82a3d0SPhilip Reames; EPILOG: latch.6: 4997fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 499837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i32 %niter.next.5, 1 499972031407SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 5000fa82a3d0SPhilip Reames; EPILOG: latch.7: 5001fa82a3d0SPhilip Reames; EPILOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 500237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i32 %niter.next.6, 1 500337ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter 5004fa82a3d0SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit 5005de2fed61SPhilip Reames; EPILOG: outerLatch.loopexit.unr-lcssa.loopexit: 5006de2fed61SPhilip Reames; EPILOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ] 5007de2fed61SPhilip Reames; EPILOG-NEXT: br label %outerLatch.loopexit.unr-lcssa 5008de2fed61SPhilip Reames; EPILOG: outerLatch.loopexit.unr-lcssa: 5009de2fed61SPhilip Reames; EPILOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ] 5010de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5011de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 5012de2fed61SPhilip Reames; EPILOG: header.epil.preheader: 5013de2fed61SPhilip Reames; EPILOG-NEXT: br label %header.epil 5014de2fed61SPhilip Reames; EPILOG: header.epil: 5015de2fed61SPhilip Reames; EPILOG-NEXT: %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ] 501637ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ] 5017de2fed61SPhilip Reames; EPILOG-NEXT: %i7.epil = trunc i64 %phi.epil to i32 5018de2fed61SPhilip Reames; EPILOG-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 5019de2fed61SPhilip Reames; EPILOG: latch.epil: 5020de2fed61SPhilip Reames; EPILOG-NEXT: %i11.epil = add nsw i32 %i7.epil, 1 5021de2fed61SPhilip Reames; EPILOG-NEXT: %innercnd.epil = icmp slt i32 %i11.epil, %trip 5022de2fed61SPhilip Reames; EPILOG-NEXT: %iv.next.epil = add nuw nsw i64 %phi.epil, 1 502337ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i32 %epil.iter, 1 502437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter 5025da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13 5026de2fed61SPhilip Reames; EPILOG: outerLatch.loopexit.epilog-lcssa: 5027de2fed61SPhilip Reames; EPILOG-NEXT: br label %outerLatch.loopexit 5028de2fed61SPhilip Reames; EPILOG: outerLatch.loopexit: 5029de2fed61SPhilip Reames; EPILOG-NEXT: br label %outerLatch 5030de2fed61SPhilip Reames; EPILOG: outerLatch: 5031de2fed61SPhilip Reames; EPILOG-NEXT: br label %outerloopHdr 5032911991d2SPhilip Reames; 5033911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test9( 5034911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: bb: 5035fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %0 = add i32 %n, -1 5036911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloopHdr 5037911991d2SPhilip Reames; EPILOG-BLOCK: outerloopHdr: 5038911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %trip = add i32 %n, -1 5039911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 5040911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5041911991d2SPhilip Reames; EPILOG-BLOCK: preheader: 5042*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = freeze i32 %0 5043*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = add i32 %1, -1 5044*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 5045*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 5046323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new 5047fa82a3d0SPhilip Reames; EPILOG-BLOCK: preheader.new: 5048*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %1, %xtraiter 5049911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header 5050911991d2SPhilip Reames; EPILOG-BLOCK: header: 5051fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ] 505237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ] 5053fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5054fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerexit.loopexit.loopexit: 505572031407SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5056fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5057fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerexit.loopexit.loopexit6: 505872031407SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ] 5059fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerexit.loopexit 5060911991d2SPhilip Reames; EPILOG-BLOCK: innerexit.loopexit: 5061fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ] 5062911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerexit 5063fa82a3d0SPhilip Reames; EPILOG-BLOCK: innerexit.loopexit1: 5064fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ] 5065911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %innerexit 5066911991d2SPhilip Reames; EPILOG-BLOCK: innerexit: 5067fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5068911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5069911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5070911991d2SPhilip Reames; EPILOG-BLOCK: latch: 5071911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 507237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i32 %niter, 1 507372031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5074de2fed61SPhilip Reames; EPILOG-BLOCK: latch.1: 5075de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 507637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i32 %niter.next, 1 507737ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter 5078da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14 5079fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit: 5080fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa 5081fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5082fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5083fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit 5084fa82a3d0SPhilip Reames; EPILOG-BLOCK: header.epil.preheader: 5085fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil 5086fa82a3d0SPhilip Reames; EPILOG-BLOCK: header.epil: 5087fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil, label %innerexit.loopexit1 5088fa82a3d0SPhilip Reames; EPILOG-BLOCK: latch.epil: 5089fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit 5090911991d2SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit: 5091911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch 5092911991d2SPhilip Reames; EPILOG-BLOCK: outerLatch: 5093911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5094911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5095911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5096911991d2SPhilip Reames; EPILOG-BLOCK: preheader.1: 5097*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %4 = freeze i32 %0 5098*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %5 = add i32 %4, -1 5099*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 5100*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 5101*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 5102fa82a3d0SPhilip Reames; EPILOG-BLOCK: preheader.new.1: 5103*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %4, %xtraiter.1 5104fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.1 5105fa82a3d0SPhilip Reames; EPILOG-BLOCK: header.1: 5106fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 510737ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ] 5108fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6 5109fa82a3d0SPhilip Reames; EPILOG-BLOCK: latch.15: 5110fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 511137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.14 = add nuw nsw i32 %niter.1, 1 511272031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6 5113911991d2SPhilip Reames; EPILOG-BLOCK: latch.1.1: 5114fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 511537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1.1 = add i32 %niter.next.14, 1 511637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1 5117da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14 5118fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.loopexit.1: 5119fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.unr-lcssa.1 5120fa82a3d0SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5121fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5122fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1 5123fa82a3d0SPhilip Reames; EPILOG-BLOCK: header.epil.preheader.1: 5124fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %header.epil.1 5125fa82a3d0SPhilip Reames; EPILOG-BLOCK: header.epil.1: 5126fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 true, label %latch.epil.1, label %innerexit.loopexit1 5127fa82a3d0SPhilip Reames; EPILOG-BLOCK: latch.epil.1: 5128fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5129911991d2SPhilip Reames; EPILOG-BLOCK: outerLatch.loopexit.1: 5130911991d2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerLatch.1 5131911991d2SPhilip Reames; EPILOG-BLOCK: outerLatch.1: 5132da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5133911991d2SPhilip Reames; 5134911991d2SPhilip Reames; PROLOG-LABEL: @test9( 5135911991d2SPhilip Reames; PROLOG-NEXT: bb: 5136911991d2SPhilip Reames; PROLOG-NEXT: %0 = add i32 %n, -1 5137911991d2SPhilip Reames; PROLOG-NEXT: br label %outerloopHdr 5138911991d2SPhilip Reames; PROLOG: outerloopHdr: 5139911991d2SPhilip Reames; PROLOG-NEXT: %trip = add i32 %n, -1 5140911991d2SPhilip Reames; PROLOG-NEXT: %outercnd = icmp slt i32 0, %trip 5141911991d2SPhilip Reames; PROLOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5142911991d2SPhilip Reames; PROLOG: preheader: 5143911991d2SPhilip Reames; PROLOG-NEXT: %i4 = zext i32 0 to i64 5144*81c648a3SNikita Popov; PROLOG-NEXT: %1 = freeze i32 %0 5145*81c648a3SNikita Popov; PROLOG-NEXT: %2 = add i32 %1, -1 5146*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i32 %1, 7 5147911991d2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5148*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5149911991d2SPhilip Reames; PROLOG: header.prol.preheader: 5150911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol 5151cee313d2SEric Christopher; PROLOG: header.prol: 5152911991d2SPhilip Reames; PROLOG-NEXT: %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ] 515337ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ] 5154911991d2SPhilip Reames; PROLOG-NEXT: %i7.prol = trunc i64 %phi.prol to i32 5155911991d2SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5156cee313d2SEric Christopher; PROLOG: latch.prol: 5157911991d2SPhilip Reames; PROLOG-NEXT: %i11.prol = add nsw i32 %i7.prol, 1 5158911991d2SPhilip Reames; PROLOG-NEXT: %innercnd.prol = icmp slt i32 %i11.prol, %trip 5159911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.prol = add nuw nsw i64 %phi.prol, 1 516037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i32 %prol.iter, 1 516137ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter 5162da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13 5163911991d2SPhilip Reames; PROLOG: header.prol.loopexit.unr-lcssa: 5164911991d2SPhilip Reames; PROLOG-NEXT: %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ] 5165911991d2SPhilip Reames; PROLOG-NEXT: br label %header.prol.loopexit 5166911991d2SPhilip Reames; PROLOG: header.prol.loopexit: 5167911991d2SPhilip Reames; PROLOG-NEXT: %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ] 5168*81c648a3SNikita Popov; PROLOG-NEXT: %3 = icmp ult i32 %2, 7 5169323514deSNikita Popov; PROLOG-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new 5170911991d2SPhilip Reames; PROLOG: preheader.new: 5171911991d2SPhilip Reames; PROLOG-NEXT: br label %header 5172911991d2SPhilip Reames; PROLOG: header: 5173911991d2SPhilip Reames; PROLOG-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ] 5174911991d2SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch, label %innerexit.loopexit 5175911991d2SPhilip Reames; PROLOG: innerexit.loopexit: 517672031407SPhilip Reames; PROLOG-NEXT: %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ] 5177911991d2SPhilip Reames; PROLOG-NEXT: br label %innerexit 5178911991d2SPhilip Reames; PROLOG: innerexit.loopexit1: 5179911991d2SPhilip Reames; PROLOG-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ] 5180911991d2SPhilip Reames; PROLOG-NEXT: br label %innerexit 5181911991d2SPhilip Reames; PROLOG: innerexit: 5182911991d2SPhilip Reames; PROLOG-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5183911991d2SPhilip Reames; PROLOG-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5184911991d2SPhilip Reames; PROLOG-NEXT: ret i8 addrspace(1)* %i9 5185911991d2SPhilip Reames; PROLOG: latch: 5186911991d2SPhilip Reames; PROLOG-NEXT: %iv.next = add nuw nsw i64 %phi, 1 518772031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit 5188911991d2SPhilip Reames; PROLOG: latch.1: 5189911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 519072031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.2, label %innerexit.loopexit 5191911991d2SPhilip Reames; PROLOG: latch.2: 5192911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.2 = add nuw nsw i64 %iv.next.1, 1 519372031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.3, label %innerexit.loopexit 5194911991d2SPhilip Reames; PROLOG: latch.3: 5195911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.3 = add nuw nsw i64 %iv.next.2, 1 519672031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.4, label %innerexit.loopexit 5197911991d2SPhilip Reames; PROLOG: latch.4: 5198911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.4 = add nuw nsw i64 %iv.next.3, 1 519972031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.5, label %innerexit.loopexit 5200911991d2SPhilip Reames; PROLOG: latch.5: 5201911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.5 = add nuw nsw i64 %iv.next.4, 1 520272031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.6, label %innerexit.loopexit 5203911991d2SPhilip Reames; PROLOG: latch.6: 5204911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.6 = add nuw nsw i64 %iv.next.5, 1 5205911991d2SPhilip Reames; PROLOG-NEXT: %i7.7 = trunc i64 %iv.next.6 to i32 520672031407SPhilip Reames; PROLOG-NEXT: br i1 true, label %latch.7, label %innerexit.loopexit 5207911991d2SPhilip Reames; PROLOG: latch.7: 5208911991d2SPhilip Reames; PROLOG-NEXT: %i11.7 = add nsw i32 %i7.7, 1 5209911991d2SPhilip Reames; PROLOG-NEXT: %innercnd.7 = icmp slt i32 %i11.7, %trip 5210911991d2SPhilip Reames; PROLOG-NEXT: %iv.next.7 = add nuw nsw i64 %iv.next.6, 1 5211911991d2SPhilip Reames; PROLOG-NEXT: br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa 5212de2fed61SPhilip Reames; PROLOG: outerLatch.loopexit.unr-lcssa: 5213de2fed61SPhilip Reames; PROLOG-NEXT: br label %outerLatch.loopexit 5214de2fed61SPhilip Reames; PROLOG: outerLatch.loopexit: 5215de2fed61SPhilip Reames; PROLOG-NEXT: br label %outerLatch 5216de2fed61SPhilip Reames; PROLOG: outerLatch: 5217de2fed61SPhilip Reames; PROLOG-NEXT: br label %outerloopHdr 5218911991d2SPhilip Reames; 5219911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test9( 5220911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: bb: 5221911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %0 = add i32 %n, -1 5222911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloopHdr 5223911991d2SPhilip Reames; PROLOG-BLOCK: outerloopHdr: 5224911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %trip = add i32 %n, -1 5225911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %outercnd = icmp slt i32 0, %trip 5226911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %outercnd, label %preheader, label %outerLatch 5227911991d2SPhilip Reames; PROLOG-BLOCK: preheader: 5228*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = freeze i32 %0 5229*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = add i32 %1, -1 5230*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 5231911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 5232*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit 5233911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.preheader: 5234911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol 5235911991d2SPhilip Reames; PROLOG-BLOCK: header.prol: 5236911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol, label %innerexit.loopexit1 5237911991d2SPhilip Reames; PROLOG-BLOCK: latch.prol: 5238911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit 5239911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit: 5240b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ] 5241*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 5242323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new 5243911991d2SPhilip Reames; PROLOG-BLOCK: preheader.new: 5244911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header 5245911991d2SPhilip Reames; PROLOG-BLOCK: header: 5246b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ] 5247911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch, label %innerexit.loopexit.loopexit 5248911991d2SPhilip Reames; PROLOG-BLOCK: innerexit.loopexit.loopexit: 524972031407SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ] 5250911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5251911991d2SPhilip Reames; PROLOG-BLOCK: innerexit.loopexit.loopexit5: 525272031407SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ] 5253911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerexit.loopexit 5254911991d2SPhilip Reames; PROLOG-BLOCK: innerexit.loopexit: 5255911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ] 5256911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerexit 5257911991d2SPhilip Reames; PROLOG-BLOCK: innerexit.loopexit1: 5258911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ] 5259911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %innerexit 5260911991d2SPhilip Reames; PROLOG-BLOCK: innerexit: 5261911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ] 5262911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa) 5263911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: ret i8 addrspace(1)* %i9 5264911991d2SPhilip Reames; PROLOG-BLOCK: latch: 5265911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.next = add nuw nsw i64 %phi, 1 5266911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i7.1 = trunc i64 %iv.next to i32 526772031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1, label %innerexit.loopexit.loopexit 5268de2fed61SPhilip Reames; PROLOG-BLOCK: latch.1: 5269de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %i11.1 = add nsw i32 %i7.1, 1 5270de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %innercnd.1 = icmp slt i32 %i11.1, %trip 5271de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.next.1 = add nuw nsw i64 %iv.next, 1 5272da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14 5273911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa: 5274911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit 5275911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch.loopexit: 5276911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerLatch 5277911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch: 5278911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %trip.1 = add i32 %n, -1 5279911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %outercnd.1 = icmp slt i32 0, %trip.1 5280911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %outercnd.1, label %preheader.1, label %outerLatch.1 5281911991d2SPhilip Reames; PROLOG-BLOCK: preheader.1: 5282*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %4 = freeze i32 %0 5283*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %5 = add i32 %4, -1 5284*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 5285911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 5286*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1 5287911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.preheader.1: 5288911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.1 5289911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.1: 5290911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch.prol.1, label %innerexit.loopexit1 5291911991d2SPhilip Reames; PROLOG-BLOCK: latch.prol.1: 5292911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 5293911991d2SPhilip Reames; PROLOG-BLOCK: header.prol.loopexit.1: 5294b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ] 5295*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 5296*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1 5297911991d2SPhilip Reames; PROLOG-BLOCK: preheader.new.1: 5298911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %header.1 5299911991d2SPhilip Reames; PROLOG-BLOCK: header.1: 5300b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT: %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] 5301911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5 5302911991d2SPhilip Reames; PROLOG-BLOCK: latch.14: 5303911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.next.13 = add nuw nsw i64 %phi.1, 1 5304911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i7.1.1 = trunc i64 %iv.next.13 to i32 530572031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5 5306911991d2SPhilip Reames; PROLOG-BLOCK: latch.1.1: 5307911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %i11.1.1 = add nsw i32 %i7.1.1, 1 5308911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1 5309911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1 5310da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14 5311911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch.loopexit.unr-lcssa.1: 5312911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerLatch.loopexit.1 5313911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch.loopexit.1: 5314911991d2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerLatch.1 5315911991d2SPhilip Reames; PROLOG-BLOCK: outerLatch.1: 5316da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br label %outerloopHdr, !llvm.loop !15 5317911991d2SPhilip Reames; 5318cee313d2SEric Christopherbb: 5319cee313d2SEric Christopher br label %outerloopHdr 5320cee313d2SEric Christopher 5321cee313d2SEric ChristopherouterloopHdr: ; preds = %outerLatch, %bb 5322cee313d2SEric Christopher %trip = add i32 %n, -1 5323cee313d2SEric Christopher %outercnd = icmp slt i32 0, %trip 5324cee313d2SEric Christopher br i1 %outercnd, label %preheader, label %outerLatch 5325cee313d2SEric Christopher 5326cee313d2SEric Christopherpreheader: ; preds = %outerloopHdr 532717a15c32SRoman Lebedev %i4 = zext i32 0 to i64 5328cee313d2SEric Christopher br label %header 5329cee313d2SEric Christopher 5330cee313d2SEric Christopherheader: ; preds = %latch, %preheader 533117a15c32SRoman Lebedev %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ] 533217a15c32SRoman Lebedev %i7 = trunc i64 %phi to i32 5333cee313d2SEric Christopher br i1 true, label %latch, label %innerexit 5334cee313d2SEric Christopher 5335cee313d2SEric Christopherinnerexit: ; preds = %header 533617a15c32SRoman Lebedev %i9 = call i8 addrspace(1)* @foo(i32 %trip) 533717a15c32SRoman Lebedev ret i8 addrspace(1)* %i9 5338cee313d2SEric Christopher 5339cee313d2SEric Christopherlatch: ; preds = %header 534017a15c32SRoman Lebedev %i11 = add nsw i32 %i7, 1 534117a15c32SRoman Lebedev %innercnd = icmp slt i32 %i11, %trip 5342cee313d2SEric Christopher %iv.next = add nuw nsw i64 %phi, 1 5343cee313d2SEric Christopher br i1 %innercnd, label %header, label %outerLatch 5344cee313d2SEric Christopher 5345cee313d2SEric ChristopherouterLatch: ; preds = %latch, %outerloopHdr 5346cee313d2SEric Christopher br label %outerloopHdr 5347cee313d2SEric Christopher} 5348e01c91f2SPhilip Reames 5349e01c91f2SPhilip Reamesdeclare void @bar() 5350e01c91f2SPhilip Reames 5351e01c91f2SPhilip Reames; This is a case where we should be able to eliminate N-1 copies 5352e01c91f2SPhilip Reames; of the early exit test in the main loop when runtime unrolling 5353e01c91f2SPhilip Reames; by N. 5354e01c91f2SPhilip Reamesdefine void @test10(i64 %trip, i64 %trip2) { 5355e01c91f2SPhilip Reames; EPILOG-LABEL: @test10( 5356e01c91f2SPhilip Reames; EPILOG-NEXT: entry: 5357*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 5358*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 5359*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5360*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5361323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5362e01c91f2SPhilip Reames; EPILOG: entry.new: 5363*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5364e01c91f2SPhilip Reames; EPILOG-NEXT: br label %loop_header 5365e01c91f2SPhilip Reames; EPILOG: loop_header: 5366e01c91f2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 536737ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5368e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5369e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5370e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5371e01c91f2SPhilip Reames; EPILOG: loop_latch: 5372e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 537337ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5374e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5375e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5376e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5377e01c91f2SPhilip Reames; EPILOG: loop_latch.1: 5378e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 537937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5380e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5381e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5382e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5383e01c91f2SPhilip Reames; EPILOG: loop_latch.2: 5384e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 538537ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5386e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5387e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5388e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5389e01c91f2SPhilip Reames; EPILOG: loop_latch.3: 5390e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 539137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5392e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5393e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5394e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5395e01c91f2SPhilip Reames; EPILOG: loop_latch.4: 5396e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 539737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5398e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5399e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5400e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5401e01c91f2SPhilip Reames; EPILOG: loop_latch.5: 5402e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 540337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5404e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5405e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5406e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5407e01c91f2SPhilip Reames; EPILOG: loop_latch.6: 5408e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 540937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5410e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5411e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5412e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5413e01c91f2SPhilip Reames; EPILOG: loop_latch.7: 5414e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 541537ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 541637ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5417e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5418de2fed61SPhilip Reames; EPILOG: exit1.loopexit: 5419de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 5420de2fed61SPhilip Reames; EPILOG: exit1.loopexit1: 5421de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 5422de2fed61SPhilip Reames; EPILOG: exit1: 5423de2fed61SPhilip Reames; EPILOG-NEXT: ret void 5424de2fed61SPhilip Reames; EPILOG: exit2.unr-lcssa.loopexit: 5425de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5426de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.unr-lcssa 5427de2fed61SPhilip Reames; EPILOG: exit2.unr-lcssa: 5428de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5429de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5430de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5431de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 5432de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 5433de2fed61SPhilip Reames; EPILOG: loop_header.epil: 5434de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 543537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5436de2fed61SPhilip Reames; EPILOG-NEXT: call void @bar() 5437de2fed61SPhilip Reames; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 5438de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1 5439de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 5440de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5441de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 544237ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 544337ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5444da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14 5445de2fed61SPhilip Reames; EPILOG: exit2.epilog-lcssa: 5446de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2 5447de2fed61SPhilip Reames; EPILOG: exit2: 5448de2fed61SPhilip Reames; EPILOG-NEXT: ret void 5449e01c91f2SPhilip Reames; 5450e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test10( 5451e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 5452*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 5453*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 5454*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5455*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5456323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5457e01c91f2SPhilip Reames; EPILOG-BLOCK: entry.new: 5458*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5459e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 5460e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header: 5461e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 546237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5463e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 5464e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5465e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5466e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch: 5467e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 546837ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5469e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 5470e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5471e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5472de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 5473de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 547437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 547537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5476da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16 5477e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.loopexit: 5478e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 5479e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1: 5480e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 5481e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5482e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 5483e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5484e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2.unr-lcssa: 5485e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5486e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5487e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5488e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 5489e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5490e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 5491e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 5492e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 5493e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1 5494e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 5495e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2 5496e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2: 5497e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 5498e01c91f2SPhilip Reames; 5499e01c91f2SPhilip Reames; PROLOG-LABEL: @test10( 5500e01c91f2SPhilip Reames; PROLOG-NEXT: entry: 5501*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 5502*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 5503*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 5504e01c91f2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5505*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5506e01c91f2SPhilip Reames; PROLOG: loop_header.prol.preheader: 5507e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 5508e01c91f2SPhilip Reames; PROLOG: loop_header.prol: 5509e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 551037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5511e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5512e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 5513e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1 5514e01c91f2SPhilip Reames; PROLOG: loop_latch.prol: 5515e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5516e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 551737ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 551837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5519da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14 5520e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5521e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5522e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 5523e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 5524e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5525*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 5526323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new 5527e01c91f2SPhilip Reames; PROLOG: entry.new: 5528e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header 5529e01c91f2SPhilip Reames; PROLOG: loop_header: 5530e01c91f2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5531e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5532e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5533e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5534e01c91f2SPhilip Reames; PROLOG: loop_latch: 5535e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5536e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5537e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5538e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5539e01c91f2SPhilip Reames; PROLOG: loop_latch.1: 5540e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5541e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5542e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5543e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit 5544e01c91f2SPhilip Reames; PROLOG: loop_latch.2: 5545e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5546e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5547e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5548e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit 5549e01c91f2SPhilip Reames; PROLOG: loop_latch.3: 5550e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5551e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5552e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5553e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit 5554e01c91f2SPhilip Reames; PROLOG: loop_latch.4: 5555e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5556e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5557e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5558e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit 5559e01c91f2SPhilip Reames; PROLOG: loop_latch.5: 5560e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5561e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5562e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5563e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit 5564e01c91f2SPhilip Reames; PROLOG: loop_latch.6: 5565e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5566e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5567e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5568e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit 5569e01c91f2SPhilip Reames; PROLOG: loop_latch.7: 5570e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5571e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5572e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5573de2fed61SPhilip Reames; PROLOG: exit1.loopexit: 5574de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 5575de2fed61SPhilip Reames; PROLOG: exit1.loopexit1: 5576de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 5577de2fed61SPhilip Reames; PROLOG: exit1: 5578de2fed61SPhilip Reames; PROLOG-NEXT: ret void 5579de2fed61SPhilip Reames; PROLOG: exit2.unr-lcssa: 5580de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit2 5581de2fed61SPhilip Reames; PROLOG: exit2: 5582de2fed61SPhilip Reames; PROLOG-NEXT: ret void 5583e01c91f2SPhilip Reames; 5584e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test10( 5585e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 5586*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 5587*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 5588*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5589e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5590*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5591e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 5592e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5593e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 5594e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 5595e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 5596e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1 5597e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 5598e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5599e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 5600e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5601*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5602323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new 5603e01c91f2SPhilip Reames; PROLOG-BLOCK: entry.new: 5604e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 5605e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header: 5606e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5607e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 5608e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5609e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit 5610e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch: 5611e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5612e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 5613e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5614e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit 5615de2fed61SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 5616de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5617de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5618da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16 5619e01c91f2SPhilip Reames; PROLOG-BLOCK: exit1.loopexit: 5620e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 5621e01c91f2SPhilip Reames; PROLOG-BLOCK: exit1: 5622e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 5623e01c91f2SPhilip Reames; PROLOG-BLOCK: exit2.unr-lcssa: 5624e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit2 5625e01c91f2SPhilip Reames; PROLOG-BLOCK: exit2: 5626e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 5627e01c91f2SPhilip Reames; 5628e01c91f2SPhilip Reamesentry: 5629e01c91f2SPhilip Reames br label %loop_header 5630e01c91f2SPhilip Reames 5631e01c91f2SPhilip Reamesloop_header: 5632e01c91f2SPhilip Reames %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5633e01c91f2SPhilip Reames call void @bar() 5634e01c91f2SPhilip Reames %cmp_early = icmp ne i64 %iv, %trip2 5635e01c91f2SPhilip Reames br i1 %cmp_early, label %loop_latch, label %exit1 5636e01c91f2SPhilip Reames 5637e01c91f2SPhilip Reamesloop_latch: 5638e01c91f2SPhilip Reames %iv_next = add i64 %iv, 1 5639e01c91f2SPhilip Reames %cmp = icmp ne i64 %iv_next, %trip 5640e01c91f2SPhilip Reames br i1 %cmp, label %loop_header, label %exit2 5641e01c91f2SPhilip Reames 5642e01c91f2SPhilip Reamesexit1: 5643e01c91f2SPhilip Reames ret void 5644e01c91f2SPhilip Reames 5645e01c91f2SPhilip Reamesexit2: 5646e01c91f2SPhilip Reames ret void 5647e01c91f2SPhilip Reames} 5648e01c91f2SPhilip Reames 5649e01c91f2SPhilip Reames; With a loop invariant, we can eliminate the last N-1 5650e01c91f2SPhilip Reames; copies of the exit test in the unrolled main loop body. 5651e01c91f2SPhilip Reamesdefine void @test11(i64 %trip, i1 %cond) { 5652e01c91f2SPhilip Reames; EPILOG-LABEL: @test11( 5653e01c91f2SPhilip Reames; EPILOG-NEXT: entry: 5654*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 5655*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 5656*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5657*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5658323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5659e01c91f2SPhilip Reames; EPILOG: entry.new: 5660*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5661e01c91f2SPhilip Reames; EPILOG-NEXT: br label %loop_header 5662e01c91f2SPhilip Reames; EPILOG: loop_header: 5663e01c91f2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 566437ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5665e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5666e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5667e01c91f2SPhilip Reames; EPILOG: loop_latch: 5668e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 566937ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5670e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 567172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5672e01c91f2SPhilip Reames; EPILOG: loop_latch.1: 5673e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 567437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5675e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 567672031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5677e01c91f2SPhilip Reames; EPILOG: loop_latch.2: 5678e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 567937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5680e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 568172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5682e01c91f2SPhilip Reames; EPILOG: loop_latch.3: 5683e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 568437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5685e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 568672031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5687e01c91f2SPhilip Reames; EPILOG: loop_latch.4: 5688e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 568937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5690e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 569172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5692e01c91f2SPhilip Reames; EPILOG: loop_latch.5: 5693e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 569437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5695e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 569672031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5697e01c91f2SPhilip Reames; EPILOG: loop_latch.6: 5698e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 569937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5700e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 570172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5702e01c91f2SPhilip Reames; EPILOG: loop_latch.7: 5703e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 570437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 570537ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 5706e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit 5707de2fed61SPhilip Reames; EPILOG: exit1.loopexit: 5708de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 5709de2fed61SPhilip Reames; EPILOG: exit1.loopexit1: 5710de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 5711de2fed61SPhilip Reames; EPILOG: exit1: 5712de2fed61SPhilip Reames; EPILOG-NEXT: ret void 5713de2fed61SPhilip Reames; EPILOG: exit2.unr-lcssa.loopexit: 5714de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 5715de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2.unr-lcssa 5716de2fed61SPhilip Reames; EPILOG: exit2.unr-lcssa: 5717de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ] 5718de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5719de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5720de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 5721de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 5722de2fed61SPhilip Reames; EPILOG: loop_header.epil: 5723de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 572437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 5725de2fed61SPhilip Reames; EPILOG-NEXT: call void @bar() 5726de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1 5727de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 5728de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 5729de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 573037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 573137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 5732da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15 5733de2fed61SPhilip Reames; EPILOG: exit2.epilog-lcssa: 5734de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit2 5735de2fed61SPhilip Reames; EPILOG: exit2: 5736de2fed61SPhilip Reames; EPILOG-NEXT: ret void 5737e01c91f2SPhilip Reames; 5738e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test11( 5739e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 5740*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 5741*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 5742*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5743*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5744323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new 5745e01c91f2SPhilip Reames; EPILOG-BLOCK: entry.new: 5746*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5747e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 5748e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header: 5749e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 575037ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 5751e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 5752e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5753e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch: 5754e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 575537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5756e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 575772031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5758de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 5759de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 576037ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 576137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 5762da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17 5763e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.loopexit: 5764e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 5765e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1: 5766e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 5767e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2.unr-lcssa.loopexit: 5768e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa 5769e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2.unr-lcssa: 5770e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5771e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2 5772e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 5773e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 5774e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 5775e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 5776e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1 5777e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 5778e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit2 5779e01c91f2SPhilip Reames; EPILOG-BLOCK: exit2: 5780e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 5781e01c91f2SPhilip Reames; 5782e01c91f2SPhilip Reames; PROLOG-LABEL: @test11( 5783e01c91f2SPhilip Reames; PROLOG-NEXT: entry: 5784*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 5785*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 5786*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 5787e01c91f2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5788*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5789e01c91f2SPhilip Reames; PROLOG: loop_header.prol.preheader: 5790e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 5791e01c91f2SPhilip Reames; PROLOG: loop_header.prol: 5792e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 579337ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 5794e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5795e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1 5796e01c91f2SPhilip Reames; PROLOG: loop_latch.prol: 5797e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 5798e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 579937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 580037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 5801da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15 5802e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 5803e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 5804e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 5805e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 5806e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 5807*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 5808323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new 5809e01c91f2SPhilip Reames; PROLOG: entry.new: 5810e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header 5811e01c91f2SPhilip Reames; PROLOG: loop_header: 5812e01c91f2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 5813e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 5814e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5815e01c91f2SPhilip Reames; PROLOG: loop_latch: 5816e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 5817e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 581872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5819e01c91f2SPhilip Reames; PROLOG: loop_latch.1: 5820e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 5821e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 582272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit 5823e01c91f2SPhilip Reames; PROLOG: loop_latch.2: 5824e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 5825e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 582672031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit 5827e01c91f2SPhilip Reames; PROLOG: loop_latch.3: 5828e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 5829e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 583072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit 5831e01c91f2SPhilip Reames; PROLOG: loop_latch.4: 5832e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 5833e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 583472031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit 5835e01c91f2SPhilip Reames; PROLOG: loop_latch.5: 5836e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 5837e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 583872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit 5839e01c91f2SPhilip Reames; PROLOG: loop_latch.6: 5840e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 5841e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 584272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit 5843e01c91f2SPhilip Reames; PROLOG: loop_latch.7: 5844e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 5845e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 5846e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa 5847de2fed61SPhilip Reames; PROLOG: exit1.loopexit: 5848de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 5849de2fed61SPhilip Reames; PROLOG: exit1.loopexit1: 5850de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 5851de2fed61SPhilip Reames; PROLOG: exit1: 5852de2fed61SPhilip Reames; PROLOG-NEXT: ret void 5853de2fed61SPhilip Reames; PROLOG: exit2.unr-lcssa: 5854de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit2 5855de2fed61SPhilip Reames; PROLOG: exit2: 5856de2fed61SPhilip Reames; PROLOG-NEXT: ret void 5857e01c91f2SPhilip Reames; 5858e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test11( 5859e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 5860*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 5861*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 5862*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 5863e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 5864*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 5865e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 5866e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 5867e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 5868e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 5869e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1 5870e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 5871e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 5872e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 5873e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 5874*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 5875323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new 5876e01c91f2SPhilip Reames; PROLOG-BLOCK: entry.new: 5877e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 5878e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header: 5879e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 5880e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 5881e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit 5882e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch: 5883e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 5884e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 588572031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit 5886de2fed61SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 5887de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 5888de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 5889da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17 5890e01c91f2SPhilip Reames; PROLOG-BLOCK: exit1.loopexit: 5891e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 5892e01c91f2SPhilip Reames; PROLOG-BLOCK: exit1: 5893e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 5894e01c91f2SPhilip Reames; PROLOG-BLOCK: exit2.unr-lcssa: 5895e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit2 5896e01c91f2SPhilip Reames; PROLOG-BLOCK: exit2: 5897e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 5898e01c91f2SPhilip Reames; 5899e01c91f2SPhilip Reamesentry: 5900e01c91f2SPhilip Reames br label %loop_header 5901e01c91f2SPhilip Reames 5902e01c91f2SPhilip Reamesloop_header: 5903e01c91f2SPhilip Reames %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 5904e01c91f2SPhilip Reames call void @bar() 5905e01c91f2SPhilip Reames br i1 %cond, label %loop_latch, label %exit1 5906e01c91f2SPhilip Reames 5907e01c91f2SPhilip Reamesloop_latch: 5908e01c91f2SPhilip Reames %iv_next = add i64 %iv, 1 5909e01c91f2SPhilip Reames %cmp = icmp ne i64 %iv_next, %trip 5910e01c91f2SPhilip Reames br i1 %cmp, label %loop_header, label %exit2 5911e01c91f2SPhilip Reames 5912e01c91f2SPhilip Reamesexit1: 5913e01c91f2SPhilip Reames ret void 5914e01c91f2SPhilip Reames 5915e01c91f2SPhilip Reamesexit2: 5916e01c91f2SPhilip Reames ret void 5917e01c91f2SPhilip Reames} 5918e01c91f2SPhilip Reames 5919e01c91f2SPhilip Reames; Combine a computeable and invariant test to make sure 5920e01c91f2SPhilip Reames; the interaction of both doesn't do anything weird 5921e01c91f2SPhilip Reamesdefine void @test12(i64 %trip, i64 %trip2, i1 %cond) { 5922e01c91f2SPhilip Reames; EPILOG-LABEL: @test12( 5923e01c91f2SPhilip Reames; EPILOG-NEXT: entry: 5924*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 5925*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 5926*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 5927*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 5928323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 5929e01c91f2SPhilip Reames; EPILOG: entry.new: 5930*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 5931e01c91f2SPhilip Reames; EPILOG-NEXT: br label %loop_header 5932e01c91f2SPhilip Reames; EPILOG: loop_header: 5933e01c91f2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 593437ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 5935e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5936e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 5937e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 5938e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2: 5939e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 5940e01c91f2SPhilip Reames; EPILOG: loop_latch: 5941e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 594237ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 5943e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5944e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 5945e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 5946e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.1: 594772031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 5948e01c91f2SPhilip Reames; EPILOG: loop_latch.1: 5949e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 595037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 5951e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5952e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 5953e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 5954e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.2: 595572031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 5956e01c91f2SPhilip Reames; EPILOG: loop_latch.2: 5957e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 595837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 5959e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5960e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 5961e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 5962e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.3: 596372031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 5964e01c91f2SPhilip Reames; EPILOG: loop_latch.3: 5965e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 596637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 5967e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5968e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 5969e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 5970e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.4: 597172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 5972e01c91f2SPhilip Reames; EPILOG: loop_latch.4: 5973e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 597437ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 5975e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5976e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 5977e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 5978e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.5: 597972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 5980e01c91f2SPhilip Reames; EPILOG: loop_latch.5: 5981e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 598237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 5983e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5984e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 5985e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 5986e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.6: 598772031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 5988e01c91f2SPhilip Reames; EPILOG: loop_latch.6: 5989e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 599037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 5991e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 5992e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 5993e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 5994e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.7: 599572031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 5996e01c91f2SPhilip Reames; EPILOG: loop_latch.7: 5997e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 599837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 599937ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6000e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6001de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa.loopexit: 6002de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6003de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.unr-lcssa 6004de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa: 6005de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6006de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6007de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6008de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 6009de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 6010de2fed61SPhilip Reames; EPILOG: loop_header.epil: 6011de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 601237ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6013de2fed61SPhilip Reames; EPILOG-NEXT: call void @bar() 6014de2fed61SPhilip Reames; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 6015de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6016de2fed61SPhilip Reames; EPILOG: loop_exiting_bb2.epil: 6017de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6018de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 6019de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6020de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 602137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 602237ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6023da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16 6024de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit: 6025de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6026de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit1: 6027de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6028de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa: 6029de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 6030de2fed61SPhilip Reames; EPILOG: exit1: 6031de2fed61SPhilip Reames; EPILOG-NEXT: ret void 6032e01c91f2SPhilip Reames; 6033e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test12( 6034e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 6035*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 6036*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 6037*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6038*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6039323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6040e01c91f2SPhilip Reames; EPILOG-BLOCK: entry.new: 6041*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6042e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 6043e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header: 6044e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 604537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6046e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6047e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6048e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6049e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2: 6050e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6051e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch: 6052e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 605337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6054e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6055e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6056e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6057de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.1: 605872031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6059de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 6060de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 606137ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 606237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6063da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6064e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6065e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6066e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6067e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa: 6068e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6069e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6070e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6071e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 6072e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6073e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 6074e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6075e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6076e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6077e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.epil: 6078e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa 6079e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 6080e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6081e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6082e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6083e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa: 6084e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 6085e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1: 6086e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 6087e01c91f2SPhilip Reames; 6088e01c91f2SPhilip Reames; PROLOG-LABEL: @test12( 6089e01c91f2SPhilip Reames; PROLOG-NEXT: entry: 6090*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 6091*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 6092*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 6093e01c91f2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6094*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6095e01c91f2SPhilip Reames; PROLOG: loop_header.prol.preheader: 6096e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 6097e01c91f2SPhilip Reames; PROLOG: loop_header.prol: 6098e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 609937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6100e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6101e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6102e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6103e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.prol: 6104e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6105e01c91f2SPhilip Reames; PROLOG: loop_latch.prol: 6106e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6107e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 610837ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 610937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6110da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16 6111e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6112e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6113e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 6114e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 6115e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6116*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 6117323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 6118e01c91f2SPhilip Reames; PROLOG: entry.new: 6119e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header 6120e01c91f2SPhilip Reames; PROLOG: loop_header: 6121e01c91f2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6122e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6123e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6124e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6125e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2: 6126e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6127e01c91f2SPhilip Reames; PROLOG: loop_latch: 6128e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6129e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6130e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6131e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6132e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.1: 613372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6134e01c91f2SPhilip Reames; PROLOG: loop_latch.1: 6135e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6136e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6137e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6138e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6139e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.2: 614072031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6141e01c91f2SPhilip Reames; PROLOG: loop_latch.2: 6142e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6143e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6144e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6145e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6146e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.3: 614772031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6148e01c91f2SPhilip Reames; PROLOG: loop_latch.3: 6149e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6150e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6151e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6152e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6153e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.4: 615472031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6155e01c91f2SPhilip Reames; PROLOG: loop_latch.4: 6156e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6157e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6158e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6159e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6160e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.5: 616172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6162e01c91f2SPhilip Reames; PROLOG: loop_latch.5: 6163e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6164e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6165e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6166e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6167e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.6: 616872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6169e01c91f2SPhilip Reames; PROLOG: loop_latch.6: 6170e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6171e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6172e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6173e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6174e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.7: 617572031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6176e01c91f2SPhilip Reames; PROLOG: loop_latch.7: 6177e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6178e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6179e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6180de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit: 6181de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6182de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit1: 6183de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6184de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa: 6185de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 6186de2fed61SPhilip Reames; PROLOG: exit1: 6187de2fed61SPhilip Reames; PROLOG-NEXT: ret void 6188e01c91f2SPhilip Reames; 6189e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test12( 6190e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 6191*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 6192*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 6193*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6194e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6195*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6196e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 6197e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6198e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 6199e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6200e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6201e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6202e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.prol: 6203e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa 6204e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 6205e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6206e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 6207e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6208*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6209323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 6210e01c91f2SPhilip Reames; PROLOG-BLOCK: entry.new: 6211e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 6212e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header: 6213e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6214e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6215e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6216e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6217e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2: 6218e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit 6219e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch: 6220e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6221e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6222e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6223e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6224e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.1: 622572031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6226e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 6227e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6228e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6229da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18 6230de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6231de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6232de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa: 6233de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 6234de2fed61SPhilip Reames; PROLOG-BLOCK: exit1: 6235de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 6236e01c91f2SPhilip Reames; 6237e01c91f2SPhilip Reamesentry: 6238e01c91f2SPhilip Reames br label %loop_header 6239e01c91f2SPhilip Reames 6240e01c91f2SPhilip Reamesloop_header: 6241e01c91f2SPhilip Reames %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6242e01c91f2SPhilip Reames call void @bar() 6243e01c91f2SPhilip Reames %cmp_early = icmp ne i64 %iv, %trip2 6244e01c91f2SPhilip Reames br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6245e01c91f2SPhilip Reames 6246e01c91f2SPhilip Reamesloop_exiting_bb2: 6247e01c91f2SPhilip Reames br i1 %cond, label %loop_latch, label %exit1 6248e01c91f2SPhilip Reames 6249e01c91f2SPhilip Reamesloop_latch: 6250e01c91f2SPhilip Reames %iv_next = add i64 %iv, 1 6251e01c91f2SPhilip Reames %cmp = icmp ne i64 %iv_next, %trip 6252e01c91f2SPhilip Reames br i1 %cmp, label %loop_header, label %exit1 6253e01c91f2SPhilip Reames 6254e01c91f2SPhilip Reamesexit1: 6255e01c91f2SPhilip Reames ret void 6256e01c91f2SPhilip Reames} 6257e01c91f2SPhilip Reames 6258e01c91f2SPhilip Reamesdeclare i1 @unknown_cond() 6259e01c91f2SPhilip Reames 6260e01c91f2SPhilip Reames; Mix of computable and uncompatable exits 6261e01c91f2SPhilip Reamesdefine void @test13(i64 %trip, i64 %trip2) { 6262e01c91f2SPhilip Reames; EPILOG-LABEL: @test13( 6263e01c91f2SPhilip Reames; EPILOG-NEXT: entry: 6264*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 6265*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 6266*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 6267*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 6268323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6269e01c91f2SPhilip Reames; EPILOG: entry.new: 6270*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6271e01c91f2SPhilip Reames; EPILOG-NEXT: br label %loop_header 6272e01c91f2SPhilip Reames; EPILOG: loop_header: 6273e01c91f2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 627437ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6275e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6276e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6277e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6278e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2: 6279e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6280e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6281e01c91f2SPhilip Reames; EPILOG: loop_latch: 6282e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 628337ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6284e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6285e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6286e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6287e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.1: 6288e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6289e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6290e01c91f2SPhilip Reames; EPILOG: loop_latch.1: 6291e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 629237ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6293e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6294e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6295e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6296e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.2: 6297e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6298e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6299e01c91f2SPhilip Reames; EPILOG: loop_latch.2: 6300e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 630137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6302e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6303e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6304e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6305e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.3: 6306e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6307e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6308e01c91f2SPhilip Reames; EPILOG: loop_latch.3: 6309e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 631037ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6311e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6312e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6313e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6314e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.4: 6315e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6316e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6317e01c91f2SPhilip Reames; EPILOG: loop_latch.4: 6318e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 631937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6320e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6321e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6322e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6323e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.5: 6324e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6325e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6326e01c91f2SPhilip Reames; EPILOG: loop_latch.5: 6327e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 632837ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6329e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6330e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6331e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6332e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.6: 6333e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6334e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6335e01c91f2SPhilip Reames; EPILOG: loop_latch.6: 6336e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 633737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6338e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6339e01c91f2SPhilip Reames; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6340e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6341e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.7: 6342e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6343e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6344e01c91f2SPhilip Reames; EPILOG: loop_latch.7: 6345e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 634637ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 634737ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6348e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6349de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa.loopexit: 6350de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6351de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.unr-lcssa 6352de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa: 6353de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6354de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6355de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6356de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 6357de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 6358de2fed61SPhilip Reames; EPILOG: loop_header.epil: 6359de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 636037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6361de2fed61SPhilip Reames; EPILOG-NEXT: call void @bar() 6362de2fed61SPhilip Reames; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2 6363de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6364de2fed61SPhilip Reames; EPILOG: loop_exiting_bb2.epil: 6365de2fed61SPhilip Reames; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6366de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6367de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 6368de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6369de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 637037ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 637137ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6372da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17 6373de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit: 6374de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6375de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit1: 6376de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6377de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa: 6378de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 6379de2fed61SPhilip Reames; EPILOG: exit1: 6380de2fed61SPhilip Reames; EPILOG-NEXT: ret void 6381e01c91f2SPhilip Reames; 6382e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test13( 6383e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 6384*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 6385*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 6386*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6387*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6388323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6389e01c91f2SPhilip Reames; EPILOG-BLOCK: entry.new: 6390*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6391e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 6392e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header: 6393e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 639437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6395e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6396e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6397e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6398e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2: 6399e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6400e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6401e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch: 6402e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 640337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6404e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6405e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6406e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6407de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.1: 6408de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6409de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6410de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 6411de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 641237ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 641337ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6414da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6415e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6416e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ] 6417e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6418e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa: 6419e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6420e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6421e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6422e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 6423e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6424e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 6425e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6426e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2 6427e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6428e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.epil: 6429e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6430e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6431e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 6432e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6433e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6434e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6435e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa: 6436e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 6437e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1: 6438e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 6439e01c91f2SPhilip Reames; 6440e01c91f2SPhilip Reames; PROLOG-LABEL: @test13( 6441e01c91f2SPhilip Reames; PROLOG-NEXT: entry: 6442*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 6443*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 6444*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 6445e01c91f2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6446*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6447e01c91f2SPhilip Reames; PROLOG: loop_header.prol.preheader: 6448e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 6449e01c91f2SPhilip Reames; PROLOG: loop_header.prol: 6450e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 645137ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6452e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6453e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2 6454e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6455e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.prol: 6456e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6457e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6458e01c91f2SPhilip Reames; PROLOG: loop_latch.prol: 6459e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6460e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 646137ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 646237ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6463da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17 6464e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6465e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6466e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 6467e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 6468e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6469*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 6470323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 6471e01c91f2SPhilip Reames; PROLOG: entry.new: 6472e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header 6473e01c91f2SPhilip Reames; PROLOG: loop_header: 6474e01c91f2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6475e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6476e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6477e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6478e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2: 6479e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6480e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6481e01c91f2SPhilip Reames; PROLOG: loop_latch: 6482e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6483e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6484e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6485e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6486e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.1: 6487e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6488e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6489e01c91f2SPhilip Reames; PROLOG: loop_latch.1: 6490e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6491e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6492e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2 6493e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6494e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.2: 6495e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6496e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6497e01c91f2SPhilip Reames; PROLOG: loop_latch.2: 6498e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6499e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6500e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2 6501e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6502e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.3: 6503e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6504e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6505e01c91f2SPhilip Reames; PROLOG: loop_latch.3: 6506e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6507e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6508e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2 6509e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6510e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.4: 6511e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6512e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6513e01c91f2SPhilip Reames; PROLOG: loop_latch.4: 6514e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6515e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6516e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2 6517e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6518e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.5: 6519e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6520e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6521e01c91f2SPhilip Reames; PROLOG: loop_latch.5: 6522e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6523e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6524e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2 6525e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6526e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.6: 6527e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6528e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6529e01c91f2SPhilip Reames; PROLOG: loop_latch.6: 6530e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6531e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6532e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2 6533e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6534e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.7: 6535e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6536e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6537e01c91f2SPhilip Reames; PROLOG: loop_latch.7: 6538e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6539e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6540e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6541de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit: 6542de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6543de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit1: 6544de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6545de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa: 6546de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 6547de2fed61SPhilip Reames; PROLOG: exit1: 6548de2fed61SPhilip Reames; PROLOG-NEXT: ret void 6549e01c91f2SPhilip Reames; 6550e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test13( 6551e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 6552*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 6553*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 6554*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6555e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6556*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6557e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 6558e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6559e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 6560e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6561e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2 6562e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6563e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.prol: 6564e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6565e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6566e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 6567e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6568e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 6569e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6570*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6571323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 6572e01c91f2SPhilip Reames; PROLOG-BLOCK: entry.new: 6573e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 6574e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header: 6575e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6576e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6577e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2 6578e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6579e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2: 6580e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6581e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6582e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch: 6583e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6584e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6585e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2 6586e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6587e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.1: 6588e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6589e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6590e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 6591e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6592e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6593da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19 6594de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6595de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6596de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa: 6597de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 6598de2fed61SPhilip Reames; PROLOG-BLOCK: exit1: 6599de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 6600e01c91f2SPhilip Reames; 6601e01c91f2SPhilip Reamesentry: 6602e01c91f2SPhilip Reames br label %loop_header 6603e01c91f2SPhilip Reames 6604e01c91f2SPhilip Reamesloop_header: 6605e01c91f2SPhilip Reames %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6606e01c91f2SPhilip Reames call void @bar() 6607e01c91f2SPhilip Reames %cmp_early = icmp ne i64 %iv, %trip2 6608e01c91f2SPhilip Reames br i1 %cmp_early, label %loop_exiting_bb2, label %exit1 6609e01c91f2SPhilip Reames 6610e01c91f2SPhilip Reamesloop_exiting_bb2: 6611e01c91f2SPhilip Reames %unknown = call i1 @unknown_cond() 6612e01c91f2SPhilip Reames br i1 %unknown, label %loop_latch, label %exit1 6613e01c91f2SPhilip Reames 6614e01c91f2SPhilip Reamesloop_latch: 6615e01c91f2SPhilip Reames %iv_next = add i64 %iv, 1 6616e01c91f2SPhilip Reames %cmp = icmp ne i64 %iv_next, %trip 6617e01c91f2SPhilip Reames br i1 %cmp, label %loop_header, label %exit1 6618e01c91f2SPhilip Reames 6619e01c91f2SPhilip Reamesexit1: 6620e01c91f2SPhilip Reames ret void 6621e01c91f2SPhilip Reames} 6622e01c91f2SPhilip Reames 6623e01c91f2SPhilip Reames; Mix of invariant and (even in theory) uncomputable exits 6624e01c91f2SPhilip Reamesdefine void @test14(i64 %trip, i1 %cond) { 6625e01c91f2SPhilip Reames; EPILOG-LABEL: @test14( 6626e01c91f2SPhilip Reames; EPILOG-NEXT: entry: 6627*81c648a3SNikita Popov; EPILOG-NEXT: %0 = freeze i64 %trip 6628*81c648a3SNikita Popov; EPILOG-NEXT: %1 = add i64 %0, -1 6629*81c648a3SNikita Popov; EPILOG-NEXT: %xtraiter = and i64 %0, 7 6630*81c648a3SNikita Popov; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 6631323514deSNikita Popov; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6632e01c91f2SPhilip Reames; EPILOG: entry.new: 6633*81c648a3SNikita Popov; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6634e01c91f2SPhilip Reames; EPILOG-NEXT: br label %loop_header 6635e01c91f2SPhilip Reames; EPILOG: loop_header: 6636e01c91f2SPhilip Reames; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 663737ead201SPhilip Reames; EPILOG-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ] 6638e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 6639e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6640e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2: 6641e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown = call i1 @unknown_cond() 6642e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6643e01c91f2SPhilip Reames; EPILOG: loop_latch: 6644e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1 664537ead201SPhilip Reames; EPILOG-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6646e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 664772031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6648e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.1: 6649e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6650e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6651e01c91f2SPhilip Reames; EPILOG: loop_latch.1: 6652e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1 665337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.1 = add nuw nsw i64 %niter.next, 1 6654e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 665572031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit 6656e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.2: 6657e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6658e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit 6659e01c91f2SPhilip Reames; EPILOG: loop_latch.2: 6660e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1 666137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.2 = add nuw nsw i64 %niter.next.1, 1 6662e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 666372031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit 6664e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.3: 6665e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6666e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit 6667e01c91f2SPhilip Reames; EPILOG: loop_latch.3: 6668e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1 666937ead201SPhilip Reames; EPILOG-NEXT: %niter.next.3 = add nuw nsw i64 %niter.next.2, 1 6670e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 667172031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit 6672e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.4: 6673e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6674e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit 6675e01c91f2SPhilip Reames; EPILOG: loop_latch.4: 6676e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1 667737ead201SPhilip Reames; EPILOG-NEXT: %niter.next.4 = add nuw nsw i64 %niter.next.3, 1 6678e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 667972031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit 6680e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.5: 6681e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6682e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit 6683e01c91f2SPhilip Reames; EPILOG: loop_latch.5: 6684e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1 668537ead201SPhilip Reames; EPILOG-NEXT: %niter.next.5 = add nuw nsw i64 %niter.next.4, 1 6686e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 668772031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit 6688e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.6: 6689e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6690e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit 6691e01c91f2SPhilip Reames; EPILOG: loop_latch.6: 6692e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1 669337ead201SPhilip Reames; EPILOG-NEXT: %niter.next.6 = add nuw nsw i64 %niter.next.5, 1 6694e01c91f2SPhilip Reames; EPILOG-NEXT: call void @bar() 669572031407SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit 6696e01c91f2SPhilip Reames; EPILOG: loop_exiting_bb2.7: 6697e01c91f2SPhilip Reames; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6698e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit 6699e01c91f2SPhilip Reames; EPILOG: loop_latch.7: 6700e01c91f2SPhilip Reames; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 670137ead201SPhilip Reames; EPILOG-NEXT: %niter.next.7 = add i64 %niter.next.6, 1 670237ead201SPhilip Reames; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter 6703e01c91f2SPhilip Reames; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6704de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa.loopexit: 6705de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ] 6706de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.unr-lcssa 6707de2fed61SPhilip Reames; EPILOG: exit1.unr-lcssa: 6708de2fed61SPhilip Reames; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ] 6709de2fed61SPhilip Reames; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6710de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6711de2fed61SPhilip Reames; EPILOG: loop_header.epil.preheader: 6712de2fed61SPhilip Reames; EPILOG-NEXT: br label %loop_header.epil 6713de2fed61SPhilip Reames; EPILOG: loop_header.epil: 6714de2fed61SPhilip Reames; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ] 671537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ] 6716de2fed61SPhilip Reames; EPILOG-NEXT: call void @bar() 6717de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1 6718de2fed61SPhilip Reames; EPILOG: loop_exiting_bb2.epil: 6719de2fed61SPhilip Reames; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond() 6720de2fed61SPhilip Reames; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1 6721de2fed61SPhilip Reames; EPILOG: loop_latch.epil: 6722de2fed61SPhilip Reames; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1 6723de2fed61SPhilip Reames; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip 672437ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.next = add i64 %epil.iter, 1 672537ead201SPhilip Reames; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter 6726da327e72SPhilip Reames; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18 6727de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit: 6728de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6729de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa.loopexit1: 6730de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1.epilog-lcssa 6731de2fed61SPhilip Reames; EPILOG: exit1.epilog-lcssa: 6732de2fed61SPhilip Reames; EPILOG-NEXT: br label %exit1 6733de2fed61SPhilip Reames; EPILOG: exit1: 6734de2fed61SPhilip Reames; EPILOG-NEXT: ret void 6735e01c91f2SPhilip Reames; 6736e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test14( 6737e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: entry: 6738*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip 6739*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 6740*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6741*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6742323514deSNikita Popov; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new 6743e01c91f2SPhilip Reames; EPILOG-BLOCK: entry.new: 6744*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter 6745e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header 6746e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header: 6747e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 674837ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ] 6749e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6750e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit 6751e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2: 6752e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6753e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit 6754e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch: 6755e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1 675637ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next = add nuw nsw i64 %niter, 1 6757e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 675872031407SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit 6759de2fed61SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.1: 6760de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6761de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit 6762de2fed61SPhilip Reames; EPILOG-BLOCK: loop_latch.1: 6763de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 676437ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.next.1 = add i64 %niter.next, 1 676537ead201SPhilip Reames; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter 6766da327e72SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6767e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa.loopexit: 6768e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6769e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.unr-lcssa: 6770e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6771e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1 6772e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil.preheader: 6773e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %loop_header.epil 6774e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_header.epil: 6775e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: call void @bar() 6776e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa 6777e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_exiting_bb2.epil: 6778e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond() 6779e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa 6780e01c91f2SPhilip Reames; EPILOG-BLOCK: loop_latch.epil: 6781e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6782e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit: 6783e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa 6784e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1.epilog-lcssa: 6785e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: br label %exit1 6786e01c91f2SPhilip Reames; EPILOG-BLOCK: exit1: 6787e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT: ret void 6788e01c91f2SPhilip Reames; 6789e01c91f2SPhilip Reames; PROLOG-LABEL: @test14( 6790e01c91f2SPhilip Reames; PROLOG-NEXT: entry: 6791*81c648a3SNikita Popov; PROLOG-NEXT: %0 = freeze i64 %trip 6792*81c648a3SNikita Popov; PROLOG-NEXT: %1 = add i64 %0, -1 6793*81c648a3SNikita Popov; PROLOG-NEXT: %xtraiter = and i64 %0, 7 6794e01c91f2SPhilip Reames; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6795*81c648a3SNikita Popov; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6796e01c91f2SPhilip Reames; PROLOG: loop_header.prol.preheader: 6797e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol 6798e01c91f2SPhilip Reames; PROLOG: loop_header.prol: 6799e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ] 680037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ] 6801e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6802e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1 6803e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.prol: 6804e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond() 6805e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1 6806e01c91f2SPhilip Reames; PROLOG: loop_latch.prol: 6807e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1 6808e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip 680937ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.next = add i64 %prol.iter, 1 681037ead201SPhilip Reames; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter 6811da327e72SPhilip Reames; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18 6812e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit.unr-lcssa: 6813e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ] 6814e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header.prol.loopexit 6815e01c91f2SPhilip Reames; PROLOG: loop_header.prol.loopexit: 6816e01c91f2SPhilip Reames; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ] 6817*81c648a3SNikita Popov; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 6818323514deSNikita Popov; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new 6819e01c91f2SPhilip Reames; PROLOG: entry.new: 6820e01c91f2SPhilip Reames; PROLOG-NEXT: br label %loop_header 6821e01c91f2SPhilip Reames; PROLOG: loop_header: 6822e01c91f2SPhilip Reames; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ] 6823e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 6824e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6825e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2: 6826e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown = call i1 @unknown_cond() 6827e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6828e01c91f2SPhilip Reames; PROLOG: loop_latch: 6829e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next = add i64 %iv, 1 6830e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 683172031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6832e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.1: 6833e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond() 6834e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6835e01c91f2SPhilip Reames; PROLOG: loop_latch.1: 6836e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1 6837e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 683872031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit 6839e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.2: 6840e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond() 6841e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit 6842e01c91f2SPhilip Reames; PROLOG: loop_latch.2: 6843e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1 6844e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 684572031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit 6846e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.3: 6847e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond() 6848e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit 6849e01c91f2SPhilip Reames; PROLOG: loop_latch.3: 6850e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1 6851e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 685272031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit 6853e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.4: 6854e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond() 6855e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit 6856e01c91f2SPhilip Reames; PROLOG: loop_latch.4: 6857e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1 6858e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 685972031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit 6860e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.5: 6861e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond() 6862e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit 6863e01c91f2SPhilip Reames; PROLOG: loop_latch.5: 6864e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1 6865e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 686672031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit 6867e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.6: 6868e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond() 6869e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit 6870e01c91f2SPhilip Reames; PROLOG: loop_latch.6: 6871e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1 6872e01c91f2SPhilip Reames; PROLOG-NEXT: call void @bar() 687372031407SPhilip Reames; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit 6874e01c91f2SPhilip Reames; PROLOG: loop_exiting_bb2.7: 6875e01c91f2SPhilip Reames; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond() 6876e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit 6877e01c91f2SPhilip Reames; PROLOG: loop_latch.7: 6878e01c91f2SPhilip Reames; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1 6879e01c91f2SPhilip Reames; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip 6880e01c91f2SPhilip Reames; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit 6881de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit: 6882de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6883de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa.loopexit1: 6884de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1.unr-lcssa 6885de2fed61SPhilip Reames; PROLOG: exit1.unr-lcssa: 6886de2fed61SPhilip Reames; PROLOG-NEXT: br label %exit1 6887de2fed61SPhilip Reames; PROLOG: exit1: 6888de2fed61SPhilip Reames; PROLOG-NEXT: ret void 6889e01c91f2SPhilip Reames; 6890e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test14( 6891e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: entry: 6892*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip 6893*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 6894*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 6895e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 6896*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit 6897e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.preheader: 6898e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol 6899e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol: 6900e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6901e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa 6902e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.prol: 6903e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond() 6904e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa 6905e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.prol: 6906e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit 6907e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header.prol.loopexit: 6908e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] 6909*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 6910323514deSNikita Popov; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new 6911e01c91f2SPhilip Reames; PROLOG-BLOCK: entry.new: 6912e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br label %loop_header 6913e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_header: 6914e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ] 6915e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 6916e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit 6917e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2: 6918e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond() 6919e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit 6920e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch: 6921e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1 6922e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: call void @bar() 692372031407SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit 6924e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_exiting_bb2.1: 6925e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond() 6926e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit 6927e01c91f2SPhilip Reames; PROLOG-BLOCK: loop_latch.1: 6928e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1 6929e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip 6930da327e72SPhilip Reames; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20 6931de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa.loopexit: 6932de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa 6933de2fed61SPhilip Reames; PROLOG-BLOCK: exit1.unr-lcssa: 6934de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: br label %exit1 6935de2fed61SPhilip Reames; PROLOG-BLOCK: exit1: 6936de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT: ret void 6937e01c91f2SPhilip Reames; 6938e01c91f2SPhilip Reamesentry: 6939e01c91f2SPhilip Reames br label %loop_header 6940e01c91f2SPhilip Reames 6941e01c91f2SPhilip Reamesloop_header: 6942e01c91f2SPhilip Reames %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ] 6943e01c91f2SPhilip Reames call void @bar() 6944e01c91f2SPhilip Reames br i1 %cond, label %loop_exiting_bb2, label %exit1 6945e01c91f2SPhilip Reames 6946e01c91f2SPhilip Reamesloop_exiting_bb2: 6947e01c91f2SPhilip Reames %unknown = call i1 @unknown_cond() 6948e01c91f2SPhilip Reames br i1 %unknown, label %loop_latch, label %exit1 6949e01c91f2SPhilip Reames 6950e01c91f2SPhilip Reamesloop_latch: 6951e01c91f2SPhilip Reames %iv_next = add i64 %iv, 1 6952e01c91f2SPhilip Reames %cmp = icmp ne i64 %iv_next, %trip 6953e01c91f2SPhilip Reames br i1 %cmp, label %loop_header, label %exit1 6954e01c91f2SPhilip Reames 6955e01c91f2SPhilip Reamesexit1: 6956e01c91f2SPhilip Reames ret void 6957e01c91f2SPhilip Reames} 6958