xref: /aosp_15_r20/external/llvm/test/Analysis/BasicAA/struct-geps.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%struct = type { i32, i32, i32 }
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_simple
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %x
10*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %y
11*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i32* %z
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y
14*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z
15*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, %struct* %y_12
18*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %st, i64* %y_8
22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine void @test_simple(%struct* %st, i64 %i, i64 %j, i64 %k) {
30*9880d681SAndroid Build Coastguard Worker  %x = getelementptr %struct, %struct* %st, i64 %i, i32 0
31*9880d681SAndroid Build Coastguard Worker  %y = getelementptr %struct, %struct* %st, i64 %j, i32 1
32*9880d681SAndroid Build Coastguard Worker  %z = getelementptr %struct, %struct* %st, i64 %k, i32 2
33*9880d681SAndroid Build Coastguard Worker  %y_12 = bitcast i32* %y to %struct*
34*9880d681SAndroid Build Coastguard Worker  %y_10 = bitcast i32* %y to i80*
35*9880d681SAndroid Build Coastguard Worker  %y_8 = bitcast i32* %y to i64*
36*9880d681SAndroid Build Coastguard Worker  ret void
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_in_array
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %x
42*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %y
43*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i32* %z
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y
46*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z
47*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x %struct]* %st
50*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x %struct]* %st, i64* %y_8
54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
55*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine void @test_in_array([1 x %struct]* %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1) {
62*9880d681SAndroid Build Coastguard Worker  %x = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %i, i64 %i1, i32 0
63*9880d681SAndroid Build Coastguard Worker  %y = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %j, i64 %j1, i32 1
64*9880d681SAndroid Build Coastguard Worker  %z = getelementptr [1 x %struct], [1 x %struct]* %st, i64 %k, i64 %k1, i32 2
65*9880d681SAndroid Build Coastguard Worker  %y_12 = bitcast i32* %y to %struct*
66*9880d681SAndroid Build Coastguard Worker  %y_10 = bitcast i32* %y to i80*
67*9880d681SAndroid Build Coastguard Worker  %y_8 = bitcast i32* %y to i64*
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_in_3d_array
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %x
74*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %y
75*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i32* %z
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %y
78*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %z
79*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %z
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, [1 x [1 x [1 x %struct]]]* %st
82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: %struct* %y_12, i32* %x
83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i80* %y_10
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: [1 x [1 x [1 x %struct]]]* %st, i64* %y_8
86*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i64* %y_8
87*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i64* %y_8
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: %struct* %y_12, i32* %y
90*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i64* %y_8
91*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %y, i80* %y_10
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine void @test_in_3d_array([1 x [1 x [1 x %struct]]]* %st, i64 %i, i64 %j, i64 %k, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %j2, i64 %k2, i64 %i3, i64 %j3, i64 %k3) {
94*9880d681SAndroid Build Coastguard Worker  %x = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %i, i64 %i1, i64 %i2, i64 %i3, i32 0
95*9880d681SAndroid Build Coastguard Worker  %y = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %j, i64 %j1, i64 %j2, i64 %j3, i32 1
96*9880d681SAndroid Build Coastguard Worker  %z = getelementptr [1 x [1 x [1 x %struct]]], [1 x [1 x [1 x %struct]]]* %st, i64 %k, i64 %k1, i64 %k2, i64 %k3, i32 2
97*9880d681SAndroid Build Coastguard Worker  %y_12 = bitcast i32* %y to %struct*
98*9880d681SAndroid Build Coastguard Worker  %y_10 = bitcast i32* %y to i80*
99*9880d681SAndroid Build Coastguard Worker  %y_8 = bitcast i32* %y to i64*
100*9880d681SAndroid Build Coastguard Worker  ret void
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_same_underlying_object_same_indices
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %x, i32* %x2
106*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %y, i32* %y2
107*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: NoAlias: i32* %z, i32* %z2
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %y2
110*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %z2
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %y
113*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %z2
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %z
116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y2, i32* %z
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine void @test_same_underlying_object_same_indices(%struct* %st, i64 %i, i64 %j, i64 %k) {
119*9880d681SAndroid Build Coastguard Worker  %st2 = getelementptr %struct, %struct* %st, i32 10
120*9880d681SAndroid Build Coastguard Worker  %x2 = getelementptr %struct, %struct* %st2, i64 %i, i32 0
121*9880d681SAndroid Build Coastguard Worker  %y2 = getelementptr %struct, %struct* %st2, i64 %j, i32 1
122*9880d681SAndroid Build Coastguard Worker  %z2 = getelementptr %struct, %struct* %st2, i64 %k, i32 2
123*9880d681SAndroid Build Coastguard Worker  %x = getelementptr %struct, %struct* %st, i64 %i, i32 0
124*9880d681SAndroid Build Coastguard Worker  %y = getelementptr %struct, %struct* %st, i64 %j, i32 1
125*9880d681SAndroid Build Coastguard Worker  %z = getelementptr %struct, %struct* %st, i64 %k, i32 2
126*9880d681SAndroid Build Coastguard Worker  ret void
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_same_underlying_object_different_indices
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %x2
132*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %y2
133*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %z, i32* %z2
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %y2
136*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x, i32* %z2
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %y
139*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y, i32* %z2
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %x2, i32* %z
142*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: PartialAlias: i32* %y2, i32* %z
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine void @test_same_underlying_object_different_indices(%struct* %st, i64 %i1, i64 %j1, i64 %k1, i64 %i2, i64 %k2, i64 %j2) {
145*9880d681SAndroid Build Coastguard Worker  %st2 = getelementptr %struct, %struct* %st, i32 10
146*9880d681SAndroid Build Coastguard Worker  %x2 = getelementptr %struct, %struct* %st2, i64 %i2, i32 0
147*9880d681SAndroid Build Coastguard Worker  %y2 = getelementptr %struct, %struct* %st2, i64 %j2, i32 1
148*9880d681SAndroid Build Coastguard Worker  %z2 = getelementptr %struct, %struct* %st2, i64 %k2, i32 2
149*9880d681SAndroid Build Coastguard Worker  %x = getelementptr %struct, %struct* %st, i64 %i1, i32 0
150*9880d681SAndroid Build Coastguard Worker  %y = getelementptr %struct, %struct* %st, i64 %j1, i32 1
151*9880d681SAndroid Build Coastguard Worker  %z = getelementptr %struct, %struct* %st, i64 %k1, i32 2
152*9880d681SAndroid Build Coastguard Worker  ret void
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker%struct2 = type { [1 x { i32, i32 }], [2 x { i32 }] }
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_struct_in_array
159*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: MustAlias: i32* %x, i32* %y
160*9880d681SAndroid Build Coastguard Workerdefine void @test_struct_in_array(%struct2* %st, i64 %i, i64 %j, i64 %k) {
161*9880d681SAndroid Build Coastguard Worker  %x = getelementptr %struct2, %struct2* %st, i32 0, i32 1, i32 1, i32 0
162*9880d681SAndroid Build Coastguard Worker  %y = getelementptr %struct2, %struct2* %st, i32 0, i32 0, i32 1, i32 1
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; PR27418 - Treat GEP indices with the same value but different types the same
167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_different_index_types
168*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i16* %tmp1, i16* %tmp2
169*9880d681SAndroid Build Coastguard Workerdefine void @test_different_index_types([2 x i16]* %arr) {
170*9880d681SAndroid Build Coastguard Worker  %tmp1 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i32 1
171*9880d681SAndroid Build Coastguard Worker  %tmp2 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i16 1
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174