basic.ll 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. ; RUN: opt -jump-threading -S < %s | FileCheck %s
  2. declare i32 @f1()
  3. declare i32 @f2()
  4. declare void @f3()
  5. define i32 @test1(i1 %cond) {
  6. ; CHECK-LABEL: @test1(
  7. br i1 %cond, label %T1, label %F1
  8. T1:
  9. %v1 = call i32 @f1()
  10. br label %Merge
  11. F1:
  12. %v2 = call i32 @f2()
  13. br label %Merge
  14. Merge:
  15. %A = phi i1 [true, %T1], [false, %F1]
  16. %B = phi i32 [%v1, %T1], [%v2, %F1]
  17. br i1 %A, label %T2, label %F2
  18. T2:
  19. ; CHECK: T2:
  20. ; CHECK: ret i32 %v1
  21. call void @f3()
  22. ret i32 %B
  23. F2:
  24. ; CHECK: F2:
  25. ; CHECK: ret i32 %v2
  26. ret i32 %B
  27. }
  28. ;; cond is known false on Entry -> F1 edge!
  29. define i32 @test2(i1 %cond) {
  30. ; CHECK-LABEL: @test2(
  31. Entry:
  32. br i1 %cond, label %T1, label %F1
  33. T1:
  34. ; CHECK: %v1 = call i32 @f1()
  35. ; CHECK: ret i32 47
  36. %v1 = call i32 @f1()
  37. br label %Merge
  38. F1:
  39. br i1 %cond, label %Merge, label %F2
  40. Merge:
  41. %B = phi i32 [47, %T1], [192, %F1]
  42. ret i32 %B
  43. F2:
  44. call void @f3()
  45. ret i32 12
  46. }
  47. ; Undef handling.
  48. define i32 @test3(i1 %cond) {
  49. ; CHECK-LABEL: @test3(
  50. ; CHECK-NEXT: T1:
  51. ; CHECK-NEXT: ret i32 42
  52. br i1 undef, label %T1, label %F1
  53. T1:
  54. ret i32 42
  55. F1:
  56. ret i32 17
  57. }
  58. define i32 @test4(i1 %cond, i1 %cond2) {
  59. ; CHECK-LABEL: @test4(
  60. br i1 %cond, label %T1, label %F1
  61. T1:
  62. ; CHECK: %v1 = call i32 @f1()
  63. ; CHECK-NEXT: br label %T
  64. %v1 = call i32 @f1()
  65. br label %Merge
  66. F1:
  67. %v2 = call i32 @f2()
  68. ; CHECK: %v2 = call i32 @f2()
  69. ; CHECK-NEXT: br i1 %cond2,
  70. br label %Merge
  71. Merge:
  72. %A = phi i1 [undef, %T1], [%cond2, %F1]
  73. %B = phi i32 [%v1, %T1], [%v2, %F1]
  74. br i1 %A, label %T2, label %F2
  75. T2:
  76. call void @f3()
  77. ret i32 %B
  78. F2:
  79. ret i32 %B
  80. }
  81. ;; This tests that the branch in 'merge' can be cloned up into T1.
  82. define i32 @test5(i1 %cond, i1 %cond2) {
  83. ; CHECK-LABEL: @test5(
  84. br i1 %cond, label %T1, label %F1
  85. T1:
  86. ; CHECK: T1:
  87. ; CHECK-NEXT: %v1 = call i32 @f1()
  88. ; CHECK-NEXT: %cond3 = icmp eq i32 %v1, 412
  89. ; CHECK-NEXT: br i1 %cond3, label %T2, label %F2
  90. %v1 = call i32 @f1()
  91. %cond3 = icmp eq i32 %v1, 412
  92. br label %Merge
  93. F1:
  94. %v2 = call i32 @f2()
  95. br label %Merge
  96. Merge:
  97. %A = phi i1 [%cond3, %T1], [%cond2, %F1]
  98. %B = phi i32 [%v1, %T1], [%v2, %F1]
  99. br i1 %A, label %T2, label %F2
  100. T2:
  101. call void @f3()
  102. ret i32 %B
  103. F2:
  104. ret i32 %B
  105. }
  106. ;; Lexically duplicated conditionals should be threaded.
  107. define i32 @test6(i32 %A) {
  108. ; CHECK-LABEL: @test6(
  109. %tmp455 = icmp eq i32 %A, 42
  110. br i1 %tmp455, label %BB1, label %BB2
  111. ; CHECK: call i32 @f2()
  112. ; CHECK-NEXT: ret i32 3
  113. ; CHECK: call i32 @f1()
  114. ; CHECK-NOT: br
  115. ; CHECK: call void @f3()
  116. ; CHECK-NOT: br
  117. ; CHECK: ret i32 4
  118. BB2:
  119. call i32 @f1()
  120. br label %BB1
  121. BB1:
  122. %tmp459 = icmp eq i32 %A, 42
  123. br i1 %tmp459, label %BB3, label %BB4
  124. BB3:
  125. call i32 @f2()
  126. ret i32 3
  127. BB4:
  128. call void @f3()
  129. ret i32 4
  130. }
  131. ;; This tests that the branch in 'merge' can be cloned up into T1.
  132. ;; rdar://7367025
  133. define i32 @test7(i1 %cond, i1 %cond2) {
  134. Entry:
  135. ; CHECK-LABEL: @test7(
  136. %v1 = call i32 @f1()
  137. br i1 %cond, label %Merge, label %F1
  138. F1:
  139. %v2 = call i32 @f2()
  140. br label %Merge
  141. Merge:
  142. %B = phi i32 [%v1, %Entry], [%v2, %F1]
  143. %M = icmp ne i32 %B, %v1
  144. %N = icmp eq i32 %B, 47
  145. %O = and i1 %M, %N
  146. br i1 %O, label %T2, label %F2
  147. ; CHECK: Merge:
  148. ; CHECK-NOT: phi
  149. ; CHECK-NEXT: %v2 = call i32 @f2()
  150. T2:
  151. call void @f3()
  152. ret i32 %B
  153. F2:
  154. ret i32 %B
  155. ; CHECK: F2:
  156. ; CHECK-NEXT: phi i32
  157. }
  158. declare i1 @test8a()
  159. define i32 @test8b(i1 %cond, i1 %cond2) {
  160. ; CHECK-LABEL: @test8b(
  161. T0:
  162. %A = call i1 @test8a()
  163. br i1 %A, label %T1, label %F1
  164. ; CHECK: T0:
  165. ; CHECK-NEXT: call
  166. ; CHECK-NEXT: br i1 %A, label %T1, label %Y
  167. T1:
  168. %B = call i1 @test8a()
  169. br i1 %B, label %T2, label %F1
  170. ; CHECK: T1:
  171. ; CHECK-NEXT: call
  172. ; CHECK-NEXT: br i1 %B, label %T2, label %Y
  173. T2:
  174. %C = call i1 @test8a()
  175. br i1 %cond, label %T3, label %F1
  176. ; CHECK: T2:
  177. ; CHECK-NEXT: call
  178. ; CHECK-NEXT: br i1 %cond, label %T3, label %Y
  179. T3:
  180. ret i32 0
  181. F1:
  182. %D = phi i32 [0, %T0], [0, %T1], [1, %T2]
  183. %E = icmp eq i32 %D, 1
  184. %F = and i1 %E, %cond
  185. br i1 %F, label %X, label %Y
  186. X:
  187. call i1 @test8a()
  188. ret i32 1
  189. Y:
  190. ret i32 2
  191. }
  192. ;;; Verify that we can handle constraint propagation through "xor x, 1".
  193. define i32 @test9(i1 %cond, i1 %cond2) {
  194. Entry:
  195. ; CHECK-LABEL: @test9(
  196. %v1 = call i32 @f1()
  197. br i1 %cond, label %Merge, label %F1
  198. ; CHECK: Entry:
  199. ; CHECK-NEXT: %v1 = call i32 @f1()
  200. ; CHECK-NEXT: br i1 %cond, label %F2, label %Merge
  201. F1:
  202. %v2 = call i32 @f2()
  203. br label %Merge
  204. Merge:
  205. %B = phi i32 [%v1, %Entry], [%v2, %F1]
  206. %M = icmp eq i32 %B, %v1
  207. %M1 = xor i1 %M, 1
  208. %N = icmp eq i32 %B, 47
  209. %O = and i1 %M1, %N
  210. br i1 %O, label %T2, label %F2
  211. ; CHECK: Merge:
  212. ; CHECK-NOT: phi
  213. ; CHECK-NEXT: %v2 = call i32 @f2()
  214. T2:
  215. %Q = zext i1 %M to i32
  216. ret i32 %Q
  217. F2:
  218. ret i32 %B
  219. ; CHECK: F2:
  220. ; CHECK-NEXT: phi i32
  221. }
  222. ; CHECK: @test10
  223. declare i32 @test10f1()
  224. declare i32 @test10f2()
  225. declare void @test10f3()
  226. ;; Non-local condition threading.
  227. define i32 @test10g(i1 %cond) {
  228. ; CHECK-LABEL: @test10g(
  229. ; CHECK-NEXT: br i1 %cond, label %T2, label %F2
  230. br i1 %cond, label %T1, label %F1
  231. T1:
  232. %v1 = call i32 @test10f1()
  233. br label %Merge
  234. ; CHECK: %v1 = call i32 @test10f1()
  235. ; CHECK-NEXT: call void @f3()
  236. ; CHECK-NEXT: ret i32 %v1
  237. F1:
  238. %v2 = call i32 @test10f2()
  239. br label %Merge
  240. Merge:
  241. %B = phi i32 [%v1, %T1], [%v2, %F1]
  242. br i1 %cond, label %T2, label %F2
  243. T2:
  244. call void @f3()
  245. ret i32 %B
  246. F2:
  247. ret i32 %B
  248. }
  249. ; Impossible conditional constraints should get threaded. BB3 is dead here.
  250. define i32 @test11(i32 %A) {
  251. ; CHECK-LABEL: @test11(
  252. ; CHECK-NEXT: icmp
  253. ; CHECK-NEXT: br i1 %tmp455, label %BB4, label %BB2
  254. %tmp455 = icmp eq i32 %A, 42
  255. br i1 %tmp455, label %BB1, label %BB2
  256. BB2:
  257. ; CHECK: call i32 @f1()
  258. ; CHECK-NEXT: ret i32 %C
  259. %C = call i32 @f1()
  260. ret i32 %C
  261. BB1:
  262. %tmp459 = icmp eq i32 %A, 43
  263. br i1 %tmp459, label %BB3, label %BB4
  264. BB3:
  265. call i32 @f2()
  266. ret i32 3
  267. BB4:
  268. call void @f3()
  269. ret i32 4
  270. }
  271. ;; Correlated value through boolean expression. GCC PR18046.
  272. define void @test12(i32 %A) {
  273. ; CHECK-LABEL: @test12(
  274. entry:
  275. %cond = icmp eq i32 %A, 0
  276. br i1 %cond, label %bb, label %bb1
  277. ; Should branch to the return block instead of through BB1.
  278. ; CHECK: entry:
  279. ; CHECK-NEXT: %cond = icmp eq i32 %A, 0
  280. ; CHECK-NEXT: br i1 %cond, label %bb1, label %return
  281. bb:
  282. %B = call i32 @test10f2()
  283. br label %bb1
  284. bb1:
  285. %C = phi i32 [ %A, %entry ], [ %B, %bb ]
  286. %cond4 = icmp eq i32 %C, 0
  287. br i1 %cond4, label %bb2, label %return
  288. ; CHECK: bb1:
  289. ; CHECK-NEXT: %B = call i32 @test10f2()
  290. ; CHECK-NEXT: %cond4 = icmp eq i32 %B, 0
  291. ; CHECK-NEXT: br i1 %cond4, label %bb2, label %return
  292. bb2:
  293. %D = call i32 @test10f2()
  294. ret void
  295. return:
  296. ret void
  297. }
  298. ;; Duplicate condition to avoid xor of cond.
  299. ;; rdar://7391699
  300. define i32 @test13(i1 %cond, i1 %cond2) {
  301. Entry:
  302. ; CHECK-LABEL: @test13(
  303. %v1 = call i32 @f1()
  304. br i1 %cond, label %Merge, label %F1
  305. F1:
  306. br label %Merge
  307. Merge:
  308. %B = phi i1 [true, %Entry], [%cond2, %F1]
  309. %C = phi i32 [192, %Entry], [%v1, %F1]
  310. %M = icmp eq i32 %C, 192
  311. %N = xor i1 %B, %M
  312. br i1 %N, label %T2, label %F2
  313. T2:
  314. ret i32 123
  315. F2:
  316. ret i32 %v1
  317. ; CHECK: br i1 %cond, label %F2, label %Merge
  318. ; CHECK: Merge:
  319. ; CHECK-NEXT: %M = icmp eq i32 %v1, 192
  320. ; CHECK-NEXT: %N = xor i1 %cond2, %M
  321. ; CHECK-NEXT: br i1 %N, label %T2, label %F2
  322. }
  323. ; CHECK-LABEL: @test14(
  324. define i32 @test14(i32 %in) {
  325. entry:
  326. %A = icmp eq i32 %in, 0
  327. ; CHECK: br i1 %A, label %right_ret, label %merge
  328. br i1 %A, label %left, label %right
  329. ; CHECK-NOT: left:
  330. left:
  331. br label %merge
  332. ; CHECK-NOT: right:
  333. right:
  334. %B = call i32 @f1()
  335. br label %merge
  336. merge:
  337. ; CHECK-NOT: %C = phi i32 [%in, %left], [%B, %right]
  338. %C = phi i32 [%in, %left], [%B, %right]
  339. %D = add i32 %C, 1
  340. %E = icmp eq i32 %D, 2
  341. br i1 %E, label %left_ret, label %right_ret
  342. ; CHECK: left_ret:
  343. left_ret:
  344. ret i32 0
  345. right_ret:
  346. ret i32 1
  347. }
  348. ; PR5652
  349. ; CHECK-LABEL: @test15(
  350. define i32 @test15(i32 %len) {
  351. entry:
  352. ; CHECK: icmp ult i32 %len, 13
  353. %tmp = icmp ult i32 %len, 13
  354. br i1 %tmp, label %check, label %exit0
  355. exit0:
  356. ret i32 0
  357. check:
  358. %tmp9 = icmp ult i32 %len, 21
  359. br i1 %tmp9, label %exit1, label %exit2
  360. exit2:
  361. ; CHECK-NOT: ret i32 2
  362. ret i32 2
  363. exit1:
  364. ret i32 1
  365. ; CHECK: }
  366. }
  367. ; In this test we check that block duplication is inhibited by the presence
  368. ; of a function with the 'noduplicate' attribute.
  369. declare void @g()
  370. declare void @j()
  371. declare void @k()
  372. ; CHECK: define void @h(i32 %p) {
  373. define void @h(i32 %p) {
  374. %x = icmp ult i32 %p, 5
  375. br i1 %x, label %l1, label %l2
  376. l1:
  377. call void @j()
  378. br label %l3
  379. l2:
  380. call void @k()
  381. br label %l3
  382. l3:
  383. ; CHECK: call void @g() [[NOD:#[0-9]+]]
  384. ; CHECK-NOT: call void @g() [[NOD]]
  385. call void @g() noduplicate
  386. %y = icmp ult i32 %p, 5
  387. br i1 %y, label %l4, label %l5
  388. l4:
  389. call void @j()
  390. ret void
  391. l5:
  392. call void @k()
  393. ret void
  394. ; CHECK: }
  395. }
  396. ; CHECK: attributes [[NOD]] = { noduplicate }