basic.ll 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. ; RUN: opt -disable-output -passes=print-cg %s 2>&1 | FileCheck %s
  2. ;
  3. ; Basic validation of the call graph analysis used in the new pass manager.
  4. define void @f() {
  5. ; CHECK-LABEL: Call edges in function: f
  6. ; CHECK-NOT: ->
  7. entry:
  8. ret void
  9. }
  10. ; A bunch more functions just to make it easier to test several call edges at once.
  11. define void @f1() {
  12. ret void
  13. }
  14. define void @f2() {
  15. ret void
  16. }
  17. define void @f3() {
  18. ret void
  19. }
  20. define void @f4() {
  21. ret void
  22. }
  23. define void @f5() {
  24. ret void
  25. }
  26. define void @f6() {
  27. ret void
  28. }
  29. define void @f7() {
  30. ret void
  31. }
  32. define void @f8() {
  33. ret void
  34. }
  35. define void @f9() {
  36. ret void
  37. }
  38. define void @f10() {
  39. ret void
  40. }
  41. define void @f11() {
  42. ret void
  43. }
  44. define void @f12() {
  45. ret void
  46. }
  47. declare i32 @__gxx_personality_v0(...)
  48. define void @test0() {
  49. ; CHECK-LABEL: Call edges in function: test0
  50. ; CHECK-NEXT: -> f
  51. ; CHECK-NOT: ->
  52. entry:
  53. call void @f()
  54. call void @f()
  55. call void @f()
  56. call void @f()
  57. ret void
  58. }
  59. define void ()* @test1(void ()** %x) personality i32 (...)* @__gxx_personality_v0 {
  60. ; CHECK-LABEL: Call edges in function: test1
  61. ; CHECK-NEXT: -> f12
  62. ; CHECK-NEXT: -> f11
  63. ; CHECK-NEXT: -> f10
  64. ; CHECK-NEXT: -> f7
  65. ; CHECK-NEXT: -> f9
  66. ; CHECK-NEXT: -> f8
  67. ; CHECK-NEXT: -> f6
  68. ; CHECK-NEXT: -> f5
  69. ; CHECK-NEXT: -> f4
  70. ; CHECK-NEXT: -> f3
  71. ; CHECK-NEXT: -> f2
  72. ; CHECK-NEXT: -> f1
  73. ; CHECK-NOT: ->
  74. entry:
  75. br label %next
  76. dead:
  77. br label %next
  78. next:
  79. phi void ()* [ @f1, %entry ], [ @f2, %dead ]
  80. select i1 true, void ()* @f3, void ()* @f4
  81. store void ()* @f5, void ()** %x
  82. call void @f6()
  83. call void (void ()*, void ()*) bitcast (void ()* @f7 to void (void ()*, void ()*)*)(void ()* @f8, void ()* @f9)
  84. invoke void @f10() to label %exit unwind label %unwind
  85. exit:
  86. ret void ()* @f11
  87. unwind:
  88. %res = landingpad { i8*, i32 }
  89. cleanup
  90. resume { i8*, i32 } { i8* bitcast (void ()* @f12 to i8*), i32 42 }
  91. }
  92. @g = global void ()* @f1
  93. @g1 = global [4 x void ()*] [void ()* @f2, void ()* @f3, void ()* @f4, void ()* @f5]
  94. @g2 = global {i8, void ()*, i8} {i8 1, void ()* @f6, i8 2}
  95. @h = constant void ()* @f7
  96. define void @test2() {
  97. ; CHECK-LABEL: Call edges in function: test2
  98. ; CHECK-NEXT: -> f7
  99. ; CHECK-NEXT: -> f6
  100. ; CHECK-NEXT: -> f5
  101. ; CHECK-NEXT: -> f4
  102. ; CHECK-NEXT: -> f3
  103. ; CHECK-NEXT: -> f2
  104. ; CHECK-NEXT: -> f1
  105. ; CHECK-NOT: ->
  106. load i8*, i8** bitcast (void ()** @g to i8**)
  107. load i8*, i8** bitcast (void ()** getelementptr ([4 x void ()*], [4 x void ()*]* @g1, i32 0, i32 2) to i8**)
  108. load i8*, i8** bitcast (void ()** getelementptr ({i8, void ()*, i8}, {i8, void ()*, i8}* @g2, i32 0, i32 1) to i8**)
  109. load i8*, i8** bitcast (void ()** @h to i8**)
  110. ret void
  111. }
  112. ; Verify the SCCs formed.
  113. ;
  114. ; CHECK-LABEL: SCC with 1 functions:
  115. ; CHECK-NEXT: f7
  116. ;
  117. ; CHECK-LABEL: SCC with 1 functions:
  118. ; CHECK-NEXT: f6
  119. ;
  120. ; CHECK-LABEL: SCC with 1 functions:
  121. ; CHECK-NEXT: f5
  122. ;
  123. ; CHECK-LABEL: SCC with 1 functions:
  124. ; CHECK-NEXT: f4
  125. ;
  126. ; CHECK-LABEL: SCC with 1 functions:
  127. ; CHECK-NEXT: f3
  128. ;
  129. ; CHECK-LABEL: SCC with 1 functions:
  130. ; CHECK-NEXT: f2
  131. ;
  132. ; CHECK-LABEL: SCC with 1 functions:
  133. ; CHECK-NEXT: f1
  134. ;
  135. ; CHECK-LABEL: SCC with 1 functions:
  136. ; CHECK-NEXT: test2
  137. ;
  138. ; CHECK-LABEL: SCC with 1 functions:
  139. ; CHECK-NEXT: f12
  140. ;
  141. ; CHECK-LABEL: SCC with 1 functions:
  142. ; CHECK-NEXT: f11
  143. ;
  144. ; CHECK-LABEL: SCC with 1 functions:
  145. ; CHECK-NEXT: f10
  146. ;
  147. ; CHECK-LABEL: SCC with 1 functions:
  148. ; CHECK-NEXT: f9
  149. ;
  150. ; CHECK-LABEL: SCC with 1 functions:
  151. ; CHECK-NEXT: f8
  152. ;
  153. ; CHECK-LABEL: SCC with 1 functions:
  154. ; CHECK-NEXT: test1
  155. ;
  156. ; CHECK-LABEL: SCC with 1 functions:
  157. ; CHECK-NEXT: f
  158. ;
  159. ; CHECK-LABEL: SCC with 1 functions:
  160. ; CHECK-NEXT: test0