unloop.ll 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. ; RUN: opt < %s -S -loop-unroll -verify-loop-info | FileCheck %s
  2. ;
  3. ; Unit tests for LoopInfo::updateUnloop.
  4. declare i1 @check() nounwind
  5. ; Ensure that tail->inner is removed and rely on verify-loopinfo to
  6. ; check soundness.
  7. ;
  8. ; CHECK-LABEL: @skiplevelexit(
  9. ; CHECK: tail:
  10. ; CHECK-NOT: br
  11. ; CHECK: ret void
  12. define void @skiplevelexit() nounwind {
  13. entry:
  14. br label %outer
  15. outer:
  16. br label %inner
  17. inner:
  18. %iv = phi i32 [ 0, %outer ], [ %inc, %tail ]
  19. %inc = add i32 %iv, 1
  20. call zeroext i1 @check()
  21. br i1 true, label %outer.backedge, label %tail
  22. tail:
  23. br i1 false, label %inner, label %exit
  24. outer.backedge:
  25. br label %outer
  26. exit:
  27. ret void
  28. }
  29. ; Remove the middle loop of a triply nested loop tree.
  30. ; Ensure that only the middle loop is removed and rely on verify-loopinfo to
  31. ; check soundness.
  32. ;
  33. ; CHECK-LABEL: @unloopNested(
  34. ; Outer loop control.
  35. ; CHECK: while.body:
  36. ; CHECK: br i1 %cmp3, label %if.then, label %if.end
  37. ; Inner loop control.
  38. ; CHECK: while.end14.i:
  39. ; CHECK: br i1 %call15.i, label %if.end.i, label %exit
  40. ; Middle loop control should no longer reach %while.cond.
  41. ; Now it is the outer loop backedge.
  42. ; CHECK: exit:
  43. ; CHECK: br label %while.cond.outer
  44. define void @unloopNested() {
  45. entry:
  46. br label %while.cond.outer
  47. while.cond.outer:
  48. br label %while.cond
  49. while.cond:
  50. %cmp = call zeroext i1 @check()
  51. br i1 %cmp, label %while.body, label %while.end
  52. while.body:
  53. %cmp3 = call zeroext i1 @check()
  54. br i1 %cmp3, label %if.then, label %if.end
  55. if.then:
  56. br label %return
  57. if.end:
  58. %cmp.i48 = call zeroext i1 @check()
  59. br i1 %cmp.i48, label %if.then.i, label %if.else20.i
  60. if.then.i:
  61. %cmp8.i = call zeroext i1 @check()
  62. br i1 %cmp8.i, label %merge, label %if.else.i
  63. if.else.i:
  64. br label %merge
  65. if.else20.i:
  66. %cmp25.i = call zeroext i1 @check()
  67. br i1 %cmp25.i, label %merge, label %if.else28.i
  68. if.else28.i:
  69. br label %merge
  70. merge:
  71. br label %while.cond2.i
  72. while.cond2.i:
  73. %cmp.i = call zeroext i1 @check()
  74. br i1 %cmp.i, label %while.cond2.backedge.i, label %while.end.i
  75. while.cond2.backedge.i:
  76. br label %while.cond2.i
  77. while.end.i:
  78. %cmp1114.i = call zeroext i1 @check()
  79. br i1 %cmp1114.i, label %while.body12.lr.ph.i, label %while.end14.i
  80. while.body12.lr.ph.i:
  81. br label %while.end14.i
  82. while.end14.i:
  83. %call15.i = call zeroext i1 @check()
  84. br i1 %call15.i, label %if.end.i, label %exit
  85. if.end.i:
  86. br label %while.cond2.backedge.i
  87. exit:
  88. br i1 false, label %while.cond, label %if.else
  89. if.else:
  90. br label %while.cond.outer
  91. while.end:
  92. br label %return
  93. return:
  94. ret void
  95. }
  96. ; Remove the middle loop of a deeply nested loop tree.
  97. ; Ensure that only the middle loop is removed and rely on verify-loopinfo to
  98. ; check soundness.
  99. ;
  100. ; This test must be disabled until trip count computation can be optimized...
  101. ; rdar:14038809 [SCEV]: Optimize trip count computation for multi-exit loops.
  102. ; CHECKFIXME-LABEL: @unloopDeepNested(
  103. ; Inner-inner loop control.
  104. ; CHECKFIXME: while.cond.us.i:
  105. ; CHECKFIXME: br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i
  106. ; CHECKFIXME: if.then.us.i:
  107. ; CHECKFIXME: br label %while.cond.us.i
  108. ; Inner loop tail.
  109. ; CHECKFIXME: if.else.i:
  110. ; CHECKFIXME: br label %while.cond.outer.i
  111. ; Middle loop control (removed).
  112. ; CHECKFIXME: valid_data.exit:
  113. ; CHECKFIXME-NOT: br
  114. ; CHECKFIXME: %cmp = call zeroext i1 @check()
  115. ; Outer loop control.
  116. ; CHECKFIXME: copy_data.exit:
  117. ; CHECKFIXME: br i1 %cmp38, label %if.then39, label %while.cond.outer
  118. ; Outer-outer loop tail.
  119. ; CHECKFIXME: while.cond.outer.outer.backedge:
  120. ; CHECKFIXME: br label %while.cond.outer.outer
  121. define void @unloopDeepNested() nounwind {
  122. for.cond8.preheader.i:
  123. %cmp113.i = call zeroext i1 @check()
  124. br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i
  125. for.body13.lr.ph.i:
  126. br label %make_data.exit
  127. make_data.exit:
  128. br label %while.cond.outer.outer
  129. while.cond.outer.outer:
  130. br label %while.cond.outer
  131. while.cond.outer:
  132. br label %while.cond
  133. while.cond:
  134. br label %while.cond.outer.i
  135. while.cond.outer.i:
  136. %tmp192.ph.i = call zeroext i1 @check()
  137. br i1 %tmp192.ph.i, label %while.cond.outer.split.us.i, label %while.body.loopexit
  138. while.cond.outer.split.us.i:
  139. br label %while.cond.us.i
  140. while.cond.us.i:
  141. %cmp.us.i = call zeroext i1 @check()
  142. br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i
  143. while.body.us.i:
  144. %cmp7.us.i = call zeroext i1 @check()
  145. br i1 %cmp7.us.i, label %if.then.us.i, label %if.else.i
  146. if.then.us.i:
  147. br label %while.cond.us.i
  148. if.else.i:
  149. br label %while.cond.outer.i
  150. next_data.exit:
  151. %tmp192.ph.i.lcssa28 = call zeroext i1 @check()
  152. br i1 %tmp192.ph.i.lcssa28, label %while.end, label %while.body
  153. while.body.loopexit:
  154. br label %while.body
  155. while.body:
  156. br label %while.cond.i
  157. while.cond.i:
  158. %cmp.i = call zeroext i1 @check()
  159. br i1 %cmp.i, label %valid_data.exit, label %while.body.i
  160. while.body.i:
  161. %cmp7.i = call zeroext i1 @check()
  162. br i1 %cmp7.i, label %valid_data.exit, label %if.end.i
  163. if.end.i:
  164. br label %while.cond.i
  165. valid_data.exit:
  166. br i1 true, label %if.then, label %while.cond
  167. if.then:
  168. %cmp = call zeroext i1 @check()
  169. br i1 %cmp, label %if.then12, label %if.end
  170. if.then12:
  171. br label %if.end
  172. if.end:
  173. %tobool3.i = call zeroext i1 @check()
  174. br i1 %tobool3.i, label %copy_data.exit, label %while.body.lr.ph.i
  175. while.body.lr.ph.i:
  176. br label %copy_data.exit
  177. copy_data.exit:
  178. %cmp38 = call zeroext i1 @check()
  179. br i1 %cmp38, label %if.then39, label %while.cond.outer
  180. if.then39:
  181. %cmp5.i = call zeroext i1 @check()
  182. br i1 %cmp5.i, label %while.cond.outer.outer.backedge, label %for.cond8.preheader.i8.thread
  183. for.cond8.preheader.i8.thread:
  184. br label %while.cond.outer.outer.backedge
  185. while.cond.outer.outer.backedge:
  186. br label %while.cond.outer.outer
  187. while.end:
  188. ret void
  189. }
  190. ; Remove a nested loop with irreducible control flow.
  191. ; Ensure that only the middle loop is removed and rely on verify-loopinfo to
  192. ; check soundness.
  193. ;
  194. ; CHECK-LABEL: @unloopIrreducible(
  195. ; Irreducible loop.
  196. ; CHECK: for.inc117:
  197. ; CHECK: br label %for.cond103t
  198. ; Nested loop (removed).
  199. ; CHECK: for.inc159:
  200. ; CHECK: br label %for.inc163
  201. define void @unloopIrreducible() nounwind {
  202. entry:
  203. br label %for.body
  204. for.body:
  205. %cmp2113 = call zeroext i1 @check()
  206. br i1 %cmp2113, label %for.body22.lr.ph, label %for.inc163
  207. for.body22.lr.ph:
  208. br label %for.body22
  209. for.body22:
  210. br label %for.body33
  211. for.body33:
  212. br label %for.end
  213. for.end:
  214. %cmp424 = call zeroext i1 @check()
  215. br i1 %cmp424, label %for.body43.lr.ph, label %for.end93
  216. for.body43.lr.ph:
  217. br label %for.end93
  218. for.end93:
  219. %cmp96 = call zeroext i1 @check()
  220. br i1 %cmp96, label %if.then97, label %for.cond103
  221. if.then97:
  222. br label %for.cond103t
  223. for.cond103t:
  224. br label %for.cond103
  225. for.cond103:
  226. %cmp105 = call zeroext i1 @check()
  227. br i1 %cmp105, label %for.body106, label %for.end120
  228. for.body106:
  229. %cmp108 = call zeroext i1 @check()
  230. br i1 %cmp108, label %if.then109, label %for.inc117
  231. if.then109:
  232. br label %for.inc117
  233. for.inc117:
  234. br label %for.cond103t
  235. for.end120:
  236. br label %for.inc159
  237. for.inc159:
  238. br i1 false, label %for.body22, label %for.cond15.for.inc163_crit_edge
  239. for.cond15.for.inc163_crit_edge:
  240. br label %for.inc163
  241. for.inc163:
  242. %cmp12 = call zeroext i1 @check()
  243. br i1 %cmp12, label %for.body, label %for.end166
  244. for.end166:
  245. ret void
  246. }
  247. ; Remove a loop whose exit branches into a sibling loop.
  248. ; Ensure that only the loop is removed and rely on verify-loopinfo to
  249. ; check soundness.
  250. ;
  251. ; CHECK-LABEL: @unloopCriticalEdge(
  252. ; CHECK: while.cond.outer.i.loopexit.split:
  253. ; CHECK: br label %while.body
  254. ; CHECK: while.body:
  255. ; CHECK: br label %for.end78
  256. define void @unloopCriticalEdge() nounwind {
  257. entry:
  258. br label %for.cond31
  259. for.cond31:
  260. br i1 undef, label %for.body35, label %for.end94
  261. for.body35:
  262. br label %while.cond.i.preheader
  263. while.cond.i.preheader:
  264. br i1 undef, label %while.cond.i.preheader.split, label %while.cond.outer.i.loopexit.split
  265. while.cond.i.preheader.split:
  266. br label %while.cond.i
  267. while.cond.i:
  268. br i1 true, label %while.cond.i, label %while.cond.outer.i.loopexit
  269. while.cond.outer.i.loopexit:
  270. br label %while.cond.outer.i.loopexit.split
  271. while.cond.outer.i.loopexit.split:
  272. br i1 false, label %while.cond.i.preheader, label %Func2.exit
  273. Func2.exit:
  274. br label %while.body
  275. while.body:
  276. br i1 false, label %while.body, label %while.end
  277. while.end:
  278. br label %for.end78
  279. for.end78:
  280. br i1 undef, label %Proc2.exit, label %for.cond.i.preheader
  281. for.cond.i.preheader:
  282. br label %for.cond.i
  283. for.cond.i:
  284. br label %for.cond.i
  285. Proc2.exit:
  286. br label %for.cond31
  287. for.end94:
  288. ret void
  289. }
  290. ; Test UnloopUpdater::removeBlocksFromAncestors.
  291. ;
  292. ; Check that the loop backedge is removed from the middle loop 1699,
  293. ; but not the inner loop 1676.
  294. ; CHECK: while.body1694:
  295. ; CHECK: br label %while.cond1676
  296. ; CHECK: while.end1699:
  297. ; CHECK: br label %sw.default1711
  298. define void @removeSubloopBlocks() nounwind {
  299. entry:
  300. br label %tryagain.outer
  301. tryagain.outer: ; preds = %sw.bb304, %entry
  302. br label %tryagain
  303. tryagain: ; preds = %while.end1699, %tryagain.outer
  304. br i1 undef, label %sw.bb1669, label %sw.bb304
  305. sw.bb304: ; preds = %tryagain
  306. br i1 undef, label %return, label %tryagain.outer
  307. sw.bb1669: ; preds = %tryagain
  308. br i1 undef, label %sw.default1711, label %while.cond1676
  309. while.cond1676: ; preds = %while.body1694, %sw.bb1669
  310. br i1 undef, label %while.end1699, label %while.body1694
  311. while.body1694: ; preds = %while.cond1676
  312. br label %while.cond1676
  313. while.end1699: ; preds = %while.cond1676
  314. br i1 false, label %tryagain, label %sw.default1711
  315. sw.default1711: ; preds = %while.end1699, %sw.bb1669, %tryagain
  316. br label %defchar
  317. defchar: ; preds = %sw.default1711, %sw.bb376
  318. br i1 undef, label %if.end2413, label %if.then2368
  319. if.then2368: ; preds = %defchar
  320. unreachable
  321. if.end2413: ; preds = %defchar
  322. unreachable
  323. return: ; preds = %sw.bb304
  324. ret void
  325. }
  326. ; PR11335: the most deeply nested block should be removed from the outer loop.
  327. ; CHECK-LABEL: @removeSubloopBlocks2(
  328. ; CHECK: for.cond3:
  329. ; CHECK-NOT: br
  330. ; CHECK: ret void
  331. define void @removeSubloopBlocks2() nounwind {
  332. entry:
  333. %tobool.i = icmp ne i32 undef, 0
  334. br label %lbl_616
  335. lbl_616.loopexit: ; preds = %for.cond
  336. br label %lbl_616
  337. lbl_616: ; preds = %lbl_616.loopexit, %entry
  338. br label %for.cond
  339. for.cond: ; preds = %for.cond3, %lbl_616
  340. br i1 false, label %for.cond1.preheader, label %lbl_616.loopexit
  341. for.cond1.preheader: ; preds = %for.cond
  342. br label %for.cond1
  343. for.cond1.loopexit: ; preds = %for.cond.i
  344. br label %for.cond1
  345. for.cond1: ; preds = %for.cond1.loopexit, %for.cond1.preheader
  346. br i1 false, label %for.body2, label %for.cond3
  347. for.body2: ; preds = %for.cond1
  348. br label %for.cond.i
  349. for.cond.i: ; preds = %for.cond.i, %for.body2
  350. br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit
  351. for.cond3: ; preds = %for.cond1
  352. br i1 false, label %for.cond, label %if.end
  353. if.end: ; preds = %for.cond3
  354. ret void
  355. }