ipsccp-basic.ll 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. ; RUN: opt < %s -ipsccp -S | FileCheck %s
  2. ;;======================== test1
  3. define internal i32 @test1a(i32 %A) {
  4. %X = add i32 1, 2
  5. ret i32 %A
  6. }
  7. ; CHECK-LABEL: define internal i32 @test1a(
  8. ; CHECK: ret i32 undef
  9. define i32 @test1b() {
  10. %X = call i32 @test1a( i32 17 )
  11. ret i32 %X
  12. ; CHECK-LABEL: define i32 @test1b(
  13. ; CHECK: ret i32 17
  14. }
  15. ;;======================== test2
  16. define internal i32 @test2a(i32 %A) {
  17. %C = icmp eq i32 %A, 0
  18. br i1 %C, label %T, label %F
  19. T:
  20. %B = call i32 @test2a( i32 0 )
  21. ret i32 0
  22. F:
  23. %C.upgrd.1 = call i32 @test2a(i32 1)
  24. ret i32 %C.upgrd.1
  25. }
  26. ; CHECK-LABEL: define internal i32 @test2a(
  27. ; CHECK-NEXT: br label %T
  28. ; CHECK: ret i32 undef
  29. define i32 @test2b() {
  30. %X = call i32 @test2a(i32 0)
  31. ret i32 %X
  32. }
  33. ; CHECK-LABEL: define i32 @test2b(
  34. ; CHECK-NEXT: %X = call i32 @test2a(i32 0)
  35. ; CHECK-NEXT: ret i32 0
  36. ;;======================== test3
  37. @G = internal global i32 undef
  38. define void @test3a() {
  39. %X = load i32, i32* @G
  40. store i32 %X, i32* @G
  41. ret void
  42. }
  43. ; CHECK-LABEL: define void @test3a(
  44. ; CHECK-NEXT: ret void
  45. define i32 @test3b() {
  46. %V = load i32, i32* @G
  47. %C = icmp eq i32 %V, 17
  48. br i1 %C, label %T, label %F
  49. T:
  50. store i32 17, i32* @G
  51. ret i32 %V
  52. F:
  53. store i32 123, i32* @G
  54. ret i32 0
  55. }
  56. ; CHECK-LABEL: define i32 @test3b(
  57. ; CHECK-NOT: store
  58. ; CHECK: ret i32 0
  59. ;;======================== test4
  60. define internal {i64,i64} @test4a() {
  61. %a = insertvalue {i64,i64} undef, i64 4, 1
  62. %b = insertvalue {i64,i64} %a, i64 5, 0
  63. ret {i64,i64} %b
  64. }
  65. define i64 @test4b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  66. %a = invoke {i64,i64} @test4a()
  67. to label %A unwind label %B
  68. A:
  69. %b = extractvalue {i64,i64} %a, 0
  70. %c = call i64 @test4c(i64 %b)
  71. ret i64 %c
  72. B:
  73. %val = landingpad { i8*, i32 }
  74. catch i8* null
  75. ret i64 0
  76. }
  77. ; CHECK: define i64 @test4b()
  78. ; CHECK: %c = call i64 @test4c(i64 5)
  79. ; CHECK-NEXT: ret i64 5
  80. define internal i64 @test4c(i64 %a) {
  81. ret i64 %a
  82. }
  83. ; CHECK-LABEL: define internal i64 @test4c(
  84. ; CHECK: ret i64 undef
  85. ;;======================== test5
  86. ; PR4313
  87. define internal {i64,i64} @test5a() {
  88. %a = insertvalue {i64,i64} undef, i64 4, 1
  89. %b = insertvalue {i64,i64} %a, i64 5, 0
  90. ret {i64,i64} %b
  91. }
  92. define i64 @test5b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  93. %a = invoke {i64,i64} @test5a()
  94. to label %A unwind label %B
  95. A:
  96. %c = call i64 @test5c({i64,i64} %a)
  97. ret i64 %c
  98. B:
  99. %val = landingpad { i8*, i32 }
  100. catch i8* null
  101. ret i64 0
  102. }
  103. ; CHECK: define i64 @test5b()
  104. ; CHECK: A:
  105. ; CHECK-NEXT: %c = call i64 @test5c({ i64, i64 } %a)
  106. ; CHECK-NEXT: ret i64 5
  107. define internal i64 @test5c({i64,i64} %a) {
  108. %b = extractvalue {i64,i64} %a, 0
  109. ret i64 %b
  110. }
  111. ;;======================== test6
  112. define i64 @test6a() {
  113. ret i64 0
  114. }
  115. define i64 @test6b() {
  116. %a = call i64 @test6a()
  117. ret i64 %a
  118. }
  119. ; CHECK-LABEL: define i64 @test6b(
  120. ; CHECK: ret i64 0
  121. ;;======================== test7
  122. %T = type {i32,i32}
  123. define internal %T @test7a(i32 %A) {
  124. %X = add i32 1, %A
  125. %mrv0 = insertvalue %T undef, i32 %X, 0
  126. %mrv1 = insertvalue %T %mrv0, i32 %A, 1
  127. ret %T %mrv1
  128. ; CHECK-LABEL: @test7a(
  129. ; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
  130. ; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
  131. }
  132. define i32 @test7b() {
  133. %X = call %T @test7a(i32 17)
  134. %Y = extractvalue %T %X, 0
  135. %Z = add i32 %Y, %Y
  136. ret i32 %Z
  137. ; CHECK-LABEL: define i32 @test7b(
  138. ; CHECK-NEXT: call %T @test7a(i32 17)
  139. ; CHECK-NEXT: ret i32 36
  140. }
  141. ;;======================== test8
  142. define internal {} @test8a(i32 %A, i32* %P) {
  143. store i32 %A, i32* %P
  144. ret {} {}
  145. ; CHECK-LABEL: @test8a(
  146. ; CHECK-NEXT: store i32 5,
  147. ; CHECK-NEXT: ret
  148. }
  149. define void @test8b(i32* %P) {
  150. %X = call {} @test8a(i32 5, i32* %P)
  151. ret void
  152. ; CHECK-LABEL: define void @test8b(
  153. ; CHECK-NEXT: call {} @test8a
  154. ; CHECK-NEXT: ret void
  155. }
  156. ;;======================== test9
  157. @test9g = internal global { } zeroinitializer
  158. define void @test9() {
  159. entry:
  160. %local_foo = alloca { }
  161. load { }, { }* @test9g
  162. store { } %0, { }* %local_foo
  163. ret void
  164. }
  165. declare i32 @__gxx_personality_v0(...)
  166. ;;======================== test10
  167. define i32 @test10a() nounwind {
  168. entry:
  169. %call = call i32 @test10b(i32 undef)
  170. ret i32 %call
  171. ; CHECK-LABEL: define i32 @test10a(
  172. ; CHECK: ret i32 0
  173. }
  174. define internal i32 @test10b(i32 %x) nounwind {
  175. entry:
  176. %r = and i32 %x, 1
  177. ret i32 %r
  178. ; CHECK-LABEL: define internal i32 @test10b(
  179. ; CHECK: ret i32 undef
  180. }
  181. ;;======================== test11
  182. define i64 @test11a() {
  183. %xor = xor i64 undef, undef
  184. ret i64 %xor
  185. ; CHECK-LABEL: define i64 @test11a
  186. ; CHECK: ret i64 0
  187. }
  188. define void @test11b() {
  189. %call1 = call i64 @test11a()
  190. %call2 = call i64 @llvm.ctpop.i64(i64 %call1)
  191. ret void
  192. ; CHECK-LABEL: define void @test11b
  193. ; CHECK: %[[call1:.*]] = call i64 @test11a()
  194. ; CHECK: %[[call2:.*]] = call i64 @llvm.ctpop.i64(i64 0)
  195. }
  196. declare i64 @llvm.ctpop.i64(i64)