runtime-loop-multiple-exits.ll 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefix=EPILOG-NO-IC
  2. ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=EPILOG
  3. ; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine
  4. ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=PROLOG
  5. ; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine
  6. ; the third and fifth RUNs generate an epilog/prolog remainder block for all the test
  7. ; cases below (it does not generate a loop).
  8. ; test with three exiting and three exit blocks.
  9. ; none of the exit blocks have successors
  10. define void @test1(i64 %trip, i1 %cond) {
  11. ; EPILOG: test1(
  12. ; EPILOG-NEXT: entry:
  13. ; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
  14. ; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
  15. ; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
  16. ; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
  17. ; EPILOG: entry.new:
  18. ; EPILOG-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TRIP]], [[XTRAITER]]
  19. ; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
  20. ; EPILOG: loop_latch.epil:
  21. ; EPILOG-NEXT: %epil.iter.sub = add i64 %epil.iter, -1
  22. ; EPILOG-NEXT: %epil.iter.cmp = icmp eq i64 %epil.iter.sub, 0
  23. ; EPILOG-NEXT: br i1 %epil.iter.cmp, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil
  24. ; EPILOG: loop_latch.7:
  25. ; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
  26. ; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
  27. ; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
  28. ; PROLOG: test1(
  29. ; PROLOG-NEXT: entry:
  30. ; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
  31. ; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
  32. ; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
  33. ; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
  34. ; PROLOG: loop_header.prol:
  35. ; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
  36. ; PROLOG-NEXT: %prol.iter = phi i64 [ [[XTRAITER]], %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
  37. ; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
  38. ; PROLOG: loop_latch.prol:
  39. ; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
  40. ; PROLOG-NEXT: %prol.iter.sub = add i64 %prol.iter, -1
  41. ; PROLOG-NEXT: %prol.iter.cmp = icmp eq i64 %prol.iter.sub, 0
  42. ; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol.loopexit.unr-lcssa, label %loop_header.prol
  43. ; PROLOG: loop_latch.7:
  44. ; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8
  45. ; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
  46. ; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
  47. entry:
  48. br label %loop_header
  49. loop_header:
  50. %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
  51. br i1 %cond, label %loop_latch, label %loop_exiting_bb1
  52. loop_exiting_bb1:
  53. br i1 false, label %loop_exiting_bb2, label %exit1
  54. loop_exiting_bb2:
  55. br i1 false, label %loop_latch, label %exit3
  56. exit3:
  57. ret void
  58. loop_latch:
  59. %iv_next = add i64 %iv, 1
  60. %cmp = icmp ne i64 %iv_next, %trip
  61. br i1 %cmp, label %loop_header, label %exit2.loopexit
  62. exit1:
  63. ret void
  64. exit2.loopexit:
  65. ret void
  66. }
  67. ; test with three exiting and two exit blocks.
  68. ; The non-latch exit block has 2 unique predecessors.
  69. ; There are 2 values passed to the exit blocks that are calculated at every iteration.
  70. ; %sum.02 and %add. Both of these are incoming values for phi from every exiting
  71. ; unrolled block.
  72. define i32 @test2(i32* nocapture %a, i64 %n) {
  73. ; EPILOG: test2(
  74. ; EPILOG: for.exit2.loopexit:
  75. ; 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 ],
  76. ; EPILOG-NEXT: br label %for.exit2
  77. ; EPILOG: for.exit2.loopexit2:
  78. ; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
  79. ; EPILOG-NEXT: br label %for.exit2
  80. ; EPILOG: for.exit2:
  81. ; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
  82. ; EPILOG-NEXT: ret i32 %retval
  83. ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
  84. ; PROLOG: test2(
  85. ; PROLOG: for.exit2.loopexit:
  86. ; 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 ],
  87. ; PROLOG-NEXT: br label %for.exit2
  88. ; PROLOG: for.exit2.loopexit1:
  89. ; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
  90. ; PROLOG-NEXT: br label %for.exit2
  91. ; PROLOG: for.exit2:
  92. ; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
  93. ; PROLOG-NEXT: ret i32 %retval
  94. ; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
  95. entry:
  96. br label %header
  97. header:
  98. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  99. %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
  100. br i1 false, label %for.exit2, label %for.exiting_block
  101. for.exiting_block:
  102. %cmp = icmp eq i64 %n, 42
  103. br i1 %cmp, label %for.exit2, label %for.body
  104. for.body:
  105. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  106. %0 = load i32, i32* %arrayidx, align 4
  107. %add = add nsw i32 %0, %sum.02
  108. %indvars.iv.next = add i64 %indvars.iv, 1
  109. %exitcond = icmp eq i64 %indvars.iv.next, %n
  110. br i1 %exitcond, label %for.end, label %header
  111. for.end: ; preds = %for.body
  112. %sum.0.lcssa = phi i32 [ %add, %for.body ]
  113. ret i32 %sum.0.lcssa
  114. for.exit2:
  115. %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
  116. ret i32 %retval
  117. }
  118. ; test with two exiting and three exit blocks.
  119. ; the non-latch exiting block has a switch.
  120. define void @test3(i64 %trip, i64 %add) {
  121. ; EPILOG: test3(
  122. ; EPILOG-NEXT: entry:
  123. ; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
  124. ; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
  125. ; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
  126. ; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
  127. ; EPILOG: entry.new:
  128. ; EPILOG-NEXT: %unroll_iter = sub i64 [[TRIP]], [[XTRAITER]]
  129. ; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
  130. ; EPILOG: loop_header:
  131. ; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
  132. ; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
  133. ; EPILOG: loop_exiting_bb1.7:
  134. ; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
  135. ; EPILOG: loop_latch.7:
  136. ; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
  137. ; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
  138. ; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
  139. ; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
  140. ; PROLOG: test3(
  141. ; PROLOG-NEXT: entry:
  142. ; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
  143. ; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
  144. ; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
  145. ; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
  146. ; PROLOG: loop_header:
  147. ; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
  148. ; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
  149. ; PROLOG: loop_exiting_bb1.7:
  150. ; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
  151. ; PROLOG: loop_latch.7:
  152. ; PROLOG-NEXT: %iv_next.7 = add nsw i64 %iv, 8
  153. ; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
  154. ; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
  155. ; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
  156. entry:
  157. br label %loop_header
  158. loop_header:
  159. %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
  160. %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
  161. br i1 undef, label %loop_latch, label %loop_exiting_bb1
  162. loop_exiting_bb1:
  163. switch i64 %sum, label %loop_latch [
  164. i64 24, label %exit1
  165. i64 42, label %exit3
  166. ]
  167. exit3:
  168. ret void
  169. loop_latch:
  170. %iv_next = add nuw nsw i64 %iv, 1
  171. %sum.next = add i64 %sum, %add
  172. %cmp = icmp ne i64 %iv_next, %trip
  173. br i1 %cmp, label %loop_header, label %exit2.loopexit
  174. exit1:
  175. ret void
  176. exit2.loopexit:
  177. ret void
  178. }
  179. ; FIXME: Support multiple exiting blocks to the same latch exit block.
  180. define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) {
  181. ; EPILOG: test4(
  182. ; EPILOG-NOT: .unr
  183. ; EPILOG-NOT: .epil
  184. ; PROLOG: test4(
  185. ; PROLOG-NOT: .unr
  186. ; PROLOG-NOT: .prol
  187. entry:
  188. br label %header
  189. header:
  190. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  191. %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
  192. br i1 %cond, label %for.end, label %for.exiting_block
  193. for.exiting_block:
  194. %cmp = icmp eq i64 %n, 42
  195. br i1 %cmp, label %for.exit2, label %for.body
  196. for.body: ; preds = %for.body, %entry
  197. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  198. %0 = load i32, i32* %arrayidx, align 4
  199. %add = add nsw i32 %0, %sum.02
  200. %indvars.iv.next = add i64 %indvars.iv, 1
  201. %exitcond = icmp eq i64 %indvars.iv.next, %n
  202. br i1 %exitcond, label %for.end, label %header
  203. for.end: ; preds = %for.body, %entry
  204. %sum.0.lcssa = phi i32 [ 0, %header ], [ %add, %for.body ]
  205. ret i32 %sum.0.lcssa
  206. for.exit2:
  207. ret i32 42
  208. }
  209. ; FIXME: Support multiple exiting blocks to the unique exit block.
  210. define void @unique_exit(i32 %arg) {
  211. ; EPILOG: unique_exit(
  212. ; EPILOG-NOT: .unr
  213. ; EPILOG-NOT: .epil
  214. ; PROLOG: unique_exit(
  215. ; PROLOG-NOT: .unr
  216. ; PROLOG-NOT: .prol
  217. entry:
  218. %tmp = icmp sgt i32 undef, %arg
  219. br i1 %tmp, label %preheader, label %returnblock
  220. preheader: ; preds = %entry
  221. br label %header
  222. LoopExit: ; preds = %header, %latch
  223. %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ]
  224. br label %returnblock
  225. returnblock: ; preds = %LoopExit, %entry
  226. %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %LoopExit ]
  227. ret void
  228. header: ; preds = %preheader, %latch
  229. %tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
  230. %inc = add nsw i32 %tmp4, 1
  231. br i1 true, label %LoopExit, label %latch
  232. latch: ; preds = %header
  233. %cmp = icmp slt i32 %inc, undef
  234. br i1 %cmp, label %header, label %LoopExit
  235. }
  236. ; two exiting and two exit blocks.
  237. ; the non-latch exiting block has duplicate edges to the non-latch exit block.
  238. define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
  239. ; EPILOG: test5(
  240. ; EPILOG: exit1.loopexit:
  241. ; 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 ],
  242. ; EPILOG-NEXT: br label %exit1
  243. ; EPILOG: exit1.loopexit2:
  244. ; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add
  245. ; EPILOG-NEXT: br label %exit1
  246. ; EPILOG: exit1:
  247. ; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.epil, %exit1.loopexit2 ]
  248. ; EPILOG-NEXT: ret i64 %result
  249. ; EPILOG: loop_latch.7:
  250. ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
  251. ; PROLOG: test5(
  252. ; PROLOG: exit1.loopexit:
  253. ; 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 ],
  254. ; PROLOG-NEXT: br label %exit1
  255. ; PROLOG: exit1.loopexit1:
  256. ; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add
  257. ; PROLOG-NEXT: br label %exit1
  258. ; PROLOG: exit1:
  259. ; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.prol, %exit1.loopexit1 ]
  260. ; PROLOG-NEXT: ret i64 %result
  261. ; PROLOG: loop_latch.7:
  262. ; PROLOG: %iv_next.7 = add nsw i64 %iv, 8
  263. entry:
  264. br label %loop_header
  265. loop_header:
  266. %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
  267. %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
  268. br i1 %cond, label %loop_latch, label %loop_exiting
  269. loop_exiting:
  270. %ivy = add i64 %iv, %add
  271. switch i64 %sum, label %loop_latch [
  272. i64 24, label %exit1
  273. i64 42, label %exit1
  274. ]
  275. loop_latch:
  276. %iv_next = add nuw nsw i64 %iv, 1
  277. %sum.next = add i64 %sum, %add
  278. %cmp = icmp ne i64 %iv_next, %trip
  279. br i1 %cmp, label %loop_header, label %latchexit
  280. exit1:
  281. %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
  282. ret i64 %result
  283. latchexit:
  284. ret i64 %sum.next
  285. }
  286. ; test when exit blocks have successors.
  287. define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
  288. ; EPILOG: test6(
  289. ; EPILOG: for.exit2.loopexit:
  290. ; 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 ],
  291. ; EPILOG-NEXT: br label %for.exit2
  292. ; EPILOG: for.exit2.loopexit2:
  293. ; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
  294. ; EPILOG-NEXT: br label %for.exit2
  295. ; EPILOG: for.exit2:
  296. ; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
  297. ; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
  298. ; EPILOG: latch.7:
  299. ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
  300. ; PROLOG: test6(
  301. ; PROLOG: for.exit2.loopexit:
  302. ; 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 ],
  303. ; PROLOG-NEXT: br label %for.exit2
  304. ; PROLOG: for.exit2.loopexit1:
  305. ; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
  306. ; PROLOG-NEXT: br label %for.exit2
  307. ; PROLOG: for.exit2:
  308. ; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
  309. ; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
  310. ; PROLOG: latch.7:
  311. ; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
  312. entry:
  313. br label %header
  314. header:
  315. %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
  316. %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
  317. br i1 false, label %for.exit2, label %for.exiting_block
  318. for.exiting_block:
  319. %cmp = icmp eq i64 %n, 42
  320. br i1 %cmp, label %for.exit2, label %latch
  321. latch:
  322. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  323. %load = load i32, i32* %arrayidx, align 4
  324. %add = add nsw i32 %load, %sum.02
  325. %indvars.iv.next = add i64 %indvars.iv, 1
  326. %exitcond = icmp eq i64 %indvars.iv.next, %n
  327. br i1 %exitcond, label %latch_exit, label %header
  328. latch_exit:
  329. %sum.0.lcssa = phi i32 [ %add, %latch ]
  330. ret i32 %sum.0.lcssa
  331. for.exit2:
  332. %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
  333. %addx = add i32 %retval, %x
  334. br i1 %cond, label %exit_true, label %exit_false
  335. exit_true:
  336. ret i32 %retval
  337. exit_false:
  338. ret i32 %addx
  339. }
  340. ; test when value in exit block does not have VMap.
  341. define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
  342. ; EPILOG-NO-IC: test7(
  343. ; EPILOG-NO-IC: loopexit1.loopexit:
  344. ; EPILOG-NO-IC-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]
  345. ; EPILOG-NO-IC-NEXT: br label %loopexit1
  346. ; EPILOG-NO-IC: loopexit1.loopexit1:
  347. ; EPILOG-NO-IC-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ]
  348. ; EPILOG-NO-IC-NEXT: br label %loopexit1
  349. ; EPILOG-NO-IC: loopexit1:
  350. ; EPILOG-NO-IC-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
  351. bb:
  352. %tmp = icmp slt i32 undef, 2
  353. %sext = sext i32 undef to i64
  354. %shft = ashr exact i32 %arg, 16
  355. br i1 %tmp, label %loopexit2, label %preheader
  356. preheader: ; preds = %bb2
  357. br label %header
  358. header: ; preds = %latch, %preheader
  359. %tmp6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
  360. br i1 false, label %loopexit1, label %latch
  361. latch: ; preds = %header
  362. %add = add nuw nsw i64 %tmp6, 1
  363. %tmp9 = icmp slt i64 %add, %sext
  364. br i1 %tmp9, label %header, label %latchexit
  365. latchexit: ; preds = %latch
  366. unreachable
  367. loopexit2: ; preds = %bb2
  368. ret i32 %shft
  369. loopexit1: ; preds = %header
  370. %sext3 = phi i32 [ %shft, %header ]
  371. ret i32 %sext3
  372. }