xref: /llvm-project/llvm/test/Transforms/PhaseOrdering/X86/store-constant-merge.ll (revision 1c55cc600e99a963233d6f467373c8f16a1b8826)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -O3 -S | FileCheck %s
3
4target triple = "x86_64-unknown-linux-gnu"
5
6%struct.data_t = type { [16 x i8] }
7
8declare void @process6data_t(i64, i64)
9declare void @process36data_tS_S_(i64, i64, i64, i64, i64, i64)
10
11; See https://llvm.org/PR47023 for source examples.
12; In all tests, we expect the i8 constant stores to get merged optimally
13; (through SROA, combining, etc.) so that there are no store insts left.
14
15define void @bad1() {
16; CHECK-LABEL: @bad1(
17; CHECK-NEXT:  bb:
18; CHECK-NEXT:    tail call void @process6data_t(i64 21542142465, i64 0)
19; CHECK-NEXT:    ret void
20;
21bb:
22  %i = alloca %struct.data_t, align 1
23  store i8 1, ptr %i, align 1
24  %i3 = getelementptr inbounds i8, ptr %i, i64 1
25  store i8 2, ptr %i3, align 1
26  %i4 = getelementptr inbounds i8, ptr %i3, i64 1
27  store i8 3, ptr %i4, align 1
28  %i5 = getelementptr inbounds i8, ptr %i4, i64 1
29  store i8 4, ptr %i5, align 1
30  %i6 = getelementptr inbounds i8, ptr %i5, i64 1
31  store i8 5, ptr %i6, align 1
32  %i7 = getelementptr inbounds i8, ptr %i6, i64 1
33  %i8 = getelementptr inbounds i8, ptr %i, i64 16
34  br label %bb9
35
36bb9:                                              ; preds = %bb9, %bb
37  %i10 = phi ptr [ %i7, %bb ], [ %i11, %bb9 ]
38  store i8 0, ptr %i10, align 1
39  %i11 = getelementptr inbounds i8, ptr %i10, i64 1
40  %i12 = icmp eq ptr %i11, %i8
41  br i1 %i12, label %bb13, label %bb9
42
43bb13:                                             ; preds = %bb9
44  %i15 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0
45  %i16 = load i64, ptr %i15, align 1
46  %i17 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1
47  %i18 = load i64, ptr %i17, align 1
48  call void @process6data_t(i64 %i16, i64 %i18)
49  ret void
50}
51
52define void @bad2() {
53; CHECK-LABEL: @bad2(
54; CHECK-NEXT:  bb:
55; CHECK-NEXT:    tail call void @process6data_t(i64 216736853120975361, i64 1411785848587524)
56; CHECK-NEXT:    ret void
57;
58bb:
59  %i = alloca %struct.data_t, align 1
60  store i8 1, ptr %i, align 1
61  %i3 = getelementptr inbounds i8, ptr %i, i64 1
62  store i8 2, ptr %i3, align 1
63  %i4 = getelementptr inbounds i8, ptr %i3, i64 1
64  store i8 3, ptr %i4, align 1
65  %i5 = getelementptr inbounds i8, ptr %i4, i64 1
66  store i8 4, ptr %i5, align 1
67  %i6 = getelementptr inbounds i8, ptr %i5, i64 1
68  store i8 5, ptr %i6, align 1
69  %i7 = getelementptr inbounds i8, ptr %i6, i64 1
70  store i8 1, ptr %i7, align 1
71  %i8 = getelementptr inbounds i8, ptr %i7, i64 1
72  store i8 2, ptr %i8, align 1
73  %i9 = getelementptr inbounds i8, ptr %i8, i64 1
74  store i8 3, ptr %i9, align 1
75  %i10 = getelementptr inbounds i8, ptr %i9, i64 1
76  store i8 4, ptr %i10, align 1
77  %i11 = getelementptr inbounds i8, ptr %i10, i64 1
78  store i8 5, ptr %i11, align 1
79  %i12 = getelementptr inbounds i8, ptr %i11, i64 1
80  store i8 1, ptr %i12, align 1
81  %i13 = getelementptr inbounds i8, ptr %i12, i64 1
82  store i8 2, ptr %i13, align 1
83  %i14 = getelementptr inbounds i8, ptr %i13, i64 1
84  store i8 3, ptr %i14, align 1
85  %i15 = getelementptr inbounds i8, ptr %i14, i64 1
86  store i8 4, ptr %i15, align 1
87  %i16 = getelementptr inbounds i8, ptr %i15, i64 1
88  store i8 5, ptr %i16, align 1
89  %i17 = getelementptr inbounds i8, ptr %i16, i64 1
90  %i18 = getelementptr inbounds i8, ptr %i, i64 16
91  br label %bb19
92
93bb19:                                             ; preds = %bb19, %bb
94  %i20 = phi ptr [ %i17, %bb ], [ %i21, %bb19 ]
95  store i8 0, ptr %i20, align 1
96  %i21 = getelementptr inbounds i8, ptr %i20, i64 1
97  %i22 = icmp eq ptr %i21, %i18
98  br i1 %i22, label %bb23, label %bb19
99
100bb23:                                             ; preds = %bb19
101  %i25 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0
102  %i26 = load i64, ptr %i25, align 1
103  %i27 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1
104  %i28 = load i64, ptr %i27, align 1
105  call void @process6data_t(i64 %i26, i64 %i28)
106  ret void
107}
108
109define void @bad3() {
110; CHECK-LABEL: @bad3(
111; CHECK-NEXT:  bb:
112; CHECK-NEXT:    tail call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 5651576002974730)
113; CHECK-NEXT:    ret void
114;
115bb:
116  %i = alloca %struct.data_t, align 1
117  %i1 = alloca %struct.data_t, align 1
118  %i2 = alloca %struct.data_t, align 1
119  store i8 1, ptr %i, align 1
120  %i5 = getelementptr inbounds i8, ptr %i, i64 1
121  store i8 2, ptr %i5, align 1
122  %i6 = getelementptr inbounds i8, ptr %i5, i64 1
123  store i8 3, ptr %i6, align 1
124  %i7 = getelementptr inbounds i8, ptr %i6, i64 1
125  store i8 4, ptr %i7, align 1
126  %i8 = getelementptr inbounds i8, ptr %i7, i64 1
127  store i8 5, ptr %i8, align 1
128  %i9 = getelementptr inbounds i8, ptr %i8, i64 1
129  store i8 0, ptr %i9, align 1
130  %i10 = getelementptr inbounds i8, ptr %i9, i64 1
131  store i8 0, ptr %i10, align 1
132  %i11 = getelementptr inbounds i8, ptr %i10, i64 1
133  store i8 0, ptr %i11, align 1
134  %i12 = getelementptr inbounds i8, ptr %i11, i64 1
135  store i8 0, ptr %i12, align 1
136  %i13 = getelementptr inbounds i8, ptr %i12, i64 1
137  store i8 0, ptr %i13, align 1
138  %i14 = getelementptr inbounds i8, ptr %i13, i64 1
139  store i8 0, ptr %i14, align 1
140  %i15 = getelementptr inbounds i8, ptr %i14, i64 1
141  store i8 0, ptr %i15, align 1
142  %i16 = getelementptr inbounds i8, ptr %i15, i64 1
143  store i8 0, ptr %i16, align 1
144  %i17 = getelementptr inbounds i8, ptr %i16, i64 1
145  store i8 0, ptr %i17, align 1
146  %i18 = getelementptr inbounds i8, ptr %i17, i64 1
147  store i8 0, ptr %i18, align 1
148  %i19 = getelementptr inbounds i8, ptr %i18, i64 1
149  store i8 0, ptr %i19, align 1
150  store i8 11, ptr %i1, align 1
151  %i22 = getelementptr inbounds i8, ptr %i1, i64 1
152  store i8 12, ptr %i22, align 1
153  %i23 = getelementptr inbounds i8, ptr %i22, i64 1
154  store i8 13, ptr %i23, align 1
155  %i24 = getelementptr inbounds i8, ptr %i23, i64 1
156  store i8 14, ptr %i24, align 1
157  %i25 = getelementptr inbounds i8, ptr %i24, i64 1
158  store i8 15, ptr %i25, align 1
159  %i26 = getelementptr inbounds i8, ptr %i25, i64 1
160  store i8 10, ptr %i26, align 1
161  %i27 = getelementptr inbounds i8, ptr %i26, i64 1
162  store i8 10, ptr %i27, align 1
163  %i28 = getelementptr inbounds i8, ptr %i27, i64 1
164  store i8 10, ptr %i28, align 1
165  %i29 = getelementptr inbounds i8, ptr %i28, i64 1
166  store i8 10, ptr %i29, align 1
167  %i30 = getelementptr inbounds i8, ptr %i29, i64 1
168  store i8 10, ptr %i30, align 1
169  %i31 = getelementptr inbounds i8, ptr %i30, i64 1
170  store i8 10, ptr %i31, align 1
171  %i32 = getelementptr inbounds i8, ptr %i31, i64 1
172  store i8 10, ptr %i32, align 1
173  %i33 = getelementptr inbounds i8, ptr %i32, i64 1
174  store i8 10, ptr %i33, align 1
175  %i34 = getelementptr inbounds i8, ptr %i33, i64 1
176  store i8 10, ptr %i34, align 1
177  %i35 = getelementptr inbounds i8, ptr %i34, i64 1
178  store i8 10, ptr %i35, align 1
179  %i36 = getelementptr inbounds i8, ptr %i35, i64 1
180  store i8 10, ptr %i36, align 1
181  store i8 21, ptr %i2, align 1
182  %i39 = getelementptr inbounds i8, ptr %i2, i64 1
183  store i8 22, ptr %i39, align 1
184  %i40 = getelementptr inbounds i8, ptr %i39, i64 1
185  store i8 23, ptr %i40, align 1
186  %i41 = getelementptr inbounds i8, ptr %i40, i64 1
187  store i8 24, ptr %i41, align 1
188  %i42 = getelementptr inbounds i8, ptr %i41, i64 1
189  store i8 25, ptr %i42, align 1
190  %i43 = getelementptr inbounds i8, ptr %i42, i64 1
191  store i8 20, ptr %i43, align 1
192  %i44 = getelementptr inbounds i8, ptr %i43, i64 1
193  store i8 20, ptr %i44, align 1
194  %i45 = getelementptr inbounds i8, ptr %i44, i64 1
195  store i8 20, ptr %i45, align 1
196  %i46 = getelementptr inbounds i8, ptr %i45, i64 1
197  store i8 10, ptr %i46, align 1
198  %i47 = getelementptr inbounds i8, ptr %i46, i64 1
199  store i8 20, ptr %i47, align 1
200  %i48 = getelementptr inbounds i8, ptr %i47, i64 1
201  store i8 20, ptr %i48, align 1
202  %i49 = getelementptr inbounds i8, ptr %i48, i64 1
203  store i8 20, ptr %i49, align 1
204  %i50 = getelementptr inbounds i8, ptr %i49, i64 1
205  store i8 20, ptr %i50, align 1
206  %i51 = getelementptr inbounds i8, ptr %i50, i64 1
207  store i8 20, ptr %i51, align 1
208  %i52 = getelementptr inbounds i8, ptr %i51, i64 1
209  store i8 20, ptr %i52, align 1
210  %i53 = getelementptr inbounds i8, ptr %i52, i64 1
211  %i54 = getelementptr inbounds i8, ptr %i2, i64 16
212  br label %bb55
213
214bb55:                                             ; preds = %bb55, %bb
215  %i56 = phi ptr [ %i53, %bb ], [ %i57, %bb55 ]
216  store i8 0, ptr %i56, align 1
217  %i57 = getelementptr inbounds i8, ptr %i56, i64 1
218  %i58 = icmp eq ptr %i57, %i54
219  br i1 %i58, label %bb59, label %bb55
220
221bb59:                                             ; preds = %bb55
222  %i61 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0
223  %i62 = load i64, ptr %i61, align 1
224  %i63 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1
225  %i64 = load i64, ptr %i63, align 1
226  %i66 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 0
227  %i67 = load i64, ptr %i66, align 1
228  %i68 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 1
229  %i69 = load i64, ptr %i68, align 1
230  %i71 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 0
231  %i72 = load i64, ptr %i71, align 1
232  %i73 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 1
233  %i74 = load i64, ptr %i73, align 1
234  call void @process36data_tS_S_(i64 %i62, i64 %i64, i64 %i67, i64 %i69, i64 %i72, i64 %i74)
235  ret void
236}
237
238define void @bad4() {
239; CHECK-LABEL: @bad4(
240; CHECK-NEXT:  bb:
241; CHECK-NEXT:    tail call void @process36data_tS_S_(i64 21542142465, i64 0, i64 723401749922909195, i64 723401728380766730, i64 1446803478303675925, i64 798285110420182026)
242; CHECK-NEXT:    ret void
243;
244bb:
245  %i = alloca %struct.data_t, align 1
246  %i1 = alloca %struct.data_t, align 1
247  %i2 = alloca %struct.data_t, align 1
248  store i8 1, ptr %i, align 1
249  %i5 = getelementptr inbounds i8, ptr %i, i64 1
250  store i8 2, ptr %i5, align 1
251  %i6 = getelementptr inbounds i8, ptr %i5, i64 1
252  store i8 3, ptr %i6, align 1
253  %i7 = getelementptr inbounds i8, ptr %i6, i64 1
254  store i8 4, ptr %i7, align 1
255  %i8 = getelementptr inbounds i8, ptr %i7, i64 1
256  store i8 5, ptr %i8, align 1
257  %i9 = getelementptr inbounds i8, ptr %i8, i64 1
258  store i8 0, ptr %i9, align 1
259  %i10 = getelementptr inbounds i8, ptr %i9, i64 1
260  store i8 0, ptr %i10, align 1
261  %i11 = getelementptr inbounds i8, ptr %i10, i64 1
262  store i8 0, ptr %i11, align 1
263  %i12 = getelementptr inbounds i8, ptr %i11, i64 1
264  store i8 0, ptr %i12, align 1
265  %i13 = getelementptr inbounds i8, ptr %i12, i64 1
266  store i8 0, ptr %i13, align 1
267  %i14 = getelementptr inbounds i8, ptr %i13, i64 1
268  store i8 0, ptr %i14, align 1
269  %i15 = getelementptr inbounds i8, ptr %i14, i64 1
270  store i8 0, ptr %i15, align 1
271  %i16 = getelementptr inbounds i8, ptr %i15, i64 1
272  store i8 0, ptr %i16, align 1
273  %i17 = getelementptr inbounds i8, ptr %i16, i64 1
274  store i8 0, ptr %i17, align 1
275  %i18 = getelementptr inbounds i8, ptr %i17, i64 1
276  store i8 0, ptr %i18, align 1
277  %i19 = getelementptr inbounds i8, ptr %i18, i64 1
278  store i8 0, ptr %i19, align 1
279  store i8 11, ptr %i1, align 1
280  %i22 = getelementptr inbounds i8, ptr %i1, i64 1
281  store i8 12, ptr %i22, align 1
282  %i23 = getelementptr inbounds i8, ptr %i22, i64 1
283  store i8 13, ptr %i23, align 1
284  %i24 = getelementptr inbounds i8, ptr %i23, i64 1
285  store i8 14, ptr %i24, align 1
286  %i25 = getelementptr inbounds i8, ptr %i24, i64 1
287  store i8 15, ptr %i25, align 1
288  %i26 = getelementptr inbounds i8, ptr %i25, i64 1
289  store i8 10, ptr %i26, align 1
290  %i27 = getelementptr inbounds i8, ptr %i26, i64 1
291  store i8 10, ptr %i27, align 1
292  %i28 = getelementptr inbounds i8, ptr %i27, i64 1
293  store i8 10, ptr %i28, align 1
294  %i29 = getelementptr inbounds i8, ptr %i28, i64 1
295  store i8 10, ptr %i29, align 1
296  %i30 = getelementptr inbounds i8, ptr %i29, i64 1
297  store i8 10, ptr %i30, align 1
298  %i31 = getelementptr inbounds i8, ptr %i30, i64 1
299  store i8 10, ptr %i31, align 1
300  %i32 = getelementptr inbounds i8, ptr %i31, i64 1
301  store i8 10, ptr %i32, align 1
302  %i33 = getelementptr inbounds i8, ptr %i32, i64 1
303  store i8 10, ptr %i33, align 1
304  %i34 = getelementptr inbounds i8, ptr %i33, i64 1
305  store i8 10, ptr %i34, align 1
306  %i35 = getelementptr inbounds i8, ptr %i34, i64 1
307  store i8 10, ptr %i35, align 1
308  %i36 = getelementptr inbounds i8, ptr %i35, i64 1
309  store i8 10, ptr %i36, align 1
310  store i8 21, ptr %i2, align 1
311  %i39 = getelementptr inbounds i8, ptr %i2, i64 1
312  store i8 22, ptr %i39, align 1
313  %i40 = getelementptr inbounds i8, ptr %i39, i64 1
314  store i8 23, ptr %i40, align 1
315  %i41 = getelementptr inbounds i8, ptr %i40, i64 1
316  store i8 24, ptr %i41, align 1
317  %i42 = getelementptr inbounds i8, ptr %i41, i64 1
318  store i8 25, ptr %i42, align 1
319  %i43 = getelementptr inbounds i8, ptr %i42, i64 1
320  store i8 20, ptr %i43, align 1
321  %i44 = getelementptr inbounds i8, ptr %i43, i64 1
322  store i8 20, ptr %i44, align 1
323  %i45 = getelementptr inbounds i8, ptr %i44, i64 1
324  store i8 20, ptr %i45, align 1
325  %i46 = getelementptr inbounds i8, ptr %i45, i64 1
326  store i8 10, ptr %i46, align 1
327  %i47 = getelementptr inbounds i8, ptr %i46, i64 1
328  store i8 20, ptr %i47, align 1
329  %i48 = getelementptr inbounds i8, ptr %i47, i64 1
330  store i8 20, ptr %i48, align 1
331  %i49 = getelementptr inbounds i8, ptr %i48, i64 1
332  store i8 20, ptr %i49, align 1
333  %i50 = getelementptr inbounds i8, ptr %i49, i64 1
334  store i8 20, ptr %i50, align 1
335  %i51 = getelementptr inbounds i8, ptr %i50, i64 1
336  store i8 20, ptr %i51, align 1
337  %i52 = getelementptr inbounds i8, ptr %i51, i64 1
338  store i8 20, ptr %i52, align 1
339  %i53 = getelementptr inbounds i8, ptr %i52, i64 1
340  store i8 11, ptr %i53, align 1
341  %i55 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 0
342  %i56 = load i64, ptr %i55, align 1
343  %i57 = getelementptr inbounds { i64, i64 }, ptr %i, i32 0, i32 1
344  %i58 = load i64, ptr %i57, align 1
345  %i60 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 0
346  %i61 = load i64, ptr %i60, align 1
347  %i62 = getelementptr inbounds { i64, i64 }, ptr %i1, i32 0, i32 1
348  %i63 = load i64, ptr %i62, align 1
349  %i65 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 0
350  %i66 = load i64, ptr %i65, align 1
351  %i67 = getelementptr inbounds { i64, i64 }, ptr %i2, i32 0, i32 1
352  %i68 = load i64, ptr %i67, align 1
353  call void @process36data_tS_S_(i64 %i56, i64 %i58, i64 %i61, i64 %i63, i64 %i66, i64 %i68)
354  ret void
355}
356