• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -basic-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2
3; getelementptr
4
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
9define 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
14}
15
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
21define 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
26}
27
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
32define 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
37}
38
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
43define 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
48}
49
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
54define 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
59}
60
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
66define 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
70}
71
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
76define 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
80}
81
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
89define 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
93}
94
95; getelementptr + bitcast
96
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
104define 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
109}
110
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
118define 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
123}
124
125; getelementptr recursion
126
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
134define 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
138}
139
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
147define 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
152}
153
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
165define 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
170}
171
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.
210define 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
219}
220