trip-count9.ll 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. ; RUN: opt -analyze -scalar-evolution -S < %s | FileCheck %s
  2. ; Every combination of
  3. ; - starting at 0, 1, or %x
  4. ; - steping by 1 or 2
  5. ; - stopping at %n or %n*2
  6. ; - using nsw, or not
  7. ; Some of these represent missed opportunities.
  8. ; CHECK: Determining loop execution counts for: @foo
  9. ; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
  10. ; CHECK: Loop %loop: max backedge-taken count is 6
  11. define void @foo(i4 %n) {
  12. entry:
  13. %s = icmp sgt i4 %n, 0
  14. br i1 %s, label %loop, label %exit
  15. loop:
  16. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  17. %i.next = add i4 %i, 1
  18. %t = icmp slt i4 %i.next, %n
  19. br i1 %t, label %loop, label %exit
  20. exit:
  21. ret void
  22. }
  23. ; CHECK: Determining loop execution counts for: @step2
  24. ; CHECK: Loop %loop: Unpredictable backedge-taken count.
  25. ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
  26. define void @step2(i4 %n) {
  27. entry:
  28. %s = icmp sgt i4 %n, 0
  29. br i1 %s, label %loop, label %exit
  30. loop:
  31. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  32. %i.next = add i4 %i, 2
  33. %t = icmp slt i4 %i.next, %n
  34. br i1 %t, label %loop, label %exit
  35. exit:
  36. ret void
  37. }
  38. ; CHECK: Determining loop execution counts for: @start1
  39. ; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
  40. ; CHECK: Loop %loop: max backedge-taken count is 5
  41. define void @start1(i4 %n) {
  42. entry:
  43. %s = icmp sgt i4 %n, 0
  44. br i1 %s, label %loop, label %exit
  45. loop:
  46. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  47. %i.next = add i4 %i, 1
  48. %t = icmp slt i4 %i.next, %n
  49. br i1 %t, label %loop, label %exit
  50. exit:
  51. ret void
  52. }
  53. ; CHECK: Determining loop execution counts for: @start1_step2
  54. ; CHECK: Loop %loop: Unpredictable backedge-taken count.
  55. ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
  56. define void @start1_step2(i4 %n) {
  57. entry:
  58. %s = icmp sgt i4 %n, 0
  59. br i1 %s, label %loop, label %exit
  60. loop:
  61. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  62. %i.next = add i4 %i, 2
  63. %t = icmp slt i4 %i.next, %n
  64. br i1 %t, label %loop, label %exit
  65. exit:
  66. ret void
  67. }
  68. ; CHECK: Determining loop execution counts for: @startx
  69. ; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
  70. ; CHECK: Loop %loop: max backedge-taken count is -1
  71. define void @startx(i4 %n, i4 %x) {
  72. entry:
  73. %s = icmp sgt i4 %n, 0
  74. br i1 %s, label %loop, label %exit
  75. loop:
  76. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  77. %i.next = add i4 %i, 1
  78. %t = icmp slt i4 %i.next, %n
  79. br i1 %t, label %loop, label %exit
  80. exit:
  81. ret void
  82. }
  83. ; CHECK: Determining loop execution counts for: @startx_step2
  84. ; CHECK: Loop %loop: Unpredictable backedge-taken count.
  85. ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
  86. define void @startx_step2(i4 %n, i4 %x) {
  87. entry:
  88. %s = icmp sgt i4 %n, 0
  89. br i1 %s, label %loop, label %exit
  90. loop:
  91. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  92. %i.next = add i4 %i, 2
  93. %t = icmp slt i4 %i.next, %n
  94. br i1 %t, label %loop, label %exit
  95. exit:
  96. ret void
  97. }
  98. ; CHECK: Determining loop execution counts for: @nsw
  99. ; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
  100. ; CHECK: Loop %loop: max backedge-taken count is 6
  101. define void @nsw(i4 %n) {
  102. entry:
  103. %s = icmp sgt i4 %n, 0
  104. br i1 %s, label %loop, label %exit
  105. loop:
  106. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  107. %i.next = add nsw i4 %i, 1
  108. %t = icmp slt i4 %i.next, %n
  109. br i1 %t, label %loop, label %exit
  110. exit:
  111. ret void
  112. }
  113. ; If %n is INT4_MAX, %i.next will wrap. The nsw bit says that the
  114. ; result is undefined. Therefore, after the loop's second iteration,
  115. ; we are free to assume that the loop exits. This is valid because:
  116. ; (a) %i.next is a poison value after the second iteration, which can
  117. ; also be considered an undef value.
  118. ; (b) the return instruction enacts a side effect that is control
  119. ; dependent on the poison value.
  120. ;
  121. ; CHECK-LABEL: nsw_step2
  122. ; CHECK: Determining loop execution counts for: @nsw_step2
  123. ; CHECK: Loop %loop: backedge-taken count is ((-1 + %n) /u 2)
  124. ; CHECK: Loop %loop: max backedge-taken count is 2
  125. define void @nsw_step2(i4 %n) {
  126. entry:
  127. %s = icmp sgt i4 %n, 0
  128. br i1 %s, label %loop, label %exit
  129. loop:
  130. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  131. %i.next = add nsw i4 %i, 2
  132. %t = icmp slt i4 %i.next, %n
  133. br i1 %t, label %loop, label %exit
  134. exit:
  135. ret void
  136. }
  137. ; CHECK-LABEL: nsw_start1
  138. ; CHECK: Determining loop execution counts for: @nsw_start1
  139. ; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
  140. ; CHECK: Loop %loop: max backedge-taken count is 5
  141. define void @nsw_start1(i4 %n) {
  142. entry:
  143. %s = icmp sgt i4 %n, 0
  144. br i1 %s, label %loop, label %exit
  145. loop:
  146. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  147. %i.next = add nsw i4 %i, 1
  148. %t = icmp slt i4 %i.next, %n
  149. br i1 %t, label %loop, label %exit
  150. exit:
  151. ret void
  152. }
  153. ; CHECK: Determining loop execution counts for: @nsw_start1_step2
  154. ; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax %n)) /u 2)
  155. ; CHECK: Loop %loop: max backedge-taken count is 2
  156. define void @nsw_start1_step2(i4 %n) {
  157. entry:
  158. %s = icmp sgt i4 %n, 0
  159. br i1 %s, label %loop, label %exit
  160. loop:
  161. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  162. %i.next = add nsw i4 %i, 2
  163. %t = icmp slt i4 %i.next, %n
  164. br i1 %t, label %loop, label %exit
  165. exit:
  166. ret void
  167. }
  168. ; CHECK: Determining loop execution counts for: @nsw_startx
  169. ; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
  170. ; CHECK: Loop %loop: max backedge-taken count is -1
  171. define void @nsw_startx(i4 %n, i4 %x) {
  172. entry:
  173. %s = icmp sgt i4 %n, 0
  174. br i1 %s, label %loop, label %exit
  175. loop:
  176. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  177. %i.next = add nsw i4 %i, 1
  178. %t = icmp slt i4 %i.next, %n
  179. br i1 %t, label %loop, label %exit
  180. exit:
  181. ret void
  182. }
  183. ; CHECK: Determining loop execution counts for: @nsw_startx_step2
  184. ; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax %n)) /u 2)
  185. ; CHECK: Loop %loop: max backedge-taken count is 7
  186. define void @nsw_startx_step2(i4 %n, i4 %x) {
  187. entry:
  188. %s = icmp sgt i4 %n, 0
  189. br i1 %s, label %loop, label %exit
  190. loop:
  191. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  192. %i.next = add nsw i4 %i, 2
  193. %t = icmp slt i4 %i.next, %n
  194. br i1 %t, label %loop, label %exit
  195. exit:
  196. ret void
  197. }
  198. ; CHECK: Determining loop execution counts for: @even
  199. ; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
  200. ; CHECK: Loop %loop: max backedge-taken count is 5
  201. define void @even(i4 %n) {
  202. entry:
  203. %m = shl i4 %n, 1
  204. %s = icmp sgt i4 %m, 0
  205. br i1 %s, label %loop, label %exit
  206. loop:
  207. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  208. %i.next = add i4 %i, 1
  209. %t = icmp slt i4 %i.next, %m
  210. br i1 %t, label %loop, label %exit
  211. exit:
  212. ret void
  213. }
  214. ; CHECK: Determining loop execution counts for: @even_step2
  215. ; CHECK: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
  216. ; CHECK: Loop %loop: max backedge-taken count is 2
  217. define void @even_step2(i4 %n) {
  218. entry:
  219. %m = shl i4 %n, 1
  220. %s = icmp sgt i4 %m, 0
  221. br i1 %s, label %loop, label %exit
  222. loop:
  223. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  224. %i.next = add i4 %i, 2
  225. %t = icmp slt i4 %i.next, %m
  226. br i1 %t, label %loop, label %exit
  227. exit:
  228. ret void
  229. }
  230. ; CHECK: Determining loop execution counts for: @even_start1
  231. ; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
  232. ; CHECK: Loop %loop: max backedge-taken count is 4
  233. define void @even_start1(i4 %n) {
  234. entry:
  235. %m = shl i4 %n, 1
  236. %s = icmp sgt i4 %m, 0
  237. br i1 %s, label %loop, label %exit
  238. loop:
  239. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  240. %i.next = add i4 %i, 1
  241. %t = icmp slt i4 %i.next, %m
  242. br i1 %t, label %loop, label %exit
  243. exit:
  244. ret void
  245. }
  246. ; CHECK: Determining loop execution counts for: @even_start1_step2
  247. ; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax (2 * %n))) /u 2)
  248. ; CHECK: Loop %loop: max backedge-taken count is 2
  249. define void @even_start1_step2(i4 %n) {
  250. entry:
  251. %m = shl i4 %n, 1
  252. %s = icmp sgt i4 %m, 0
  253. br i1 %s, label %loop, label %exit
  254. loop:
  255. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  256. %i.next = add i4 %i, 2
  257. %t = icmp slt i4 %i.next, %m
  258. br i1 %t, label %loop, label %exit
  259. exit:
  260. ret void
  261. }
  262. ; CHECK: Determining loop execution counts for: @even_startx
  263. ; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
  264. ; CHECK: Loop %loop: max backedge-taken count is -2
  265. define void @even_startx(i4 %n, i4 %x) {
  266. entry:
  267. %m = shl i4 %n, 1
  268. %s = icmp sgt i4 %m, 0
  269. br i1 %s, label %loop, label %exit
  270. loop:
  271. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  272. %i.next = add i4 %i, 1
  273. %t = icmp slt i4 %i.next, %m
  274. br i1 %t, label %loop, label %exit
  275. exit:
  276. ret void
  277. }
  278. ; CHECK: Determining loop execution counts for: @even_startx_step2
  279. ; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
  280. ; CHECK: Loop %loop: max backedge-taken count is 7
  281. define void @even_startx_step2(i4 %n, i4 %x) {
  282. entry:
  283. %m = shl i4 %n, 1
  284. %s = icmp sgt i4 %m, 0
  285. br i1 %s, label %loop, label %exit
  286. loop:
  287. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  288. %i.next = add i4 %i, 2
  289. %t = icmp slt i4 %i.next, %m
  290. br i1 %t, label %loop, label %exit
  291. exit:
  292. ret void
  293. }
  294. ; CHECK: Determining loop execution counts for: @even_nsw
  295. ; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
  296. ; CHECK: Loop %loop: max backedge-taken count is 5
  297. define void @even_nsw(i4 %n) {
  298. entry:
  299. %m = shl i4 %n, 1
  300. %s = icmp sgt i4 %m, 0
  301. br i1 %s, label %loop, label %exit
  302. loop:
  303. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  304. %i.next = add nsw i4 %i, 1
  305. %t = icmp slt i4 %i.next, %m
  306. br i1 %t, label %loop, label %exit
  307. exit:
  308. ret void
  309. }
  310. ; CHECK: Determining loop execution counts for: @even_nsw_step2
  311. ; CHECK: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
  312. ; CHECK: Loop %loop: max backedge-taken count is 2
  313. define void @even_nsw_step2(i4 %n) {
  314. entry:
  315. %m = shl i4 %n, 1
  316. %s = icmp sgt i4 %m, 0
  317. br i1 %s, label %loop, label %exit
  318. loop:
  319. %i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
  320. %i.next = add nsw i4 %i, 2
  321. %t = icmp slt i4 %i.next, %m
  322. br i1 %t, label %loop, label %exit
  323. exit:
  324. ret void
  325. }
  326. ; CHECK: Determining loop execution counts for: @even_nsw_start1
  327. ; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
  328. ; CHECK: Loop %loop: max backedge-taken count is 4
  329. define void @even_nsw_start1(i4 %n) {
  330. entry:
  331. %m = shl i4 %n, 1
  332. %s = icmp sgt i4 %m, 0
  333. br i1 %s, label %loop, label %exit
  334. loop:
  335. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  336. %i.next = add nsw i4 %i, 1
  337. %t = icmp slt i4 %i.next, %m
  338. br i1 %t, label %loop, label %exit
  339. exit:
  340. ret void
  341. }
  342. ; CHECK: Determining loop execution counts for: @even_nsw_start1_step2
  343. ; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax (2 * %n))) /u 2)
  344. ; CHECK: Loop %loop: max backedge-taken count is 2
  345. define void @even_nsw_start1_step2(i4 %n) {
  346. entry:
  347. %m = shl i4 %n, 1
  348. %s = icmp sgt i4 %m, 0
  349. br i1 %s, label %loop, label %exit
  350. loop:
  351. %i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
  352. %i.next = add nsw i4 %i, 2
  353. %t = icmp slt i4 %i.next, %m
  354. br i1 %t, label %loop, label %exit
  355. exit:
  356. ret void
  357. }
  358. ; CHECK: Determining loop execution counts for: @even_nsw_startx
  359. ; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
  360. ; CHECK: Loop %loop: max backedge-taken count is -2
  361. define void @even_nsw_startx(i4 %n, i4 %x) {
  362. entry:
  363. %m = shl i4 %n, 1
  364. %s = icmp sgt i4 %m, 0
  365. br i1 %s, label %loop, label %exit
  366. loop:
  367. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  368. %i.next = add nsw i4 %i, 1
  369. %t = icmp slt i4 %i.next, %m
  370. br i1 %t, label %loop, label %exit
  371. exit:
  372. ret void
  373. }
  374. ; CHECK: Determining loop execution counts for: @even_nsw_startx_step2
  375. ; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
  376. ; CHECK: Loop %loop: max backedge-taken count is 7
  377. define void @even_nsw_startx_step2(i4 %n, i4 %x) {
  378. entry:
  379. %m = shl i4 %n, 1
  380. %s = icmp sgt i4 %m, 0
  381. br i1 %s, label %loop, label %exit
  382. loop:
  383. %i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
  384. %i.next = add nsw i4 %i, 2
  385. %t = icmp slt i4 %i.next, %m
  386. br i1 %t, label %loop, label %exit
  387. exit:
  388. ret void
  389. }