Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Analysis / BasicAA / vscale.ll
blob0d6d8fea392bbfc15d6e800a2a0c012110467322
1 ; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
3 ; getelementptr
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
16   ret void
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
31   ret void
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
44   load i32, ptr %gep2
45   ret void
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
58   load i32, ptr %gep2
59   ret void
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
73   ret void
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
85   load i32, ptr %gep1
86   load i32, ptr %gep2
87   ret void
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
100   ret void
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
117   ret void
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
133   load i32, ptr %gep1
134   load i32, ptr %gep2
135   load i32, ptr %p
136   ret void
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
149   load i32, ptr %gep1
150   load float, ptr %gep2
151   load <vscale x 4 x i32>, ptr %p
152   load <vscale x 4 x float>, ptr %p
153   ret void
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
169   load i32, ptr %a
170   load i32, ptr %gep
171   load i32, ptr %gep_rec_1
172   ret void
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
186   load i32, ptr %a
187   load i32, ptr %gep
188   load i32, ptr %gep_rec_1
189   ret void
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
208   load i32, ptr %a
209   load i32, ptr %gep
210   load i32, ptr %gep_rec_1
211   load i32, ptr %gep_rec_2
212   ret void
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
262   load i32, ptr %a
263   load i32, ptr %gep
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
270   ret void