[AMDGPU] Add True16 register classes.
[llvm-project.git] / llvm / test / Transforms / GlobalOpt / sra-many-stores-initializers.ll
blob9c85f3b34247085cb9930c39425d7955d3999624
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
2 ; RUN: opt -passes=globalopt -S %s | FileCheck %s
4 %struct.20ptr = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
6 @global.20ptr = internal global %struct.20ptr zeroinitializer
8 @c = global ptr null
11 ; CHECK: @[[C:[a-zA-Z0-9_$"\\.-]+]] = global ptr null
12 ; CHECK: @[[GLOBAL_20PTR_3:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [[STRUCT_20PTR:%.*]] { ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr null, ptr null, ptr null, ptr @c }
13 ; CHECK: @[[GLOBAL_20PTR_4_16:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global ptr null
15 define void @store_initializer() {
16 ; CHECK-LABEL: @store_initializer(
17 ; CHECK-NEXT:  entry:
18 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
19 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
20 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
21 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
22 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
23 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
24 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
25 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
26 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
27 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
28 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
29 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
30 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
31 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
32 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
33 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
34 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
35 ; CHECK-NEXT:    ret void
37 entry:
38   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 0), align 8
39   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 1), align 8
40   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 2), align 8
41   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 3), align 8
42   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 4), align 8
43   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 5), align 8
44   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 6), align 8
45   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 7), align 8
46   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 8), align 8
47   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 9), align 8
48   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 10), align 8
49   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 11), align 8
50   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 12), align 8
51   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 13), align 8
52   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 14), align 8
53   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 15), align 8
54   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 16), align 8
56   %l0 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 0), align 8
57   store volatile ptr %l0, ptr @c
58   %l1 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 1), align 8
59   store volatile ptr %l1, ptr @c
60   %l2 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 2), align 8
61   store volatile ptr %l2, ptr @c
62   %l3 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 3), align 8
63   store volatile ptr %l3, ptr @c
64   %l4 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 4), align 8
65   store volatile ptr %l4, ptr @c
66   %l5 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 5), align 8
67   store volatile ptr %l5, ptr @c
68   %l6 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 6), align 8
69   store volatile ptr %l6, ptr @c
70   %l7 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 7), align 8
71   store volatile ptr %l7, ptr @c
72   %l8 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 8), align 8
73   store volatile ptr %l8, ptr @c
74   %l9 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 9), align 8
75   store volatile ptr %l9, ptr @c
76   %l10 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 10), align 8
77   store volatile ptr %l10, ptr @c
78   %l11 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 11), align 8
79   store volatile ptr %l11, ptr @c
80   %l12 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 12), align 8
81   store volatile ptr %l12, ptr @c
82   %l13 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 13), align 8
83   store volatile ptr %l13, ptr @c
84   %l14 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 14), align 8
85   store volatile ptr %l14, ptr @c
86   %l15 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 15), align 8
87   store volatile ptr %l15, ptr @c
88   %l16 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 16), align 8
89   store volatile ptr %l16, ptr @c
91   ret void
94 ; Global with initializer where some elements in the initializer are not null.
96 @global.20ptr.2 = internal global %struct.20ptr { ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr null, ptr @c }
98 define void @store_null_initializer_2() {
99 ; CHECK-LABEL: @store_null_initializer_2(
100 ; CHECK-NEXT:  entry:
101 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
102 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
103 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
104 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
105 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
106 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
107 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
108 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
109 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
110 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
111 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
112 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
113 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
114 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
115 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
116 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
117 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
118 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
119 ; CHECK-NEXT:    ret void
121 entry:
122   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 0), align 8
123   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 1), align 8
124   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 2), align 8
125   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 3), align 8
126   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 4), align 8
127   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 5), align 8
128   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 6), align 8
129   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 7), align 8
130   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 8), align 8
131   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 9), align 8
132   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 10), align 8
133   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 11), align 8
134   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 12), align 8
135   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 13), align 8
136   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 14), align 8
137   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 15), align 8
138   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 16), align 8
139   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 19), align 8
141   %l0 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 0), align 8
142   store volatile ptr %l0, ptr @c
143   %l1 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 1), align 8
144   store volatile ptr %l1, ptr @c
145   %l2 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 2), align 8
146   store volatile ptr %l2, ptr @c
147   %l3 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 3), align 8
148   store volatile ptr %l3, ptr @c
149   %l4 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 4), align 8
150   store volatile ptr %l4, ptr @c
151   %l5 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 5), align 8
152   store volatile ptr %l5, ptr @c
153   %l6 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 6), align 8
154   store volatile ptr %l6, ptr @c
155   %l7 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 7), align 8
156   store volatile ptr %l7, ptr @c
157   %l8 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 8), align 8
158   store volatile ptr %l8, ptr @c
159   %l9 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 9), align 8
160   store volatile ptr %l9, ptr @c
161   %l10 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 10), align 8
162   store volatile ptr %l10, ptr @c
163   %l11 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 11), align 8
164   store volatile ptr %l11, ptr @c
165   %l12 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 12), align 8
166   store volatile ptr %l12, ptr @c
167   %l13 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 13), align 8
168   store volatile ptr %l13, ptr @c
169   %l14 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 14), align 8
170   store volatile ptr %l14, ptr @c
171   %l15 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 15), align 8
172   store volatile ptr %l15, ptr @c
173   %l16 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 16), align 8
174   store volatile ptr %l16, ptr @c
175   %l19 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.2, i64 0, i32 19), align 8
176   store volatile ptr %l19, ptr @c
178   ret void
182 @global.20ptr.3 = internal global %struct.20ptr { ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr null, ptr null, ptr null, ptr @c }
184 ; Stores writing a different value than the initializer.
185 define void @store_mixed_initializer_negative() {
186 ; CHECK-LABEL: @store_mixed_initializer_negative(
187 ; CHECK-NEXT:  entry:
188 ; CHECK-NEXT:    store ptr null, ptr @global.20ptr.3, align 8
189 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR:%.*]], ptr @global.20ptr.3, i64 0, i32 1), align 8
190 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 2), align 8
191 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 3), align 8
192 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 4), align 8
193 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 5), align 8
194 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 6), align 8
195 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 7), align 8
196 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 8), align 8
197 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 9), align 8
198 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 10), align 8
199 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 11), align 8
200 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 12), align 8
201 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 13), align 8
202 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 14), align 8
203 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 15), align 8
204 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 16), align 8
205 ; CHECK-NEXT:    store ptr null, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 19), align 8
206 ; CHECK-NEXT:    [[L0:%.*]] = load ptr, ptr @global.20ptr.3, align 8
207 ; CHECK-NEXT:    store volatile ptr [[L0]], ptr @c, align 8
208 ; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 1), align 8
209 ; CHECK-NEXT:    store volatile ptr [[L1]], ptr @c, align 8
210 ; CHECK-NEXT:    [[L2:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 2), align 8
211 ; CHECK-NEXT:    store volatile ptr [[L2]], ptr @c, align 8
212 ; CHECK-NEXT:    [[L3:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 3), align 8
213 ; CHECK-NEXT:    store volatile ptr [[L3]], ptr @c, align 8
214 ; CHECK-NEXT:    [[L4:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 4), align 8
215 ; CHECK-NEXT:    store volatile ptr [[L4]], ptr @c, align 8
216 ; CHECK-NEXT:    [[L5:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 5), align 8
217 ; CHECK-NEXT:    store volatile ptr [[L5]], ptr @c, align 8
218 ; CHECK-NEXT:    [[L6:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 6), align 8
219 ; CHECK-NEXT:    store volatile ptr [[L6]], ptr @c, align 8
220 ; CHECK-NEXT:    [[L7:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 7), align 8
221 ; CHECK-NEXT:    store volatile ptr [[L7]], ptr @c, align 8
222 ; CHECK-NEXT:    [[L8:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 8), align 8
223 ; CHECK-NEXT:    store volatile ptr [[L8]], ptr @c, align 8
224 ; CHECK-NEXT:    [[L9:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 9), align 8
225 ; CHECK-NEXT:    store volatile ptr [[L9]], ptr @c, align 8
226 ; CHECK-NEXT:    [[L10:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 10), align 8
227 ; CHECK-NEXT:    store volatile ptr [[L10]], ptr @c, align 8
228 ; CHECK-NEXT:    [[L11:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 11), align 8
229 ; CHECK-NEXT:    store volatile ptr [[L11]], ptr @c, align 8
230 ; CHECK-NEXT:    [[L12:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 12), align 8
231 ; CHECK-NEXT:    store volatile ptr [[L12]], ptr @c, align 8
232 ; CHECK-NEXT:    [[L13:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 13), align 8
233 ; CHECK-NEXT:    store volatile ptr [[L13]], ptr @c, align 8
234 ; CHECK-NEXT:    [[L14:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 14), align 8
235 ; CHECK-NEXT:    store volatile ptr [[L14]], ptr @c, align 8
236 ; CHECK-NEXT:    [[L15:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 15), align 8
237 ; CHECK-NEXT:    store volatile ptr [[L15]], ptr @c, align 8
238 ; CHECK-NEXT:    [[L16:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 16), align 8
239 ; CHECK-NEXT:    store volatile ptr [[L16]], ptr @c, align 8
240 ; CHECK-NEXT:    [[L19:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr.3, i64 0, i32 19), align 8
241 ; CHECK-NEXT:    store volatile ptr [[L19]], ptr @c, align 8
242 ; CHECK-NEXT:    ret void
244 entry:
245   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 0), align 8
246   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 1), align 8
247   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 2), align 8
248   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 3), align 8
249   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 4), align 8
250   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 5), align 8
251   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 6), align 8
252   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 7), align 8
253   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 8), align 8
254   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 9), align 8
255   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 10), align 8
256   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 11), align 8
257   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 12), align 8
258   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 13), align 8
259   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 14), align 8
260   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 15), align 8
261   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 16), align 8
262   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 19), align 8
264   %l0 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 0), align 8
265   store volatile ptr %l0, ptr @c
266   %l1 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 1), align 8
267   store volatile ptr %l1, ptr @c
268   %l2 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 2), align 8
269   store volatile ptr %l2, ptr @c
270   %l3 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 3), align 8
271   store volatile ptr %l3, ptr @c
272   %l4 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 4), align 8
273   store volatile ptr %l4, ptr @c
274   %l5 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 5), align 8
275   store volatile ptr %l5, ptr @c
276   %l6 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 6), align 8
277   store volatile ptr %l6, ptr @c
278   %l7 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 7), align 8
279   store volatile ptr %l7, ptr @c
280   %l8 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 8), align 8
281   store volatile ptr %l8, ptr @c
282   %l9 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 9), align 8
283   store volatile ptr %l9, ptr @c
284   %l10 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 10), align 8
285   store volatile ptr %l10, ptr @c
286   %l11 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 11), align 8
287   store volatile ptr %l11, ptr @c
288   %l12 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 12), align 8
289   store volatile ptr %l12, ptr @c
290   %l13 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 13), align 8
291   store volatile ptr %l13, ptr @c
292   %l14 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 14), align 8
293   store volatile ptr %l14, ptr @c
294   %l15 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 15), align 8
295   store volatile ptr %l15, ptr @c
296   %l16 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 16), align 8
297   store volatile ptr %l16, ptr @c
298   %l19 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.3, i64 0, i32 19), align 8
299   store volatile ptr %l19, ptr @c
301   ret void
305 @global.20ptr.4 = internal global %struct.20ptr { ptr null, ptr null, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr null, ptr null, ptr null, ptr @c }
307 ; Stores writing a different value than the initializer.
308 define void @store_mixed_initializer() {
309 ; CHECK-LABEL: @store_mixed_initializer(
310 ; CHECK-NEXT:  entry:
311 ; CHECK-NEXT:    store ptr @c, ptr @global.20ptr.4.16, align 8
312 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
313 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
314 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
315 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
316 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
317 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
318 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
319 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
320 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
321 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
322 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
323 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
324 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
325 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
326 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
327 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
328 ; CHECK-NEXT:    [[L16:%.*]] = load ptr, ptr @global.20ptr.4.16, align 8
329 ; CHECK-NEXT:    store volatile ptr [[L16]], ptr @c, align 8
330 ; CHECK-NEXT:    ret void
332 entry:
333   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 0), align 8
334   store ptr null, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 1), align 8
335   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 2), align 8
336   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 3), align 8
337   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 4), align 8
338   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 5), align 8
339   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 6), align 8
340   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 7), align 8
341   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 8), align 8
342   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 9), align 8
343   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 10), align 8
344   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 11), align 8
345   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 12), align 8
346   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 13), align 8
347   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 14), align 8
348   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 15), align 8
349   store ptr @c, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 16), align 8
351   %l0 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 0), align 8
352   store volatile ptr %l0, ptr @c
353   %l1 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 1), align 8
354   store volatile ptr %l1, ptr @c
355   %l2 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 2), align 8
356   store volatile ptr %l2, ptr @c
357   %l3 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 3), align 8
358   store volatile ptr %l3, ptr @c
359   %l4 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 4), align 8
360   store volatile ptr %l4, ptr @c
361   %l5 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 5), align 8
362   store volatile ptr %l5, ptr @c
363   %l6 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 6), align 8
364   store volatile ptr %l6, ptr @c
365   %l7 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 7), align 8
366   store volatile ptr %l7, ptr @c
367   %l8 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 8), align 8
368   store volatile ptr %l8, ptr @c
369   %l9 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 9), align 8
370   store volatile ptr %l9, ptr @c
371   %l10 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 10), align 8
372   store volatile ptr %l10, ptr @c
373   %l11 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 11), align 8
374   store volatile ptr %l11, ptr @c
375   %l12 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 12), align 8
376   store volatile ptr %l12, ptr @c
377   %l13 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 13), align 8
378   store volatile ptr %l13, ptr @c
379   %l14 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 14), align 8
380   store volatile ptr %l14, ptr @c
381   %l15 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 15), align 8
382   store volatile ptr %l15, ptr @c
383   %l16 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 16), align 8
384   store volatile ptr %l16, ptr @c
386   ret void
389 ; Same as @store_mixed_initializer, but the GEP constant expressions are not
390 ; inbounds.
391 define void @store_mixed_initializer_geps_without_inbounds() {
392 ; CHECK-LABEL: @store_mixed_initializer_geps_without_inbounds(
393 ; CHECK-NEXT:  entry:
394 ; CHECK-NEXT:    store ptr @c, ptr @global.20ptr.4.16, align 8
395 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
396 ; CHECK-NEXT:    store volatile ptr null, ptr @c, align 8
397 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
398 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
399 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
400 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
401 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
402 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
403 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
404 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
405 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
406 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
407 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
408 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
409 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
410 ; CHECK-NEXT:    store volatile ptr @c, ptr @c, align 8
411 ; CHECK-NEXT:    [[L16:%.*]] = load ptr, ptr @global.20ptr.4.16, align 8
412 ; CHECK-NEXT:    store volatile ptr [[L16]], ptr @c, align 8
413 ; CHECK-NEXT:    ret void
415 entry:
416   store ptr null, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 0), align 8
417   store ptr null, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 1), align 8
418   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 2), align 8
419   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 3), align 8
420   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 4), align 8
421   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 5), align 8
422   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 6), align 8
423   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 7), align 8
424   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 8), align 8
425   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 9), align 8
426   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 10), align 8
427   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 11), align 8
428   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 12), align 8
429   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 13), align 8
430   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 14), align 8
431   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 15), align 8
432   store ptr @c, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 16), align 8
434   %l0 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 0), align 8
435   store volatile ptr %l0, ptr @c
436   %l1 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 1), align 8
437   store volatile ptr %l1, ptr @c
438   %l2 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 2), align 8
439   store volatile ptr %l2, ptr @c
440   %l3 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 3), align 8
441   store volatile ptr %l3, ptr @c
442   %l4 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 4), align 8
443   store volatile ptr %l4, ptr @c
444   %l5 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 5), align 8
445   store volatile ptr %l5, ptr @c
446   %l6 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 6), align 8
447   store volatile ptr %l6, ptr @c
448   %l7 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 7), align 8
449   store volatile ptr %l7, ptr @c
450   %l8 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 8), align 8
451   store volatile ptr %l8, ptr @c
452   %l9 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 9), align 8
453   store volatile ptr %l9, ptr @c
454   %l10 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 10), align 8
455   store volatile ptr %l10, ptr @c
456   %l11 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 11), align 8
457   store volatile ptr %l11, ptr @c
458   %l12 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 12), align 8
459   store volatile ptr %l12, ptr @c
460   %l13 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 13), align 8
461   store volatile ptr %l13, ptr @c
462   %l14 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 14), align 8
463   store volatile ptr %l14, ptr @c
464   %l15 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 15), align 8
465   store volatile ptr %l15, ptr @c
466   %l16 = load ptr, ptr getelementptr (%struct.20ptr, ptr @global.20ptr.4, i64 0, i32 16), align 8
467   store volatile ptr %l16, ptr @c
469   ret void