args-rets-allocas-loads.ll 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. ; RUN: opt -basicaa -aa-eval -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s
  2. declare void @callee(double* %callee_arg)
  3. declare void @nocap_callee(double* nocapture %nocap_callee_arg)
  4. declare double* @normal_returner()
  5. declare noalias double* @noalias_returner()
  6. define void @caller_a(double* %arg_a0,
  7. double* %arg_a1,
  8. double* noalias %noalias_arg_a0,
  9. double* noalias %noalias_arg_a1,
  10. double** %indirect_a0,
  11. double** %indirect_a1) {
  12. %escape_alloca_a0 = alloca double
  13. %escape_alloca_a1 = alloca double
  14. %noescape_alloca_a0 = alloca double
  15. %noescape_alloca_a1 = alloca double
  16. %normal_ret_a0 = call double* @normal_returner()
  17. %normal_ret_a1 = call double* @normal_returner()
  18. %noalias_ret_a0 = call double* @noalias_returner()
  19. %noalias_ret_a1 = call double* @noalias_returner()
  20. %loaded_a0 = load double*, double** %indirect_a0
  21. %loaded_a1 = load double*, double** %indirect_a1
  22. call void @callee(double* %escape_alloca_a0)
  23. call void @callee(double* %escape_alloca_a1)
  24. call void @nocap_callee(double* %noescape_alloca_a0)
  25. call void @nocap_callee(double* %noescape_alloca_a1)
  26. store double 0.0, double* %loaded_a0
  27. store double 0.0, double* %loaded_a1
  28. store double 0.0, double* %arg_a0
  29. store double 0.0, double* %arg_a1
  30. store double 0.0, double* %noalias_arg_a0
  31. store double 0.0, double* %noalias_arg_a1
  32. store double 0.0, double* %escape_alloca_a0
  33. store double 0.0, double* %escape_alloca_a1
  34. store double 0.0, double* %noescape_alloca_a0
  35. store double 0.0, double* %noescape_alloca_a1
  36. store double 0.0, double* %normal_ret_a0
  37. store double 0.0, double* %normal_ret_a1
  38. store double 0.0, double* %noalias_ret_a0
  39. store double 0.0, double* %noalias_ret_a1
  40. ret void
  41. }
  42. ; CHECK: Function: caller_a: 16 pointers, 8 call sites
  43. ; CHECK-NEXT: MayAlias: double* %arg_a0, double* %arg_a1
  44. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noalias_arg_a0
  45. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noalias_arg_a0
  46. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noalias_arg_a1
  47. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noalias_arg_a1
  48. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %noalias_arg_a1
  49. ; CHECK-NEXT: MayAlias: double* %arg_a0, double** %indirect_a0
  50. ; CHECK-NEXT: MayAlias: double* %arg_a1, double** %indirect_a0
  51. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double** %indirect_a0
  52. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double** %indirect_a0
  53. ; CHECK-NEXT: MayAlias: double* %arg_a0, double** %indirect_a1
  54. ; CHECK-NEXT: MayAlias: double* %arg_a1, double** %indirect_a1
  55. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double** %indirect_a1
  56. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double** %indirect_a1
  57. ; CHECK-NEXT: MayAlias: double** %indirect_a0, double** %indirect_a1
  58. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %escape_alloca_a0
  59. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %escape_alloca_a0
  60. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noalias_arg_a0
  61. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noalias_arg_a1
  62. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double** %indirect_a0
  63. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double** %indirect_a1
  64. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %escape_alloca_a1
  65. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %escape_alloca_a1
  66. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noalias_arg_a0
  67. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noalias_arg_a1
  68. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double** %indirect_a0
  69. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double** %indirect_a1
  70. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %escape_alloca_a1
  71. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noescape_alloca_a0
  72. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noescape_alloca_a0
  73. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %noescape_alloca_a0
  74. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %noescape_alloca_a0
  75. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a0, double** %indirect_a0
  76. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a0, double** %indirect_a1
  77. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noescape_alloca_a0
  78. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noescape_alloca_a0
  79. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noescape_alloca_a1
  80. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noescape_alloca_a1
  81. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %noescape_alloca_a1
  82. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %noescape_alloca_a1
  83. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a1, double** %indirect_a0
  84. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a1, double** %indirect_a1
  85. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noescape_alloca_a1
  86. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noescape_alloca_a1
  87. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a0, double* %noescape_alloca_a1
  88. ; CHECK-NEXT: MayAlias: double* %arg_a0, double* %normal_ret_a0
  89. ; CHECK-NEXT: MayAlias: double* %arg_a1, double* %normal_ret_a0
  90. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %normal_ret_a0
  91. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %normal_ret_a0
  92. ; CHECK-NEXT: MayAlias: double* %normal_ret_a0, double** %indirect_a0
  93. ; CHECK-NEXT: MayAlias: double* %normal_ret_a0, double** %indirect_a1
  94. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a0, double* %normal_ret_a0
  95. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a1, double* %normal_ret_a0
  96. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a0, double* %normal_ret_a0
  97. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a1, double* %normal_ret_a0
  98. ; CHECK-NEXT: MayAlias: double* %arg_a0, double* %normal_ret_a1
  99. ; CHECK-NEXT: MayAlias: double* %arg_a1, double* %normal_ret_a1
  100. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %normal_ret_a1
  101. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %normal_ret_a1
  102. ; CHECK-NEXT: MayAlias: double* %normal_ret_a1, double** %indirect_a0
  103. ; CHECK-NEXT: MayAlias: double* %normal_ret_a1, double** %indirect_a1
  104. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a0, double* %normal_ret_a1
  105. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a1, double* %normal_ret_a1
  106. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a0, double* %normal_ret_a1
  107. ; CHECK-NEXT: NoAlias: double* %noescape_alloca_a1, double* %normal_ret_a1
  108. ; CHECK-NEXT: MayAlias: double* %normal_ret_a0, double* %normal_ret_a1
  109. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noalias_ret_a0
  110. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noalias_ret_a0
  111. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %noalias_ret_a0
  112. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %noalias_ret_a0
  113. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double** %indirect_a0
  114. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double** %indirect_a1
  115. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noalias_ret_a0
  116. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noalias_ret_a0
  117. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double* %noescape_alloca_a0
  118. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double* %noescape_alloca_a1
  119. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double* %normal_ret_a0
  120. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double* %normal_ret_a1
  121. ; CHECK-NEXT: NoAlias: double* %arg_a0, double* %noalias_ret_a1
  122. ; CHECK-NEXT: NoAlias: double* %arg_a1, double* %noalias_ret_a1
  123. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a0, double* %noalias_ret_a1
  124. ; CHECK-NEXT: NoAlias: double* %noalias_arg_a1, double* %noalias_ret_a1
  125. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double** %indirect_a0
  126. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double** %indirect_a1
  127. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a0, double* %noalias_ret_a1
  128. ; CHECK-NEXT: NoAlias: double* %escape_alloca_a1, double* %noalias_ret_a1
  129. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double* %noescape_alloca_a0
  130. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double* %noescape_alloca_a1
  131. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double* %normal_ret_a0
  132. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a1, double* %normal_ret_a1
  133. ; CHECK-NEXT: NoAlias: double* %noalias_ret_a0, double* %noalias_ret_a1
  134. ; CHECK-NEXT: MayAlias: double* %arg_a0, double* %loaded_a0
  135. ; CHECK-NEXT: MayAlias: double* %arg_a1, double* %loaded_a0
  136. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noalias_arg_a0
  137. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noalias_arg_a1
  138. ; CHECK-NEXT: MayAlias: double* %loaded_a0, double** %indirect_a0
  139. ; CHECK-NEXT: MayAlias: double* %loaded_a0, double** %indirect_a1
  140. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a0, double* %loaded_a0
  141. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a1, double* %loaded_a0
  142. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noescape_alloca_a0
  143. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noescape_alloca_a1
  144. ; CHECK-NEXT: MayAlias: double* %loaded_a0, double* %normal_ret_a0
  145. ; CHECK-NEXT: MayAlias: double* %loaded_a0, double* %normal_ret_a1
  146. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noalias_ret_a0
  147. ; CHECK-NEXT: NoAlias: double* %loaded_a0, double* %noalias_ret_a1
  148. ; CHECK-NEXT: MayAlias: double* %arg_a0, double* %loaded_a1
  149. ; CHECK-NEXT: MayAlias: double* %arg_a1, double* %loaded_a1
  150. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noalias_arg_a0
  151. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noalias_arg_a1
  152. ; CHECK-NEXT: MayAlias: double* %loaded_a1, double** %indirect_a0
  153. ; CHECK-NEXT: MayAlias: double* %loaded_a1, double** %indirect_a1
  154. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a0, double* %loaded_a1
  155. ; CHECK-NEXT: MayAlias: double* %escape_alloca_a1, double* %loaded_a1
  156. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noescape_alloca_a0
  157. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noescape_alloca_a1
  158. ; CHECK-NEXT: MayAlias: double* %loaded_a1, double* %normal_ret_a0
  159. ; CHECK-NEXT: MayAlias: double* %loaded_a1, double* %normal_ret_a1
  160. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noalias_ret_a0
  161. ; CHECK-NEXT: NoAlias: double* %loaded_a1, double* %noalias_ret_a1
  162. ; CHECK-NEXT: MayAlias: double* %loaded_a0, double* %loaded_a1
  163. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  164. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  165. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  166. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  167. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  168. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  169. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  170. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  171. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  172. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  173. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  174. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  175. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  176. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  177. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> %normal_ret_a0 = call double* @normal_returner()
  178. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> %normal_ret_a0 = call double* @normal_returner()
  179. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  180. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  181. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  182. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  183. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  184. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  185. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  186. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  187. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  188. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  189. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  190. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  191. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  192. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  193. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> %normal_ret_a1 = call double* @normal_returner()
  194. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> %normal_ret_a1 = call double* @normal_returner()
  195. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  196. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  197. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  198. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  199. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  200. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  201. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  202. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  203. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  204. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  205. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  206. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  207. ; CHECK-NEXT: Both ModRef: Ptr: double* %noalias_ret_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  208. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  209. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> %noalias_ret_a0 = call double* @noalias_returner()
  210. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> %noalias_ret_a0 = call double* @noalias_returner()
  211. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  212. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  213. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  214. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  215. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  216. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  217. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  218. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  219. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  220. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  221. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  222. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  223. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  224. ; CHECK-NEXT: Both ModRef: Ptr: double* %noalias_ret_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  225. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> %noalias_ret_a1 = call double* @noalias_returner()
  226. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> %noalias_ret_a1 = call double* @noalias_returner()
  227. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> call void @callee(double* %escape_alloca_a0)
  228. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> call void @callee(double* %escape_alloca_a0)
  229. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> call void @callee(double* %escape_alloca_a0)
  230. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> call void @callee(double* %escape_alloca_a0)
  231. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> call void @callee(double* %escape_alloca_a0)
  232. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> call void @callee(double* %escape_alloca_a0)
  233. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> call void @callee(double* %escape_alloca_a0)
  234. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> call void @callee(double* %escape_alloca_a0)
  235. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> call void @callee(double* %escape_alloca_a0)
  236. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> call void @callee(double* %escape_alloca_a0)
  237. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> call void @callee(double* %escape_alloca_a0)
  238. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> call void @callee(double* %escape_alloca_a0)
  239. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> call void @callee(double* %escape_alloca_a0)
  240. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> call void @callee(double* %escape_alloca_a0)
  241. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> call void @callee(double* %escape_alloca_a0)
  242. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> call void @callee(double* %escape_alloca_a0)
  243. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> call void @callee(double* %escape_alloca_a1)
  244. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> call void @callee(double* %escape_alloca_a1)
  245. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> call void @callee(double* %escape_alloca_a1)
  246. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> call void @callee(double* %escape_alloca_a1)
  247. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> call void @callee(double* %escape_alloca_a1)
  248. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> call void @callee(double* %escape_alloca_a1)
  249. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> call void @callee(double* %escape_alloca_a1)
  250. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> call void @callee(double* %escape_alloca_a1)
  251. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> call void @callee(double* %escape_alloca_a1)
  252. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> call void @callee(double* %escape_alloca_a1)
  253. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> call void @callee(double* %escape_alloca_a1)
  254. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> call void @callee(double* %escape_alloca_a1)
  255. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> call void @callee(double* %escape_alloca_a1)
  256. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> call void @callee(double* %escape_alloca_a1)
  257. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> call void @callee(double* %escape_alloca_a1)
  258. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> call void @callee(double* %escape_alloca_a1)
  259. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  260. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  261. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  262. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  263. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  264. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  265. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  266. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  267. ; CHECK-NEXT: Both ModRef: Ptr: double* %noescape_alloca_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  268. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  269. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  270. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  271. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  272. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  273. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  274. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> call void @nocap_callee(double* %noescape_alloca_a0)
  275. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  276. ; CHECK-NEXT: Both ModRef: Ptr: double* %arg_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  277. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  278. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_arg_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  279. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  280. ; CHECK-NEXT: Both ModRef: Ptr: double** %indirect_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  281. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  282. ; CHECK-NEXT: Both ModRef: Ptr: double* %escape_alloca_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  283. ; CHECK-NEXT: NoModRef: Ptr: double* %noescape_alloca_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  284. ; CHECK-NEXT: Both ModRef: Ptr: double* %noescape_alloca_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  285. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  286. ; CHECK-NEXT: Both ModRef: Ptr: double* %normal_ret_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  287. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  288. ; CHECK-NEXT: NoModRef: Ptr: double* %noalias_ret_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  289. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a0 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  290. ; CHECK-NEXT: Both ModRef: Ptr: double* %loaded_a1 <-> call void @nocap_callee(double* %noescape_alloca_a1)
  291. ; CHECK: ===== Alias Analysis Evaluator Report =====
  292. ; CHECK-NEXT: 120 Total Alias Queries Performed
  293. ; CHECK-NEXT: 84 no alias responses (70.0%)
  294. ; CHECK-NEXT: 36 may alias responses (30.0%)
  295. ; CHECK-NEXT: 0 partial alias responses (0.0%)
  296. ; CHECK-NEXT: 0 must alias responses (0.0%)
  297. ; CHECK-NEXT: Alias Analysis Evaluator Pointer Alias Summary: 70%/30%/0%
  298. ; CHECK-NEXT: 184 Total ModRef Queries Performed
  299. ; CHECK-NEXT: 44 no mod/ref responses (23.9%)
  300. ; CHECK-NEXT: 0 mod responses (0.0%)
  301. ; CHECK-NEXT: 0 ref responses (0.0%)
  302. ; CHECK-NEXT: 140 mod & ref responses (76.0%)
  303. ; CHECK-NEXT: Alias Analysis Evaluator Mod/Ref Summary: 23%/0%/0%/76%