xref: /llvm-project/llvm/test/Transforms/GlobalOpt/sra-many-stores-initializers.ll (revision 2d69827c5c754f0eca98e497ecf0e52ed54b4fd3)
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
3
4%struct.20ptr = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
5
6@global.20ptr = internal global %struct.20ptr zeroinitializer
7
8@c = global ptr null
9
10;.
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
14;.
15define 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
36;
37entry:
38  store ptr null, ptr @global.20ptr, 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
55
56  %l0 = load ptr, ptr @global.20ptr, 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
90
91  ret void
92}
93
94; Global with initializer where some elements in the initializer are not null.
95
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 }
97
98define 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
120;
121entry:
122  store ptr null, ptr @global.20ptr.2, 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
140
141  %l0 = load ptr, ptr @global.20ptr.2, 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
177
178  ret void
179}
180
181
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 }
183
184; Stores writing a different value than the initializer.
185define 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
243;
244entry:
245  store ptr null, ptr @global.20ptr.3, 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
263
264  %l0 = load ptr, ptr @global.20ptr.3, 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
300
301  ret void
302}
303
304
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 }
306
307; Stores writing a different value than the initializer.
308define 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
331;
332entry:
333  store ptr null, ptr @global.20ptr.4, 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
350
351  %l0 = load ptr, ptr @global.20ptr.4, 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
385
386  ret void
387}
388
389; Same as @store_mixed_initializer, but the GEP constant expressions are not
390; inbounds.
391define 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
414;
415entry:
416  store ptr null, ptr @global.20ptr.4, 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
433
434  %l0 = load ptr, ptr @global.20ptr.4, 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
468
469  ret void
470}
471