sinking.ll 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. ; RUN: opt < %s -basicaa -licm -S | FileCheck %s
  2. declare i32 @strlen(i8*) readonly
  3. declare void @foo()
  4. ; Sink readonly function.
  5. define i32 @test1(i8* %P) {
  6. br label %Loop
  7. Loop: ; preds = %Loop, %0
  8. %A = call i32 @strlen( i8* %P ) readonly
  9. br i1 false, label %Loop, label %Out
  10. Out: ; preds = %Loop
  11. ret i32 %A
  12. ; CHECK-LABEL: @test1(
  13. ; CHECK: Out:
  14. ; CHECK-NEXT: call i32 @strlen
  15. ; CHECK-NEXT: ret i32 %A
  16. }
  17. declare double @sin(double) readnone
  18. ; Sink readnone function out of loop with unknown memory behavior.
  19. define double @test2(double %X) {
  20. br label %Loop
  21. Loop: ; preds = %Loop, %0
  22. call void @foo( )
  23. %A = call double @sin( double %X ) readnone
  24. br i1 true, label %Loop, label %Out
  25. Out: ; preds = %Loop
  26. ret double %A
  27. ; CHECK-LABEL: @test2(
  28. ; CHECK: Out:
  29. ; CHECK-NEXT: call double @sin
  30. ; CHECK-NEXT: ret double %A
  31. }
  32. ; This testcase checks to make sure the sinker does not cause problems with
  33. ; critical edges.
  34. define void @test3() {
  35. Entry:
  36. br i1 false, label %Loop, label %Exit
  37. Loop:
  38. %X = add i32 0, 1
  39. br i1 false, label %Loop, label %Exit
  40. Exit:
  41. %Y = phi i32 [ 0, %Entry ], [ %X, %Loop ]
  42. ret void
  43. ; CHECK-LABEL: @test3(
  44. ; CHECK: Exit.loopexit:
  45. ; CHECK-NEXT: %X.le = add i32 0, 1
  46. ; CHECK-NEXT: br label %Exit
  47. }
  48. ; If the result of an instruction is only used outside of the loop, sink
  49. ; the instruction to the exit blocks instead of executing it on every
  50. ; iteration of the loop.
  51. ;
  52. define i32 @test4(i32 %N) {
  53. Entry:
  54. br label %Loop
  55. Loop: ; preds = %Loop, %Entry
  56. %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]
  57. %tmp.6 = mul i32 %N, %N_addr.0.pn ; <i32> [#uses=1]
  58. %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=1]
  59. %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1]
  60. %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1]
  61. br i1 %tmp.1, label %Loop, label %Out
  62. Out: ; preds = %Loop
  63. ret i32 %tmp.7
  64. ; CHECK-LABEL: @test4(
  65. ; CHECK: Out:
  66. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
  67. ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]]
  68. ; CHECK-NEXT: sub i32 %tmp.6.le, %N
  69. ; CHECK-NEXT: ret i32
  70. }
  71. ; To reduce register pressure, if a load is hoistable out of the loop, and the
  72. ; result of the load is only used outside of the loop, sink the load instead of
  73. ; hoisting it!
  74. ;
  75. @X = global i32 5 ; <i32*> [#uses=1]
  76. define i32 @test5(i32 %N) {
  77. Entry:
  78. br label %Loop
  79. Loop: ; preds = %Loop, %Entry
  80. %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]
  81. %tmp.6 = load i32, i32* @X ; <i32> [#uses=1]
  82. %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1]
  83. %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1]
  84. br i1 %tmp.1, label %Loop, label %Out
  85. Out: ; preds = %Loop
  86. ret i32 %tmp.6
  87. ; CHECK-LABEL: @test5(
  88. ; CHECK: Out:
  89. ; CHECK-NEXT: %tmp.6.le = load i32, i32* @X
  90. ; CHECK-NEXT: ret i32 %tmp.6.le
  91. }
  92. ; The loop sinker was running from the bottom of the loop to the top, causing
  93. ; it to miss opportunities to sink instructions that depended on sinking other
  94. ; instructions from the loop. Instead they got hoisted, which is better than
  95. ; leaving them in the loop, but increases register pressure pointlessly.
  96. %Ty = type { i32, i32 }
  97. @X2 = external global %Ty
  98. define i32 @test6() {
  99. br label %Loop
  100. Loop:
  101. %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
  102. %sunk2 = load i32, i32* %dead
  103. br i1 false, label %Loop, label %Out
  104. Out: ; preds = %Loop
  105. ret i32 %sunk2
  106. ; CHECK-LABEL: @test6(
  107. ; CHECK: Out:
  108. ; CHECK-NEXT: %dead.le = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
  109. ; CHECK-NEXT: %sunk2.le = load i32, i32* %dead.le
  110. ; CHECK-NEXT: ret i32 %sunk2.le
  111. }
  112. ; This testcase ensures that we can sink instructions from loops with
  113. ; multiple exits.
  114. ;
  115. define i32 @test7(i32 %N, i1 %C) {
  116. Entry:
  117. br label %Loop
  118. Loop: ; preds = %ContLoop, %Entry
  119. %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ]
  120. %tmp.6 = mul i32 %N, %N_addr.0.pn
  121. %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=2]
  122. %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1]
  123. br i1 %C, label %ContLoop, label %Out1
  124. ContLoop:
  125. %tmp.1 = icmp ne i32 %N_addr.0.pn, 1
  126. br i1 %tmp.1, label %Loop, label %Out2
  127. Out1: ; preds = %Loop
  128. ret i32 %tmp.7
  129. Out2: ; preds = %ContLoop
  130. ret i32 %tmp.7
  131. ; CHECK-LABEL: @test7(
  132. ; CHECK: Out1:
  133. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
  134. ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]]
  135. ; CHECK-NEXT: sub i32 %tmp.6.le, %N
  136. ; CHECK-NEXT: ret
  137. ; CHECK: Out2:
  138. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
  139. ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]]
  140. ; CHECK-NEXT: sub i32 %tmp.6.le4, %N
  141. ; CHECK-NEXT: ret
  142. }
  143. ; This testcase checks to make sure we can sink values which are only live on
  144. ; some exits out of the loop, and that we can do so without breaking dominator
  145. ; info.
  146. define i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) {
  147. Entry:
  148. br label %Loop
  149. Loop: ; preds = %Cont, %Entry
  150. br i1 %C1, label %Cont, label %exit1
  151. Cont: ; preds = %Loop
  152. %X = load i32, i32* %P ; <i32> [#uses=2]
  153. store i32 %X, i32* %Q
  154. %V = add i32 %X, 1 ; <i32> [#uses=1]
  155. br i1 %C2, label %Loop, label %exit2
  156. exit1: ; preds = %Loop
  157. ret i32 0
  158. exit2: ; preds = %Cont
  159. ret i32 %V
  160. ; CHECK-LABEL: @test8(
  161. ; CHECK: exit1:
  162. ; CHECK-NEXT: ret i32 0
  163. ; CHECK: exit2:
  164. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %X
  165. ; CHECK-NEXT: %V.le = add i32 %[[LCSSAPHI]], 1
  166. ; CHECK-NEXT: ret i32 %V.le
  167. }
  168. define void @test9() {
  169. loopentry.2.i:
  170. br i1 false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader
  171. no_exit.1.i.preheader: ; preds = %loopentry.2.i
  172. br label %no_exit.1.i
  173. no_exit.1.i: ; preds = %endif.8.i, %no_exit.1.i.preheader
  174. br i1 false, label %return.i, label %endif.8.i
  175. endif.8.i: ; preds = %no_exit.1.i
  176. %inc.1.i = add i32 0, 1 ; <i32> [#uses=1]
  177. br i1 false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit
  178. loopentry.3.i.preheader.loopexit: ; preds = %endif.8.i
  179. br label %loopentry.3.i.preheader
  180. loopentry.3.i.preheader: ; preds = %loopentry.3.i.preheader.loopexit, %loopentry.2.i
  181. %arg_num.0.i.ph13000 = phi i32 [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ] ; <i32> [#uses=0]
  182. ret void
  183. return.i: ; preds = %no_exit.1.i
  184. ret void
  185. ; CHECK-LABEL: @test9(
  186. ; CHECK: loopentry.3.i.preheader.loopexit:
  187. ; CHECK-NEXT: %inc.1.i.le = add i32 0, 1
  188. ; CHECK-NEXT: br label %loopentry.3.i.preheader
  189. }
  190. ; Potentially trapping instructions may be sunk as long as they are guaranteed
  191. ; to be executed.
  192. define i32 @test10(i32 %N) {
  193. Entry:
  194. br label %Loop
  195. Loop: ; preds = %Loop, %Entry
  196. %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] ; <i32> [#uses=3]
  197. %tmp.6 = sdiv i32 %N, %N_addr.0.pn ; <i32> [#uses=1]
  198. %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1]
  199. %tmp.1 = icmp ne i32 %N_addr.0.pn, 0 ; <i1> [#uses=1]
  200. br i1 %tmp.1, label %Loop, label %Out
  201. Out: ; preds = %Loop
  202. ret i32 %tmp.6
  203. ; CHECK-LABEL: @test10(
  204. ; CHECK: Out:
  205. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
  206. ; CHECK-NEXT: %tmp.6.le = sdiv i32 %N, %[[LCSSAPHI]]
  207. ; CHECK-NEXT: ret i32 %tmp.6.le
  208. }
  209. ; Should delete, not sink, dead instructions.
  210. define void @test11() {
  211. br label %Loop
  212. Loop:
  213. %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
  214. br i1 false, label %Loop, label %Out
  215. Out:
  216. ret void
  217. ; CHECK-LABEL: @test11(
  218. ; CHECK: Out:
  219. ; CHECK-NEXT: ret void
  220. }
  221. @c = common global [1 x i32] zeroinitializer, align 4
  222. ; Test a *many* way nested loop with multiple exit blocks both of which exit
  223. ; multiple loop nests. This exercises LCSSA corner cases.
  224. define i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) {
  225. entry:
  226. br label %l1.header
  227. l1.header:
  228. %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ]
  229. %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv
  230. br label %l2.header
  231. l2.header:
  232. %x0 = load i1, i1* %c, align 4
  233. br i1 %x0, label %l1.latch, label %l3.preheader
  234. l3.preheader:
  235. br label %l3.header
  236. l3.header:
  237. %x1 = load i1, i1* %d, align 4
  238. br i1 %x1, label %l2.latch, label %l4.preheader
  239. l4.preheader:
  240. br label %l4.header
  241. l4.header:
  242. %x2 = load i1, i1* %a
  243. br i1 %x2, label %l3.latch, label %l4.body
  244. l4.body:
  245. call void @f(i32* %arrayidx.i)
  246. %x3 = load i1, i1* %b
  247. %l = trunc i64 %iv to i32
  248. br i1 %x3, label %l4.latch, label %exit
  249. l4.latch:
  250. call void @g()
  251. %x4 = load i1, i1* %b, align 4
  252. br i1 %x4, label %l4.header, label %exit
  253. l3.latch:
  254. br label %l3.header
  255. l2.latch:
  256. br label %l2.header
  257. l1.latch:
  258. %iv.next = add nsw i64 %iv, 1
  259. br label %l1.header
  260. exit:
  261. %lcssa = phi i32 [ %l, %l4.latch ], [ %l, %l4.body ]
  262. ; CHECK-LABEL: @PR18753(
  263. ; CHECK: exit:
  264. ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i64 [ %iv, %l4.latch ], [ %iv, %l4.body ]
  265. ; CHECK-NEXT: %l.le = trunc i64 %[[LCSSAPHI]] to i32
  266. ; CHECK-NEXT: ret i32 %l.le
  267. ret i32 %lcssa
  268. }
  269. ; Can't sink stores out of exit blocks containing indirectbr instructions
  270. ; because loop simplify does not create dedicated exits for such blocks. Test
  271. ; that by sinking the store from lab21 to lab22, but not further.
  272. define void @test12() {
  273. ; CHECK-LABEL: @test12
  274. br label %lab4
  275. lab4:
  276. br label %lab20
  277. lab5:
  278. br label %lab20
  279. lab6:
  280. br label %lab4
  281. lab7:
  282. br i1 undef, label %lab8, label %lab13
  283. lab8:
  284. br i1 undef, label %lab13, label %lab10
  285. lab10:
  286. br label %lab7
  287. lab13:
  288. ret void
  289. lab20:
  290. br label %lab21
  291. lab21:
  292. ; CHECK: lab21:
  293. ; CHECK-NOT: store
  294. ; CHECK: br i1 false, label %lab21, label %lab22
  295. store i32 36127957, i32* undef, align 4
  296. br i1 undef, label %lab21, label %lab22
  297. lab22:
  298. ; CHECK: lab22:
  299. ; CHECK: store
  300. ; CHECK-NEXT: indirectbr i8* undef
  301. indirectbr i8* undef, [label %lab5, label %lab6, label %lab7]
  302. }
  303. ; Test that we don't crash when trying to sink stores and there's no preheader
  304. ; available (which is used for creating loads that may be used by the SSA
  305. ; updater)
  306. define void @test13() {
  307. ; CHECK-LABEL: @test13
  308. br label %lab59
  309. lab19:
  310. br i1 undef, label %lab20, label %lab38
  311. lab20:
  312. br label %lab60
  313. lab21:
  314. br i1 undef, label %lab22, label %lab38
  315. lab22:
  316. br label %lab38
  317. lab38:
  318. ret void
  319. lab59:
  320. indirectbr i8* undef, [label %lab60, label %lab38]
  321. lab60:
  322. ; CHECK: lab60:
  323. ; CHECK: store
  324. ; CHECK-NEXT: indirectbr
  325. store i32 2145244101, i32* undef, align 4
  326. indirectbr i8* undef, [label %lab21, label %lab19]
  327. }
  328. declare void @f(i32*)
  329. declare void @g()