1 ; RUN: opt < %s -basic-aa -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>, <vscale x 4 x i32>* %alloc, i64 0
12 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
16 ; CHECK-LABEL: gep_alloca_const_offset_2
17 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
18 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
19 ; TODO: AliasResult for gep1,gep2 can be improved as MustAlias
20 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
21 define void @gep_alloca_const_offset_2() {
22 %alloc = alloca <vscale x 4 x i32>
23 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
24 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
28 ; CHECK-LABEL: gep_alloca_const_offset_3
29 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
30 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
31 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
32 define void @gep_alloca_const_offset_3() {
33 %alloc = alloca <vscale x 4 x i32>
34 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
35 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 1
39 ; CHECK-LABEL: gep_alloca_const_offset_4
40 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
41 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
42 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
43 define void @gep_alloca_const_offset_4() {
44 %alloc = alloca <vscale x 4 x i32>
45 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
46 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 0
50 ; CHECK-LABEL: gep_alloca_symbolic_offset
51 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
52 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
53 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
54 define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) {
55 %alloc = alloca <vscale x 4 x i32>
56 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx1
57 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx2
61 ; CHECK-LABEL: gep_same_base_const_offset
62 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
63 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2
64 ; TODO: AliasResult for gep1,gep2 can be improved as NoAlias
65 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
66 define void @gep_same_base_const_offset(<vscale x 4 x i32>* %p) {
67 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
68 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 1
72 ; CHECK-LABEL: gep_same_base_symbolic_offset
73 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p
74 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p
75 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
76 define void @gep_same_base_symbolic_offset(<vscale x 4 x i32>* %p, i64 %idx1, i64 %idx2) {
77 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx1
78 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx2
82 ; CHECK-LABEL: gep_different_base_const_offset
83 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1
84 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2
85 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2
86 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2
87 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1
88 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
89 define void @gep_different_base_const_offset(<vscale x 4 x i32>* noalias %p1, <vscale x 4 x i32>* noalias %p2) {
90 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p1, i64 1
91 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p2, i64 1
95 ; getelementptr + bitcast
97 ; CHECK-LABEL: gep_bitcast_1
98 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %p2
99 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
100 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %p2
101 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2
102 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
103 ; CHECK-DAG: NoAlias: i32* %gep2, i32* %p2
104 define void @gep_bitcast_1(<vscale x 4 x i32>* %p) {
105 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
106 %p2 = bitcast <vscale x 4 x i32>* %p to i32*
107 %gep2 = getelementptr i32, i32* %p2, i64 4
111 ; CHECK-LABEL: gep_bitcast_2
112 ; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p2, <vscale x 4 x i32>* %p
113 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
114 ; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, i32* %gep1
115 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, float* %gep2
116 ; CHECK-DAG: MayAlias: float* %gep2, i32* %gep1
117 ; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, float* %gep2
118 define void @gep_bitcast_2(<vscale x 4 x i32>* %p) {
119 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
120 %p2 = bitcast <vscale x 4 x i32>* %p to <vscale x 4 x float>*
121 %gep2 = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %p2, i64 1, i64 0
125 ; getelementptr recursion
127 ; CHECK-LABEL: gep_recursion_level_1
128 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
129 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
130 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
131 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
132 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
133 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1
134 define void @gep_recursion_level_1(i32* %a, <vscale x 4 x i32>* %p) {
135 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
136 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1
140 ; CHECK-LABEL: gep_recursion_level_1_bitcast
141 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %a
142 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
143 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
144 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
145 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
146 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1
147 define void @gep_recursion_level_1_bitcast(i32* %a) {
148 %p = bitcast i32* %a to <vscale x 4 x i32>*
149 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
150 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1
154 ; CHECK-LABEL: gep_recursion_level_2
155 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
156 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
157 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
158 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
159 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
160 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
161 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2
162 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1
163 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_2
164 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_2
165 define void @gep_recursion_level_2(i32* %a, <vscale x 4 x i32>* %p) {
166 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
167 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1
168 %gep_rec_2 = getelementptr i32, i32* %gep_rec_1, i64 1
172 ; CHECK-LABEL: gep_recursion_max_lookup_depth_reached
173 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
174 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
175 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
176 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
177 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3
178 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4
179 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5
180 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6
181 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
182 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
183 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2
184 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_3
185 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_4
186 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_5
187 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_6
188 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1
189 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_2
190 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_3
191 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_4
192 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_5
193 ; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_6
194 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_2
195 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_3
196 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_4
197 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_5
198 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_6
199 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_3
200 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_4
201 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_5
202 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_6
203 ; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_4
204 ; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_5
205 ; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_6
206 ; CHECK-DAG: MayAlias: i32* %gep_rec_4, i32* %gep_rec_5
207 ; CHECK-DAG: MayAlias: i32* %gep_rec_4, i32* %gep_rec_6
208 ; CHECK-DAG: MayAlias: i32* %gep_rec_5, i32* %gep_rec_6
209 ; GEP max lookup depth was set to 6.
210 define void @gep_recursion_max_lookup_depth_reached(i32* %a, <vscale x 4 x i32>* %p) {
211 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
212 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1
213 %gep_rec_2 = getelementptr i32, i32* %gep_rec_1, i64 1
214 %gep_rec_3 = getelementptr i32, i32* %gep_rec_2, i64 1
215 %gep_rec_4 = getelementptr i32, i32* %gep_rec_3, i64 1
216 %gep_rec_5 = getelementptr i32, i32* %gep_rec_4, i64 1
217 %gep_rec_6 = getelementptr i32, i32* %gep_rec_5, i64 1