gep-alias.ll 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. ; RUN: opt < %s -basicaa -gvn -instcombine -S 2>&1 | FileCheck %s
  2. target datalayout = "e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
  3. ; Make sure that basicaa thinks R and r are must aliases.
  4. define i32 @test1(i8 * %P) {
  5. entry:
  6. %Q = bitcast i8* %P to {i32, i32}*
  7. %R = getelementptr {i32, i32}, {i32, i32}* %Q, i32 0, i32 1
  8. %S = load i32, i32* %R
  9. %q = bitcast i8* %P to {i32, i32}*
  10. %r = getelementptr {i32, i32}, {i32, i32}* %q, i32 0, i32 1
  11. %s = load i32, i32* %r
  12. %t = sub i32 %S, %s
  13. ret i32 %t
  14. ; CHECK-LABEL: @test1(
  15. ; CHECK: ret i32 0
  16. }
  17. define i32 @test2(i8 * %P) {
  18. entry:
  19. %Q = bitcast i8* %P to {i32, i32, i32}*
  20. %R = getelementptr {i32, i32, i32}, {i32, i32, i32}* %Q, i32 0, i32 1
  21. %S = load i32, i32* %R
  22. %r = getelementptr {i32, i32, i32}, {i32, i32, i32}* %Q, i32 0, i32 2
  23. store i32 42, i32* %r
  24. %s = load i32, i32* %R
  25. %t = sub i32 %S, %s
  26. ret i32 %t
  27. ; CHECK-LABEL: @test2(
  28. ; CHECK: ret i32 0
  29. }
  30. ; This was a miscompilation.
  31. define i32 @test3({float, {i32, i32, i32}}* %P) {
  32. entry:
  33. %P2 = getelementptr {float, {i32, i32, i32}}, {float, {i32, i32, i32}}* %P, i32 0, i32 1
  34. %R = getelementptr {i32, i32, i32}, {i32, i32, i32}* %P2, i32 0, i32 1
  35. %S = load i32, i32* %R
  36. %r = getelementptr {i32, i32, i32}, {i32, i32, i32}* %P2, i32 0, i32 2
  37. store i32 42, i32* %r
  38. %s = load i32, i32* %R
  39. %t = sub i32 %S, %s
  40. ret i32 %t
  41. ; CHECK-LABEL: @test3(
  42. ; CHECK: ret i32 0
  43. }
  44. ;; This is reduced from the SmallPtrSet constructor.
  45. %SmallPtrSetImpl = type { i8**, i32, i32, i32, [1 x i8*] }
  46. %SmallPtrSet64 = type { %SmallPtrSetImpl, [64 x i8*] }
  47. define i32 @test4(%SmallPtrSet64* %P) {
  48. entry:
  49. %tmp2 = getelementptr inbounds %SmallPtrSet64, %SmallPtrSet64* %P, i64 0, i32 0, i32 1
  50. store i32 64, i32* %tmp2, align 8
  51. %tmp3 = getelementptr inbounds %SmallPtrSet64, %SmallPtrSet64* %P, i64 0, i32 0, i32 4, i64 64
  52. store i8* null, i8** %tmp3, align 8
  53. %tmp4 = load i32, i32* %tmp2, align 8
  54. ret i32 %tmp4
  55. ; CHECK-LABEL: @test4(
  56. ; CHECK: ret i32 64
  57. }
  58. ; P[i] != p[i+1]
  59. define i32 @test5(i32* %p, i64 %i) {
  60. %pi = getelementptr i32, i32* %p, i64 %i
  61. %i.next = add i64 %i, 1
  62. %pi.next = getelementptr i32, i32* %p, i64 %i.next
  63. %x = load i32, i32* %pi
  64. store i32 42, i32* %pi.next
  65. %y = load i32, i32* %pi
  66. %z = sub i32 %x, %y
  67. ret i32 %z
  68. ; CHECK-LABEL: @test5(
  69. ; CHECK: ret i32 0
  70. }
  71. define i32 @test5_as1_smaller_size(i32 addrspace(1)* %p, i8 %i) {
  72. %pi = getelementptr i32, i32 addrspace(1)* %p, i8 %i
  73. %i.next = add i8 %i, 1
  74. %pi.next = getelementptr i32, i32 addrspace(1)* %p, i8 %i.next
  75. %x = load i32, i32 addrspace(1)* %pi
  76. store i32 42, i32 addrspace(1)* %pi.next
  77. %y = load i32, i32 addrspace(1)* %pi
  78. %z = sub i32 %x, %y
  79. ret i32 %z
  80. ; CHECK-LABEL: @test5_as1_smaller_size(
  81. ; CHECK: sext
  82. ; CHECK: ret i32 0
  83. }
  84. define i32 @test5_as1_same_size(i32 addrspace(1)* %p, i16 %i) {
  85. %pi = getelementptr i32, i32 addrspace(1)* %p, i16 %i
  86. %i.next = add i16 %i, 1
  87. %pi.next = getelementptr i32, i32 addrspace(1)* %p, i16 %i.next
  88. %x = load i32, i32 addrspace(1)* %pi
  89. store i32 42, i32 addrspace(1)* %pi.next
  90. %y = load i32, i32 addrspace(1)* %pi
  91. %z = sub i32 %x, %y
  92. ret i32 %z
  93. ; CHECK-LABEL: @test5_as1_same_size(
  94. ; CHECK: ret i32 0
  95. }
  96. ; P[i] != p[(i*4)|1]
  97. define i32 @test6(i32* %p, i64 %i1) {
  98. %i = shl i64 %i1, 2
  99. %pi = getelementptr i32, i32* %p, i64 %i
  100. %i.next = or i64 %i, 1
  101. %pi.next = getelementptr i32, i32* %p, i64 %i.next
  102. %x = load i32, i32* %pi
  103. store i32 42, i32* %pi.next
  104. %y = load i32, i32* %pi
  105. %z = sub i32 %x, %y
  106. ret i32 %z
  107. ; CHECK-LABEL: @test6(
  108. ; CHECK: ret i32 0
  109. }
  110. ; P[1] != P[i*4]
  111. define i32 @test7(i32* %p, i64 %i) {
  112. %pi = getelementptr i32, i32* %p, i64 1
  113. %i.next = shl i64 %i, 2
  114. %pi.next = getelementptr i32, i32* %p, i64 %i.next
  115. %x = load i32, i32* %pi
  116. store i32 42, i32* %pi.next
  117. %y = load i32, i32* %pi
  118. %z = sub i32 %x, %y
  119. ret i32 %z
  120. ; CHECK-LABEL: @test7(
  121. ; CHECK: ret i32 0
  122. }
  123. ; P[zext(i)] != p[zext(i+1)]
  124. ; PR1143
  125. define i32 @test8(i32* %p, i16 %i) {
  126. %i1 = zext i16 %i to i32
  127. %pi = getelementptr i32, i32* %p, i32 %i1
  128. %i.next = add i16 %i, 1
  129. %i.next2 = zext i16 %i.next to i32
  130. %pi.next = getelementptr i32, i32* %p, i32 %i.next2
  131. %x = load i32, i32* %pi
  132. store i32 42, i32* %pi.next
  133. %y = load i32, i32* %pi
  134. %z = sub i32 %x, %y
  135. ret i32 %z
  136. ; CHECK-LABEL: @test8(
  137. ; CHECK: ret i32 0
  138. }
  139. define i8 @test9([4 x i8] *%P, i32 %i, i32 %j) {
  140. %i2 = shl i32 %i, 2
  141. %i3 = add i32 %i2, 1
  142. ; P2 = P + 1 + 4*i
  143. %P2 = getelementptr [4 x i8], [4 x i8] *%P, i32 0, i32 %i3
  144. %j2 = shl i32 %j, 2
  145. ; P4 = P + 4*j
  146. %P4 = getelementptr [4 x i8], [4 x i8]* %P, i32 0, i32 %j2
  147. %x = load i8, i8* %P2
  148. store i8 42, i8* %P4
  149. %y = load i8, i8* %P2
  150. %z = sub i8 %x, %y
  151. ret i8 %z
  152. ; CHECK-LABEL: @test9(
  153. ; CHECK: ret i8 0
  154. }
  155. define i8 @test10([4 x i8] *%P, i32 %i) {
  156. %i2 = shl i32 %i, 2
  157. %i3 = add i32 %i2, 4
  158. ; P2 = P + 4 + 4*i
  159. %P2 = getelementptr [4 x i8], [4 x i8] *%P, i32 0, i32 %i3
  160. ; P4 = P + 4*i
  161. %P4 = getelementptr [4 x i8], [4 x i8]* %P, i32 0, i32 %i2
  162. %x = load i8, i8* %P2
  163. store i8 42, i8* %P4
  164. %y = load i8, i8* %P2
  165. %z = sub i8 %x, %y
  166. ret i8 %z
  167. ; CHECK-LABEL: @test10(
  168. ; CHECK: ret i8 0
  169. }
  170. ; (This was a miscompilation.)
  171. define float @test11(i32 %indvar, [4 x [2 x float]]* %q) nounwind ssp {
  172. %tmp = mul i32 %indvar, -1
  173. %dec = add i32 %tmp, 3
  174. %scevgep = getelementptr [4 x [2 x float]], [4 x [2 x float]]* %q, i32 0, i32 %dec
  175. %scevgep35 = bitcast [2 x float]* %scevgep to i64*
  176. %arrayidx28 = getelementptr inbounds [4 x [2 x float]], [4 x [2 x float]]* %q, i32 0, i32 0
  177. %y29 = getelementptr inbounds [2 x float], [2 x float]* %arrayidx28, i32 0, i32 1
  178. store float 1.0, float* %y29, align 4
  179. store i64 0, i64* %scevgep35, align 4
  180. %tmp30 = load float, float* %y29, align 4
  181. ret float %tmp30
  182. ; CHECK-LABEL: @test11(
  183. ; CHECK: ret float %tmp30
  184. }
  185. ; (This was a miscompilation.)
  186. define i32 @test12(i32 %x, i32 %y, i8* %p) nounwind {
  187. %a = bitcast i8* %p to [13 x i8]*
  188. %b = getelementptr [13 x i8], [13 x i8]* %a, i32 %x
  189. %c = bitcast [13 x i8]* %b to [15 x i8]*
  190. %d = getelementptr [15 x i8], [15 x i8]* %c, i32 %y, i32 8
  191. %castd = bitcast i8* %d to i32*
  192. %castp = bitcast i8* %p to i32*
  193. store i32 1, i32* %castp
  194. store i32 0, i32* %castd
  195. %r = load i32, i32* %castp
  196. ret i32 %r
  197. ; CHECK-LABEL: @test12(
  198. ; CHECK: ret i32 %r
  199. }
  200. @P = internal global i32 715827882, align 4
  201. @Q = internal global i32 715827883, align 4
  202. @.str = private unnamed_addr constant [7 x i8] c"%u %u\0A\00", align 1
  203. ; Make sure we recognize that u[0] and u[Global + Cst] may alias
  204. ; when the addition has wrapping semantic.
  205. ; PR24468.
  206. ; CHECK-LABEL: @test13(
  207. ; Make sure the stores appear before the related loads.
  208. ; CHECK: store i8 42,
  209. ; CHECK: store i8 99,
  210. ; Find the loads and make sure they are used in the arguments to the printf.
  211. ; CHECK: [[T0ADDR:%[a-zA-Z0-9_]+]] = getelementptr inbounds [3 x i8], [3 x i8]* %t, i32 0, i32 0
  212. ; CHECK: [[T0:%[a-zA-Z0-9_]+]] = load i8, i8* [[T0ADDR]], align 1
  213. ; CHECK: [[T0ARG:%[a-zA-Z0-9_]+]] = zext i8 [[T0]] to i32
  214. ; CHECK: [[U0ADDR:%[a-zA-Z0-9_]+]] = getelementptr inbounds [3 x i8], [3 x i8]* %u, i32 0, i32 0
  215. ; CHECK: [[U0:%[a-zA-Z0-9_]+]] = load i8, i8* [[U0ADDR]], align 1
  216. ; CHECK: [[U0ARG:%[a-zA-Z0-9_]+]] = zext i8 [[U0]] to i32
  217. ; CHECK: call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 [[T0ARG]], i32 [[U0ARG]])
  218. ; CHECK: ret
  219. define void @test13() {
  220. entry:
  221. %t = alloca [3 x i8], align 1
  222. %u = alloca [3 x i8], align 1
  223. %tmp = load i32, i32* @P, align 4
  224. %tmp1 = mul i32 %tmp, 3
  225. %mul = add i32 %tmp1, -2147483646
  226. %idxprom = zext i32 %mul to i64
  227. %arrayidx = getelementptr inbounds [3 x i8], [3 x i8]* %t, i64 0, i64 %idxprom
  228. store i8 42, i8* %arrayidx, align 1
  229. %tmp2 = load i32, i32* @Q, align 4
  230. %tmp3 = mul i32 %tmp2, 3
  231. %mul2 = add i32 %tmp3, 2147483647
  232. %idxprom3 = zext i32 %mul2 to i64
  233. %arrayidx4 = getelementptr inbounds [3 x i8], [3 x i8]* %u, i64 0, i64 %idxprom3
  234. store i8 99, i8* %arrayidx4, align 1
  235. %arrayidx5 = getelementptr inbounds [3 x i8], [3 x i8]* %t, i64 0, i64 0
  236. %tmp4 = load i8, i8* %arrayidx5, align 1
  237. %conv = zext i8 %tmp4 to i32
  238. %arrayidx6 = getelementptr inbounds [3 x i8], [3 x i8]* %u, i64 0, i64 0
  239. %tmp5 = load i8, i8* %arrayidx6, align 1
  240. %conv7 = zext i8 %tmp5 to i32
  241. %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), i32 %conv, i32 %conv7)
  242. ret void
  243. }
  244. declare i32 @printf(i8*, ...)