1 ; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
5 ; CHECK-LABEL: gep_alloca_const_offset_1
6 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
7 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
8 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
9 define void @gep_alloca_const_offset_1() {
10 %alloc = alloca <vscale x 4 x i32>
11 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0
12 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
13 load <vscale x 4 x i32>, ptr %alloc
14 load <vscale x 4 x i32>, ptr %gep1
15 load <vscale x 4 x i32>, ptr %gep2
19 ; CHECK-LABEL: gep_alloca_const_offset_2
20 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
21 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
22 ; TODO: AliasResult for gep1,gep2 can be improved as MustAlias
23 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
24 define void @gep_alloca_const_offset_2() {
25 %alloc = alloca <vscale x 4 x i32>
26 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
27 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
28 load <vscale x 4 x i32>, ptr %alloc
29 load <vscale x 4 x i32>, ptr %gep1
30 load <vscale x 4 x i32>, ptr %gep2
34 ; CHECK-LABEL: gep_alloca_const_offset_3
35 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
36 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
37 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
38 define void @gep_alloca_const_offset_3() {
39 %alloc = alloca <vscale x 4 x i32>
40 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0
41 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 1
42 load <vscale x 4 x i32>, ptr %alloc
43 load <vscale x 4 x i32>, ptr %gep1
48 ; CHECK-LABEL: gep_alloca_const_offset_4
49 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
50 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
51 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
52 define void @gep_alloca_const_offset_4() {
53 %alloc = alloca <vscale x 4 x i32>
54 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
55 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 0
56 load <vscale x 4 x i32>, ptr %alloc
57 load <vscale x 4 x i32>, ptr %gep1
62 ; CHECK-LABEL: gep_alloca_symbolic_offset
63 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
64 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
65 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
66 define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) {
67 %alloc = alloca <vscale x 4 x i32>
68 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx1
69 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx2
70 load <vscale x 4 x i32>, ptr %alloc
71 load <vscale x 4 x i32>, ptr %gep1
72 load <vscale x 4 x i32>, ptr %gep2
76 ; CHECK-LABEL: gep_same_base_const_offset
77 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
78 ; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
79 ; TODO: AliasResult for gep1,gep2 can be improved as NoAlias
80 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
81 define void @gep_same_base_const_offset(ptr %p) {
82 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
83 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 1
84 load <vscale x 4 x i32>, ptr %p
90 ; CHECK-LABEL: gep_same_base_symbolic_offset
91 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p
92 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p
93 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
94 define void @gep_same_base_symbolic_offset(ptr %p, i64 %idx1, i64 %idx2) {
95 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx1
96 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx2
97 load <vscale x 4 x i32>, ptr %p
98 load <vscale x 4 x i32>, ptr %gep1
99 load <vscale x 4 x i32>, ptr %gep2
103 ; CHECK-LABEL: gep_different_base_const_offset
104 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1
105 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2
106 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2
107 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2
108 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1
109 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
110 define void @gep_different_base_const_offset(ptr noalias %p1, ptr noalias %p2) {
111 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 1
112 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p2, i64 1
113 load <vscale x 4 x i32>, ptr %p1
114 load <vscale x 4 x i32>, ptr %p2
115 load <vscale x 4 x i32>, ptr %gep1
116 load <vscale x 4 x i32>, ptr %gep2
120 ; getelementptr + bitcast
122 ; CHECK-LABEL: gep_bitcast_1
123 ; CHECK-DAG: MustAlias: i32* %p, <vscale x 4 x i32>* %p
124 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
125 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %p
126 ; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
127 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
128 ; CHECK-DAG: NoAlias: i32* %gep2, i32* %p
129 define void @gep_bitcast_1(ptr %p) {
130 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
131 %gep2 = getelementptr i32, ptr %p, i64 4
132 load <vscale x 4 x i32>, ptr %p
139 ; CHECK-LABEL: gep_bitcast_2
140 ; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p, <vscale x 4 x i32>* %p
141 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
142 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x float>* %p
143 ; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x i32>* %p
144 ; CHECK-DAG: MayAlias: i32* %gep1, float* %gep2
145 ; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x float>* %p
146 define void @gep_bitcast_2(ptr %p) {
147 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
148 %gep2 = getelementptr <vscale x 4 x float>, ptr %p, i64 1, i64 0
150 load float, ptr %gep2
151 load <vscale x 4 x i32>, ptr %p
152 load <vscale x 4 x float>, ptr %p
156 ; getelementptr recursion
158 ; CHECK-LABEL: gep_recursion_level_1
159 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
160 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
161 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
162 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
163 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
164 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
165 define void @gep_recursion_level_1(ptr %a, ptr %p) {
166 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
167 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
168 load <vscale x 4 x i32>, ptr %p
171 load i32, ptr %gep_rec_1
175 ; CHECK-LABEL: gep_recursion_level_1_bitcast
176 ; CHECK-DAG: MustAlias: i32* %a, <vscale x 4 x i32>* %a
177 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
178 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
179 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep
180 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep_rec_1
181 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
182 define void @gep_recursion_level_1_bitcast(ptr %a) {
183 %gep = getelementptr <vscale x 4 x i32>, ptr %a, i64 1, i64 2
184 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
185 load <vscale x 4 x i32>, ptr %a
188 load i32, ptr %gep_rec_1
192 ; CHECK-LABEL: gep_recursion_level_2
193 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
194 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
195 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
196 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
197 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
198 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
199 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
200 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
201 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
202 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2
203 define void @gep_recursion_level_2(ptr %a, ptr %p) {
204 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
205 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
206 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1
207 load <vscale x 4 x i32>, ptr %p
210 load i32, ptr %gep_rec_1
211 load i32, ptr %gep_rec_2
215 ; CHECK-LABEL: gep_recursion_max_lookup_depth_reached
216 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
217 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
218 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
219 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
220 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3
221 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4
222 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5
223 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6
224 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
225 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
226 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
227 ; CHECK-DAG: MayAlias: i32* %gep_rec_3, <vscale x 4 x i32>* %p
228 ; CHECK-DAG: MayAlias: i32* %gep_rec_4, <vscale x 4 x i32>* %p
229 ; CHECK-DAG: MayAlias: i32* %gep_rec_5, <vscale x 4 x i32>* %p
230 ; CHECK-DAG: MayAlias: i32* %gep_rec_6, <vscale x 4 x i32>* %p
231 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
232 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
233 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_3
234 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_4
235 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_5
236 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_6
237 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2
238 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_3
239 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_4
240 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_5
241 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_6
242 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_3
243 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_4
244 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_5
245 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_6
246 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_4
247 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_5
248 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_6
249 ; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_5
250 ; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_6
251 ; CHECK-DAG: NoAlias: i32* %gep_rec_5, i32* %gep_rec_6
252 ; GEP max lookup depth was set to 6.
253 define void @gep_recursion_max_lookup_depth_reached(ptr %a, ptr %p) {
254 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
255 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
256 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1
257 %gep_rec_3 = getelementptr i32, ptr %gep_rec_2, i64 1
258 %gep_rec_4 = getelementptr i32, ptr %gep_rec_3, i64 1
259 %gep_rec_5 = getelementptr i32, ptr %gep_rec_4, i64 1
260 %gep_rec_6 = getelementptr i32, ptr %gep_rec_5, i64 1
261 load <vscale x 4 x i32>, ptr %p
264 load i32, ptr %gep_rec_1
265 load i32, ptr %gep_rec_2
266 load i32, ptr %gep_rec_3
267 load i32, ptr %gep_rec_4
268 load i32, ptr %gep_rec_5
269 load i32, ptr %gep_rec_6