condprop.ll 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. ; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
  2. @a = external global i32 ; <i32*> [#uses=7]
  3. ; CHECK-LABEL: @test1(
  4. define i32 @test1() nounwind {
  5. entry:
  6. %0 = load i32, i32* @a, align 4
  7. %1 = icmp eq i32 %0, 4
  8. br i1 %1, label %bb, label %bb1
  9. bb: ; preds = %entry
  10. br label %bb8
  11. bb1: ; preds = %entry
  12. %2 = load i32, i32* @a, align 4
  13. %3 = icmp eq i32 %2, 5
  14. br i1 %3, label %bb2, label %bb3
  15. bb2: ; preds = %bb1
  16. br label %bb8
  17. bb3: ; preds = %bb1
  18. %4 = load i32, i32* @a, align 4
  19. %5 = icmp eq i32 %4, 4
  20. ; CHECK: br i1 false, label %bb4, label %bb5
  21. br i1 %5, label %bb4, label %bb5
  22. bb4: ; preds = %bb3
  23. %6 = load i32, i32* @a, align 4
  24. %7 = add i32 %6, 5
  25. br label %bb8
  26. bb5: ; preds = %bb3
  27. %8 = load i32, i32* @a, align 4
  28. %9 = icmp eq i32 %8, 5
  29. ; CHECK: br i1 false, label %bb6, label %bb7
  30. br i1 %9, label %bb6, label %bb7
  31. bb6: ; preds = %bb5
  32. %10 = load i32, i32* @a, align 4
  33. %11 = add i32 %10, 4
  34. br label %bb8
  35. bb7: ; preds = %bb5
  36. %12 = load i32, i32* @a, align 4
  37. br label %bb8
  38. bb8: ; preds = %bb7, %bb6, %bb4, %bb2, %bb
  39. %.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
  40. br label %return
  41. return: ; preds = %bb8
  42. ret i32 %.0
  43. }
  44. declare void @foo(i1)
  45. declare void @bar(i32)
  46. ; CHECK-LABEL: @test3(
  47. define void @test3(i32 %x, i32 %y) {
  48. %xz = icmp eq i32 %x, 0
  49. %yz = icmp eq i32 %y, 0
  50. %z = and i1 %xz, %yz
  51. br i1 %z, label %both_zero, label %nope
  52. both_zero:
  53. call void @foo(i1 %xz)
  54. ; CHECK: call void @foo(i1 true)
  55. call void @foo(i1 %yz)
  56. ; CHECK: call void @foo(i1 true)
  57. call void @bar(i32 %x)
  58. ; CHECK: call void @bar(i32 0)
  59. call void @bar(i32 %y)
  60. ; CHECK: call void @bar(i32 0)
  61. ret void
  62. nope:
  63. call void @foo(i1 %z)
  64. ; CHECK: call void @foo(i1 false)
  65. ret void
  66. }
  67. ; CHECK-LABEL: @test4(
  68. define void @test4(i1 %b, i32 %x) {
  69. br i1 %b, label %sw, label %case3
  70. sw:
  71. switch i32 %x, label %default [
  72. i32 0, label %case0
  73. i32 1, label %case1
  74. i32 2, label %case0
  75. i32 3, label %case3
  76. i32 4, label %default
  77. ]
  78. default:
  79. ; CHECK: default:
  80. call void @bar(i32 %x)
  81. ; CHECK: call void @bar(i32 %x)
  82. ret void
  83. case0:
  84. ; CHECK: case0:
  85. call void @bar(i32 %x)
  86. ; CHECK: call void @bar(i32 %x)
  87. ret void
  88. case1:
  89. ; CHECK: case1:
  90. call void @bar(i32 %x)
  91. ; CHECK: call void @bar(i32 1)
  92. ret void
  93. case3:
  94. ; CHECK: case3:
  95. call void @bar(i32 %x)
  96. ; CHECK: call void @bar(i32 %x)
  97. ret void
  98. }
  99. ; CHECK-LABEL: @test5(
  100. define i1 @test5(i32 %x, i32 %y) {
  101. %cmp = icmp eq i32 %x, %y
  102. br i1 %cmp, label %same, label %different
  103. same:
  104. %cmp2 = icmp ne i32 %x, %y
  105. ; CHECK: ret i1 false
  106. ret i1 %cmp2
  107. different:
  108. %cmp3 = icmp eq i32 %x, %y
  109. ; CHECK: ret i1 false
  110. ret i1 %cmp3
  111. }
  112. ; CHECK-LABEL: @test6(
  113. define i1 @test6(i32 %x, i32 %y) {
  114. %cmp2 = icmp ne i32 %x, %y
  115. %cmp = icmp eq i32 %x, %y
  116. %cmp3 = icmp eq i32 %x, %y
  117. br i1 %cmp, label %same, label %different
  118. same:
  119. ; CHECK: ret i1 false
  120. ret i1 %cmp2
  121. different:
  122. ; CHECK: ret i1 false
  123. ret i1 %cmp3
  124. }
  125. ; CHECK-LABEL: @test6_fp(
  126. define i1 @test6_fp(float %x, float %y) {
  127. %cmp2 = fcmp une float %x, %y
  128. %cmp = fcmp oeq float %x, %y
  129. %cmp3 = fcmp oeq float %x, %y
  130. br i1 %cmp, label %same, label %different
  131. same:
  132. ; CHECK: ret i1 false
  133. ret i1 %cmp2
  134. different:
  135. ; CHECK: ret i1 false
  136. ret i1 %cmp3
  137. }
  138. ; CHECK-LABEL: @test7(
  139. define i1 @test7(i32 %x, i32 %y) {
  140. %cmp = icmp sgt i32 %x, %y
  141. br i1 %cmp, label %same, label %different
  142. same:
  143. %cmp2 = icmp sle i32 %x, %y
  144. ; CHECK: ret i1 false
  145. ret i1 %cmp2
  146. different:
  147. %cmp3 = icmp sgt i32 %x, %y
  148. ; CHECK: ret i1 false
  149. ret i1 %cmp3
  150. }
  151. ; CHECK-LABEL: @test7_fp(
  152. define i1 @test7_fp(float %x, float %y) {
  153. %cmp = fcmp ogt float %x, %y
  154. br i1 %cmp, label %same, label %different
  155. same:
  156. %cmp2 = fcmp ule float %x, %y
  157. ; CHECK: ret i1 false
  158. ret i1 %cmp2
  159. different:
  160. %cmp3 = fcmp ogt float %x, %y
  161. ; CHECK: ret i1 false
  162. ret i1 %cmp3
  163. }
  164. ; CHECK-LABEL: @test8(
  165. define i1 @test8(i32 %x, i32 %y) {
  166. %cmp2 = icmp sle i32 %x, %y
  167. %cmp = icmp sgt i32 %x, %y
  168. %cmp3 = icmp sgt i32 %x, %y
  169. br i1 %cmp, label %same, label %different
  170. same:
  171. ; CHECK: ret i1 false
  172. ret i1 %cmp2
  173. different:
  174. ; CHECK: ret i1 false
  175. ret i1 %cmp3
  176. }
  177. ; CHECK-LABEL: @test8_fp(
  178. define i1 @test8_fp(float %x, float %y) {
  179. %cmp2 = fcmp ule float %x, %y
  180. %cmp = fcmp ogt float %x, %y
  181. %cmp3 = fcmp ogt float %x, %y
  182. br i1 %cmp, label %same, label %different
  183. same:
  184. ; CHECK: ret i1 false
  185. ret i1 %cmp2
  186. different:
  187. ; CHECK: ret i1 false
  188. ret i1 %cmp3
  189. }
  190. ; PR1768
  191. ; CHECK-LABEL: @test9(
  192. define i32 @test9(i32 %i, i32 %j) {
  193. %cmp = icmp eq i32 %i, %j
  194. br i1 %cmp, label %cond_true, label %ret
  195. cond_true:
  196. %diff = sub i32 %i, %j
  197. ret i32 %diff
  198. ; CHECK: ret i32 0
  199. ret:
  200. ret i32 5
  201. ; CHECK: ret i32 5
  202. }
  203. ; PR1768
  204. ; CHECK-LABEL: @test10(
  205. define i32 @test10(i32 %j, i32 %i) {
  206. %cmp = icmp eq i32 %i, %j
  207. br i1 %cmp, label %cond_true, label %ret
  208. cond_true:
  209. %diff = sub i32 %i, %j
  210. ret i32 %diff
  211. ; CHECK: ret i32 0
  212. ret:
  213. ret i32 5
  214. ; CHECK: ret i32 5
  215. }
  216. declare i32 @yogibar()
  217. ; CHECK-LABEL: @test11(
  218. define i32 @test11(i32 %x) {
  219. %v0 = call i32 @yogibar()
  220. %v1 = call i32 @yogibar()
  221. %cmp = icmp eq i32 %v0, %v1
  222. br i1 %cmp, label %cond_true, label %next
  223. cond_true:
  224. ret i32 %v1
  225. ; CHECK: ret i32 %v0
  226. next:
  227. %cmp2 = icmp eq i32 %x, %v0
  228. br i1 %cmp2, label %cond_true2, label %next2
  229. cond_true2:
  230. ret i32 %v0
  231. ; CHECK: ret i32 %x
  232. next2:
  233. ret i32 0
  234. }
  235. ; CHECK-LABEL: @test12(
  236. define i32 @test12(i32 %x) {
  237. %cmp = icmp eq i32 %x, 0
  238. br i1 %cmp, label %cond_true, label %cond_false
  239. cond_true:
  240. br label %ret
  241. cond_false:
  242. br label %ret
  243. ret:
  244. %res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]
  245. ; CHECK: %res = phi i32 [ 0, %cond_true ], [ %x, %cond_false ]
  246. ret i32 %res
  247. }