[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / split-offsets-for-stp.ll
blob2c2d72ce6afd0794cef6d7cdbe35aac98b78e35d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=aarch64-apple-ios -verify-machineinstrs -global-isel -aarch64-enable-sink-fold=true -aarch64-postlegalizer-consecutive-memops=0 < %s | FileCheck %s --check-prefix=CHECK-NO-SPLIT
3 ; RUN: llc -mtriple=aarch64-apple-ios -verify-machineinstrs -global-isel -aarch64-enable-sink-fold=true < %s | FileCheck %s --check-prefix=CHECK-SPLIT
5 define void @basic_split(ptr %p) {
6 ; CHECK-NO-SPLIT-LABEL: basic_split:
7 ; CHECK-NO-SPLIT:       ; %bb.0:
8 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
9 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8008]
10 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
11 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8024]
12 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8032]
13 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8040]
14 ; CHECK-NO-SPLIT-NEXT:    ret
16 ; CHECK-SPLIT-LABEL: basic_split:
17 ; CHECK-SPLIT:       ; %bb.0:
18 ; CHECK-SPLIT-NEXT:    mov w8, #8000 ; =0x1f40
19 ; CHECK-SPLIT-NEXT:    add x8, x0, x8
20 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8]
21 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #16]
22 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #32]
23 ; CHECK-SPLIT-NEXT:    ret
24   %bigoffset = getelementptr i64, ptr %p, i64 1000
25   store i64 0, ptr %bigoffset
26   %addr2 = getelementptr i64, ptr %p, i64 1001
27   store i64 0, ptr %addr2
28   %addr3 = getelementptr i64, ptr %p, i64 1002
29   store i64 0, ptr %addr3
30   %addr4 = getelementptr i64, ptr %p, i64 1003
31   store i64 0, ptr %addr4
32   %addr5 = getelementptr i64, ptr %p, i64 1004
33   store i64 0, ptr %addr5
34   %addr6 = getelementptr i64, ptr %p, i64 1005
35   store i64 0, ptr %addr6
36   ret void
39 define void @basic_multi_use_ptr(ptr %p, ptr %p2) {
40 ; CHECK-NO-SPLIT-LABEL: basic_multi_use_ptr:
41 ; CHECK-NO-SPLIT:       ; %bb.0:
42 ; CHECK-NO-SPLIT-NEXT:    mov w8, #8008 ; =0x1f48
43 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
44 ; CHECK-NO-SPLIT-NEXT:    add x8, x0, x8
45 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8008]
46 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
47 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8024]
48 ; CHECK-NO-SPLIT-NEXT:    str x8, [x1]
49 ; CHECK-NO-SPLIT-NEXT:    ret
51 ; CHECK-SPLIT-LABEL: basic_multi_use_ptr:
52 ; CHECK-SPLIT:       ; %bb.0:
53 ; CHECK-SPLIT-NEXT:    mov w8, #8008 ; =0x1f48
54 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8000]
55 ; CHECK-SPLIT-NEXT:    add x8, x0, x8
56 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8008]
57 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8016]
58 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8024]
59 ; CHECK-SPLIT-NEXT:    str x8, [x1]
60 ; CHECK-SPLIT-NEXT:    ret
61   %bigoffset = getelementptr i64, ptr %p, i64 1000
62   store i64 0, ptr %bigoffset
63   %addr2 = getelementptr i64, ptr %p, i64 1001
64   store i64 0, ptr %addr2
65   %addr3 = getelementptr i64, ptr %p, i64 1002
66   store i64 0, ptr %addr3
67   %addr4 = getelementptr i64, ptr %p, i64 1003
68   store i64 0, ptr %addr4
69   ; multiuse of %addr2
70   store ptr %addr2, ptr %p2
71   ret void
74 define void @not_consecutive(ptr %p) {
75 ; CHECK-NO-SPLIT-LABEL: not_consecutive:
76 ; CHECK-NO-SPLIT:       ; %bb.0:
77 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
78 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8008]
79 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8024]
80 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8032]
81 ; CHECK-NO-SPLIT-NEXT:    ret
83 ; CHECK-SPLIT-LABEL: not_consecutive:
84 ; CHECK-SPLIT:       ; %bb.0:
85 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8000]
86 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8008]
87 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8024]
88 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8032]
89 ; CHECK-SPLIT-NEXT:    ret
90   %bigoffset = getelementptr i64, ptr %p, i64 1000
91   store i64 0, ptr %bigoffset
92   %addr2 = getelementptr i64, ptr %p, i64 1001
93   store i64 0, ptr %addr2
94   %addr3 = getelementptr i64, ptr %p, i64 1003
95   store i64 0, ptr %addr3
96   %addr4 = getelementptr i64, ptr %p, i64 1004
97   store i64 0, ptr %addr4
98   ret void
101 define void @early_store_is_invalid_but_split_rest(ptr %p) {
102 ; CHECK-NO-SPLIT-LABEL: early_store_is_invalid_but_split_rest:
103 ; CHECK-NO-SPLIT:       ; %bb.0:
104 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
105 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8080]
106 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
107 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8024]
108 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8032]
109 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8040]
110 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8048]
111 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8056]
112 ; CHECK-NO-SPLIT-NEXT:    ret
114 ; CHECK-SPLIT-LABEL: early_store_is_invalid_but_split_rest:
115 ; CHECK-SPLIT:       ; %bb.0:
116 ; CHECK-SPLIT-NEXT:    mov w8, #8016 ; =0x1f50
117 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8000]
118 ; CHECK-SPLIT-NEXT:    add x8, x0, x8
119 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8080]
120 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8]
121 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #16]
122 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #32]
123 ; CHECK-SPLIT-NEXT:    ret
124   %bigoffset = getelementptr i64, ptr %p, i64 1000
125   store i64 0, ptr %bigoffset
126   %addr2 = getelementptr i64, ptr %p, i64 1010
127   store i64 0, ptr %addr2
128   %addr3 = getelementptr i64, ptr %p, i64 1002
129   store i64 0, ptr %addr3
130   %addr4 = getelementptr i64, ptr %p, i64 1003
131   store i64 0, ptr %addr4
132   %addr5 = getelementptr i64, ptr %p, i64 1004
133   store i64 0, ptr %addr5
134   %addr6 = getelementptr i64, ptr %p, i64 1005
135   store i64 0, ptr %addr6
136   %addr7 = getelementptr i64, ptr %p, i64 1006
137   store i64 0, ptr %addr7
138   %addr8 = getelementptr i64, ptr %p, i64 1007
139   store i64 0, ptr %addr8
140   ret void
143 define void @vector(ptr %p) {
144 ; CHECK-NO-SPLIT-LABEL: vector:
145 ; CHECK-NO-SPLIT:       ; %bb.0:
146 ; CHECK-NO-SPLIT-NEXT:    movi.2d v0, #0000000000000000
147 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16000]
148 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16016]
149 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16032]
150 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16048]
151 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16064]
152 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16080]
153 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16096]
154 ; CHECK-NO-SPLIT-NEXT:    str q0, [x0, #16112]
155 ; CHECK-NO-SPLIT-NEXT:    ret
157 ; CHECK-SPLIT-LABEL: vector:
158 ; CHECK-SPLIT:       ; %bb.0:
159 ; CHECK-SPLIT-NEXT:    movi.2d v0, #0000000000000000
160 ; CHECK-SPLIT-NEXT:    mov w8, #16000 ; =0x3e80
161 ; CHECK-SPLIT-NEXT:    add x8, x0, x8
162 ; CHECK-SPLIT-NEXT:    stp q0, q0, [x8]
163 ; CHECK-SPLIT-NEXT:    stp q0, q0, [x8, #32]
164 ; CHECK-SPLIT-NEXT:    stp q0, q0, [x8, #64]
165 ; CHECK-SPLIT-NEXT:    stp q0, q0, [x8, #96]
166 ; CHECK-SPLIT-NEXT:    ret
167   %bigoffset = getelementptr <2 x i64>, ptr %p, i64 1000
168   store <2 x i64> <i64 0, i64 0>, ptr %bigoffset
169   %addr2 = getelementptr <2 x i64>, ptr %p, i64 1001
170   store <2 x i64> <i64 0, i64 0>, ptr %addr2
171   %addr3 = getelementptr <2 x i64>, ptr %p, i64 1002
172   store <2 x i64> <i64 0, i64 0>, ptr %addr3
173   %addr4 = getelementptr <2 x i64>, ptr %p, i64 1003
174   store <2 x i64> <i64 0, i64 0>, ptr %addr4
175   %addr5 = getelementptr <2 x i64>, ptr %p, i64 1004
176   store <2 x i64> <i64 0, i64 0>, ptr %addr5
177   %addr6 = getelementptr <2 x i64>, ptr %p, i64 1005
178   store <2 x i64> <i64 0, i64 0>, ptr %addr6
179   %addr7 = getelementptr <2 x i64>, ptr %p, i64 1006
180   store <2 x i64> <i64 0, i64 0>, ptr %addr7
181   %addr8 = getelementptr <2 x i64>, ptr %p, i64 1007
182   store <2 x i64> <i64 0, i64 0>, ptr %addr8
183   ret void
186 define void @can_already_form_stp(ptr %p) {
187 ; CHECK-NO-SPLIT-LABEL: can_already_form_stp:
188 ; CHECK-NO-SPLIT:       ; %bb.0:
189 ; CHECK-NO-SPLIT-NEXT:    stp xzr, xzr, [x0, #80]
190 ; CHECK-NO-SPLIT-NEXT:    stp xzr, xzr, [x0, #96]
191 ; CHECK-NO-SPLIT-NEXT:    stp xzr, xzr, [x0, #112]
192 ; CHECK-NO-SPLIT-NEXT:    ret
194 ; CHECK-SPLIT-LABEL: can_already_form_stp:
195 ; CHECK-SPLIT:       ; %bb.0:
196 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x0, #80]
197 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x0, #96]
198 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x0, #112]
199 ; CHECK-SPLIT-NEXT:    ret
200   %bigoffset = getelementptr i64, ptr %p, i64 10
201   store i64 0, ptr %bigoffset
202   %addr2 = getelementptr i64, ptr %p, i64 11
203   store i64 0, ptr %addr2
204   %addr3 = getelementptr i64, ptr %p, i64 12
205   store i64 0, ptr %addr3
206   %addr4 = getelementptr i64, ptr %p, i64 13
207   store i64 0, ptr %addr4
208   %addr5 = getelementptr i64, ptr %p, i64 14
209   store i64 0, ptr %addr5
210   %addr6 = getelementptr i64, ptr %p, i64 15
211   store i64 0, ptr %addr6
212   ret void
215 define void @use_of_load_in_between(ptr %p, ptr %ldptr, ptr %ldptr2) {
216 ; CHECK-NO-SPLIT-LABEL: use_of_load_in_between:
217 ; CHECK-NO-SPLIT:       ; %bb.0:
218 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
219 ; CHECK-NO-SPLIT-NEXT:    ldr x8, [x1]
220 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
221 ; CHECK-NO-SPLIT-NEXT:    str x8, [x0, #8008]
222 ; CHECK-NO-SPLIT-NEXT:    ldr x8, [x2]
223 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8032]
224 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8040]
225 ; CHECK-NO-SPLIT-NEXT:    str x8, [x0, #8024]
226 ; CHECK-NO-SPLIT-NEXT:    ret
228 ; CHECK-SPLIT-LABEL: use_of_load_in_between:
229 ; CHECK-SPLIT:       ; %bb.0:
230 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8000]
231 ; CHECK-SPLIT-NEXT:    ldr x8, [x1]
232 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8016]
233 ; CHECK-SPLIT-NEXT:    str x8, [x0, #8008]
234 ; CHECK-SPLIT-NEXT:    ldr x8, [x2]
235 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8032]
236 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8040]
237 ; CHECK-SPLIT-NEXT:    str x8, [x0, #8024]
238 ; CHECK-SPLIT-NEXT:    ret
239   %bigoffset = getelementptr i64, ptr %p, i64 1000
240   store i64 0, ptr %bigoffset
241   %addr2 = getelementptr i64, ptr %p, i64 1001
242   %ld = load i64, ptr %ldptr
243   store i64 %ld, ptr %addr2
244   %addr3 = getelementptr i64, ptr %p, i64 1002
245   store i64 0, ptr %addr3
246   %addr4 = getelementptr i64, ptr %p, i64 1003
247   %ld2 = load i64, ptr %ldptr2
248   store i64 %ld2, ptr %addr4
249   %addr5 = getelementptr i64, ptr %p, i64 1004
250   store i64 0, ptr %addr5
251   %addr6 = getelementptr i64, ptr %p, i64 1005
252   store i64 0, ptr %addr6
253   ret void
256 define void @offset_legal_for_add_imm(ptr %p) {
257 ; CHECK-NO-SPLIT-LABEL: offset_legal_for_add_imm:
258 ; CHECK-NO-SPLIT:       ; %bb.0:
259 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3200]
260 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3208]
261 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3216]
262 ; CHECK-NO-SPLIT-NEXT:    ret
264 ; CHECK-SPLIT-LABEL: offset_legal_for_add_imm:
265 ; CHECK-SPLIT:       ; %bb.0:
266 ; CHECK-SPLIT-NEXT:    add x8, x0, #3200
267 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8]
268 ; CHECK-SPLIT-NEXT:    str xzr, [x8, #16]
269 ; CHECK-SPLIT-NEXT:    ret
270   %bigoffset = getelementptr i64, ptr %p, i64 400
271   store i64 0, ptr %bigoffset
272   %addr2 = getelementptr i64, ptr %p, i64 401
273   store i64 0, ptr %addr2
274   %addr3 = getelementptr i64, ptr %p, i64 402
275   store i64 0, ptr %addr3
276   ret void
279 define void @offset_illegal_for_add_imm(ptr %p) {
280 ; CHECK-NO-SPLIT-LABEL: offset_illegal_for_add_imm:
281 ; CHECK-NO-SPLIT:       ; %bb.0:
282 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
283 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8008]
284 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
285 ; CHECK-NO-SPLIT-NEXT:    ret
287 ; CHECK-SPLIT-LABEL: offset_illegal_for_add_imm:
288 ; CHECK-SPLIT:       ; %bb.0:
289 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8000]
290 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8008]
291 ; CHECK-SPLIT-NEXT:    str xzr, [x0, #8016]
292 ; CHECK-SPLIT-NEXT:    ret
293   %bigoffset = getelementptr i64, ptr %p, i64 1000
294   store i64 0, ptr %bigoffset
295   %addr2 = getelementptr i64, ptr %p, i64 1001
296   store i64 0, ptr %addr2
297   %addr3 = getelementptr i64, ptr %p, i64 1002
298   store i64 0, ptr %addr3
299   ret void
302 define void @offset_legal_for_add_imm_4_stores(ptr %p) {
303 ; CHECK-NO-SPLIT-LABEL: offset_legal_for_add_imm_4_stores:
304 ; CHECK-NO-SPLIT:       ; %bb.0:
305 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3200]
306 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3208]
307 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3216]
308 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #3224]
309 ; CHECK-NO-SPLIT-NEXT:    ret
311 ; CHECK-SPLIT-LABEL: offset_legal_for_add_imm_4_stores:
312 ; CHECK-SPLIT:       ; %bb.0:
313 ; CHECK-SPLIT-NEXT:    add x8, x0, #3200
314 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8]
315 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #16]
316 ; CHECK-SPLIT-NEXT:    ret
317   %bigoffset = getelementptr i64, ptr %p, i64 400
318   store i64 0, ptr %bigoffset
319   %addr2 = getelementptr i64, ptr %p, i64 401
320   store i64 0, ptr %addr2
321   %addr3 = getelementptr i64, ptr %p, i64 402
322   store i64 0, ptr %addr3
323   %addr4 = getelementptr i64, ptr %p, i64 403
324   store i64 0, ptr %addr4
325   ret void
328 define void @offset_illegal_for_add_imm_4_stores(ptr %p) {
329 ; CHECK-NO-SPLIT-LABEL: offset_illegal_for_add_imm_4_stores:
330 ; CHECK-NO-SPLIT:       ; %bb.0:
331 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8000]
332 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8008]
333 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8016]
334 ; CHECK-NO-SPLIT-NEXT:    str xzr, [x0, #8024]
335 ; CHECK-NO-SPLIT-NEXT:    ret
337 ; CHECK-SPLIT-LABEL: offset_illegal_for_add_imm_4_stores:
338 ; CHECK-SPLIT:       ; %bb.0:
339 ; CHECK-SPLIT-NEXT:    mov w8, #8000 ; =0x1f40
340 ; CHECK-SPLIT-NEXT:    add x8, x0, x8
341 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8]
342 ; CHECK-SPLIT-NEXT:    stp xzr, xzr, [x8, #16]
343 ; CHECK-SPLIT-NEXT:    ret
344   %bigoffset = getelementptr i64, ptr %p, i64 1000
345   store i64 0, ptr %bigoffset
346   %addr2 = getelementptr i64, ptr %p, i64 1001
347   store i64 0, ptr %addr2
348   %addr3 = getelementptr i64, ptr %p, i64 1002
349   store i64 0, ptr %addr3
350   %addr4 = getelementptr i64, ptr %p, i64 1003
351   store i64 0, ptr %addr4
352   ret void