[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Analysis / BasicAA / vscale.ll
blobecd3091e92fb07ec8699d9440f5e161142196279
1 ; RUN: opt < %s -basic-aa -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>, <vscale x 4 x i32>* %alloc, i64 0
12   %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
13   ret void
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
25   ret void
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
36   ret void
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
47   ret void
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
58   ret void
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
69   ret void
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
79   ret void
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
92   ret void
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
108   ret void
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
122   ret void
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
137   ret void
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
151   ret void
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
169   ret void
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
218   ret void