xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/select-store.mir (revision 1ee315ae7964c8433b772e0b5d667834994ba753)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=1 %s -o - | FileCheck %s
3
4--- |
5  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6
7  define void @store_s64_gpr(ptr %addr) { ret void }
8  define void @store_s32_gpr(ptr %addr) { ret void }
9  define void @store_s16_gpr(ptr %addr) { ret void }
10  define void @store_s8_gpr(ptr %addr) { ret void }
11
12  define void @store_zero_s64_gpr(ptr %addr) { ret void }
13  define void @store_zero_s32_gpr(ptr %addr) { ret void }
14  define void @store_zero_s16(ptr %addr) { ret void }
15  define void @store_zero_s8(ptr %addr) { ret void }
16  define void @store_zero_look_through_cst(ptr %addr) { ret void }
17
18  define void @store_fi_s64_gpr() {
19    %ptr0 = alloca i64
20    ret void
21  }
22
23  define void @store_gep_128_s64_gpr(ptr %addr) { ret void }
24  define void @store_gep_512_s32_gpr(ptr %addr) { ret void }
25  define void @store_gep_64_s16_gpr(ptr %addr) { ret void }
26  define void @store_gep_1_s8_gpr(ptr %addr) { ret void }
27
28  define void @store_s64_fpr(ptr %addr) { ret void }
29  define void @store_s32_fpr(ptr %addr) { ret void }
30
31  define void @store_gep_8_s64_fpr(ptr %addr) { ret void }
32  define void @store_gep_8_s32_fpr(ptr %addr) { ret void }
33
34  define void @store_v2s32(ptr %addr) { ret void }
35  define void @store_v2s64(ptr %addr) { ret void }
36
37  define void @store_4xi16(<4 x i16> %v, ptr %ptr) { ret void }
38  define void @store_4xi32(<4 x i32> %v, ptr %ptr) { ret void }
39  define void @store_8xi16(<8 x i16> %v, ptr %ptr) { ret void }
40  define void @store_16xi8(<16 x i8> %v, ptr %ptr) { ret void }
41
42  @x = external hidden local_unnamed_addr global ptr, align 8
43  define void @store_adrp_add_low() { ret void }
44  define void @store_adrp_add_low_foldable_offset() { ret void }
45  define void @store_adrp_add_low_unfoldable_offset() { ret void }
46
47  define void @truncstores(ptr %addr) { ret void }
48...
49
50---
51name:            store_s64_gpr
52legalized:       true
53regBankSelected: true
54
55registers:
56  - { id: 0, class: gpr }
57  - { id: 1, class: gpr }
58
59body:             |
60  bb.0:
61    liveins: $x0, $x1
62
63    ; CHECK-LABEL: name: store_s64_gpr
64    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
65    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
66    ; CHECK-NEXT: STRXui [[COPY1]], [[COPY]], 0 :: (store (s64) into %ir.addr)
67    %0(p0) = COPY $x0
68    %1(s64) = COPY $x1
69    G_STORE  %1, %0 :: (store (s64) into %ir.addr)
70
71...
72
73---
74name:            store_s32_gpr
75legalized:       true
76regBankSelected: true
77
78registers:
79  - { id: 0, class: gpr }
80  - { id: 1, class: gpr }
81
82body:             |
83  bb.0:
84    liveins: $x0, $w1
85
86    ; CHECK-LABEL: name: store_s32_gpr
87    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
88    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
89    ; CHECK-NEXT: STRWui [[COPY1]], [[COPY]], 0 :: (store (s32) into %ir.addr)
90    %0(p0) = COPY $x0
91    %1(s32) = COPY $w1
92    G_STORE  %1, %0 :: (store (s32) into %ir.addr)
93
94...
95
96---
97name:            store_s16_gpr
98legalized:       true
99regBankSelected: true
100
101registers:
102  - { id: 0, class: gpr }
103  - { id: 1, class: gpr }
104
105body:             |
106  bb.0:
107    liveins: $x0, $w1
108
109    ; CHECK-LABEL: name: store_s16_gpr
110    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
111    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
112    ; CHECK-NEXT: STRHHui [[COPY1]], [[COPY]], 0 :: (store (s16) into %ir.addr)
113    %0(p0) = COPY $x0
114    %2:gpr(s32) = COPY $w1
115    %1(s16) = G_TRUNC %2
116    G_STORE  %1, %0 :: (store (s16) into %ir.addr)
117
118...
119
120---
121name:            store_s8_gpr
122legalized:       true
123regBankSelected: true
124
125registers:
126  - { id: 0, class: gpr }
127  - { id: 1, class: gpr }
128
129body:             |
130  bb.0:
131    liveins: $x0, $w1
132
133    ; CHECK-LABEL: name: store_s8_gpr
134    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
135    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
136    ; CHECK-NEXT: STRBBui [[COPY1]], [[COPY]], 0 :: (store (s8) into %ir.addr)
137    %0(p0) = COPY $x0
138    %2:gpr(s32) = COPY $w1
139    %1(s8) = G_TRUNC %2
140    G_STORE  %1, %0 :: (store (s8) into %ir.addr)
141
142...
143
144---
145name:            store_zero_s64_gpr
146legalized:       true
147regBankSelected: true
148
149registers:
150  - { id: 0, class: gpr }
151  - { id: 1, class: gpr }
152
153body:             |
154  bb.0:
155    liveins: $x0, $x1
156
157    ; CHECK-LABEL: name: store_zero_s64_gpr
158    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
159    ; CHECK-NEXT: STRXui $xzr, [[COPY]], 0 :: (store (s64) into %ir.addr)
160    %0(p0) = COPY $x0
161    %1(s64) = G_CONSTANT i64 0
162    G_STORE  %1, %0 :: (store (s64) into %ir.addr)
163
164...
165
166---
167name:            store_zero_s32_gpr
168legalized:       true
169regBankSelected: true
170
171registers:
172  - { id: 0, class: gpr }
173  - { id: 1, class: gpr }
174
175body:             |
176  bb.0:
177    liveins: $x0
178
179    ; CHECK-LABEL: name: store_zero_s32_gpr
180    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
181    ; CHECK-NEXT: STRWui $wzr, [[COPY]], 0 :: (store (s32) into %ir.addr)
182    %0(p0) = COPY $x0
183    %1(s32) = G_CONSTANT i32 0
184    G_STORE  %1, %0 :: (store (s32) into %ir.addr)
185
186...
187
188---
189name:            store_zero_s16
190legalized:       true
191regBankSelected: true
192body:             |
193  bb.0:
194    liveins: $x0
195    ; CHECK-LABEL: name: store_zero_s16
196    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
197    ; CHECK-NEXT: STRHHui $wzr, [[COPY]], 0 :: (store (s16))
198    %0:gpr(p0) = COPY $x0
199    %1:gpr(s16) = G_CONSTANT i16 0
200    G_STORE %1(s16), %0(p0) :: (store (s16))
201
202...
203
204---
205name:            store_zero_s8
206legalized:       true
207regBankSelected: true
208body:             |
209  bb.0:
210    liveins: $x0
211    ; CHECK-LABEL: name: store_zero_s8
212    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
213    ; CHECK-NEXT: STRBBui $wzr, [[COPY]], 0 :: (store (s8))
214    %0:gpr(p0) = COPY $x0
215    %1:gpr(s8) = G_CONSTANT i8 0
216    G_STORE %1(s8), %0(p0) :: (store (s8))
217...
218
219---
220name:            store_zero_look_through_cst
221legalized:       true
222regBankSelected: true
223body:             |
224  bb.0:
225    liveins: $x0
226    ; CHECK-LABEL: name: store_zero_look_through_cst
227    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
228    ; CHECK-NEXT: STRXui $xzr, [[COPY]], 0 :: (store (s64) into %ir.addr)
229    %0:gpr(p0) = COPY $x0
230    %1:gpr(s32) = G_CONSTANT i32 0
231    %2:gpr(s64) = G_ZEXT %1
232    G_STORE %2, %0 :: (store (s64) into %ir.addr)
233...
234
235---
236name:            store_fi_s64_gpr
237legalized:       true
238regBankSelected: true
239
240registers:
241  - { id: 0, class: gpr }
242  - { id: 1, class: gpr }
243
244stack:
245  - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
246
247body:             |
248  bb.0:
249    liveins: $x0
250
251    ; CHECK-LABEL: name: store_fi_s64_gpr
252    ; CHECK: [[COPY:%[0-9]+]]:gpr64all = COPY $x0
253    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY [[COPY]]
254    ; CHECK-NEXT: STRXui [[COPY1]], %stack.0.ptr0, 0 :: (store (p0))
255    %0(p0) = COPY $x0
256    %1(p0) = G_FRAME_INDEX %stack.0.ptr0
257    G_STORE  %0, %1 :: (store (p0))
258...
259
260---
261name:            store_gep_128_s64_gpr
262legalized:       true
263regBankSelected: true
264
265registers:
266  - { id: 0, class: gpr }
267  - { id: 1, class: gpr }
268  - { id: 2, class: gpr }
269  - { id: 3, class: gpr }
270
271body:             |
272  bb.0:
273    liveins: $x0, $x1
274
275    ; CHECK-LABEL: name: store_gep_128_s64_gpr
276    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
277    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
278    ; CHECK-NEXT: STRXui [[COPY1]], [[COPY]], 16 :: (store (s64) into %ir.addr)
279    %0(p0) = COPY $x0
280    %1(s64) = COPY $x1
281    %2(s64) = G_CONSTANT i64 128
282    %3(p0) = G_PTR_ADD %0, %2
283    G_STORE %1, %3 :: (store (s64) into %ir.addr)
284...
285
286---
287name:            store_gep_512_s32_gpr
288legalized:       true
289regBankSelected: true
290
291registers:
292  - { id: 0, class: gpr }
293  - { id: 1, class: gpr }
294  - { id: 2, class: gpr }
295  - { id: 3, class: gpr }
296
297body:             |
298  bb.0:
299    liveins: $x0, $w1
300
301    ; CHECK-LABEL: name: store_gep_512_s32_gpr
302    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
303    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
304    ; CHECK-NEXT: STRWui [[COPY1]], [[COPY]], 128 :: (store (s32) into %ir.addr)
305    %0(p0) = COPY $x0
306    %1(s32) = COPY $w1
307    %2(s64) = G_CONSTANT i64 512
308    %3(p0) = G_PTR_ADD %0, %2
309    G_STORE %1, %3 :: (store (s32) into %ir.addr)
310...
311
312---
313name:            store_gep_64_s16_gpr
314legalized:       true
315regBankSelected: true
316
317registers:
318  - { id: 0, class: gpr }
319  - { id: 1, class: gpr }
320  - { id: 2, class: gpr }
321  - { id: 3, class: gpr }
322
323body:             |
324  bb.0:
325    liveins: $x0, $w1
326
327    ; CHECK-LABEL: name: store_gep_64_s16_gpr
328    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
329    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
330    ; CHECK-NEXT: STRHHui [[COPY1]], [[COPY]], 32 :: (store (s16) into %ir.addr)
331    %0(p0) = COPY $x0
332    %4:gpr(s32) = COPY $w1
333    %1(s16) = G_TRUNC %4
334    %2(s64) = G_CONSTANT i64 64
335    %3(p0) = G_PTR_ADD %0, %2
336    G_STORE %1, %3 :: (store (s16) into %ir.addr)
337...
338
339---
340name:            store_gep_1_s8_gpr
341legalized:       true
342regBankSelected: true
343
344registers:
345  - { id: 0, class: gpr }
346  - { id: 1, class: gpr }
347  - { id: 2, class: gpr }
348  - { id: 3, class: gpr }
349
350body:             |
351  bb.0:
352    liveins: $x0, $w1
353
354    ; CHECK-LABEL: name: store_gep_1_s8_gpr
355    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
356    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
357    ; CHECK-NEXT: STRBBui [[COPY1]], [[COPY]], 1 :: (store (s8) into %ir.addr)
358    %0(p0) = COPY $x0
359    %4:gpr(s32) = COPY $w1
360    %1(s8) = G_TRUNC %4
361    %2(s64) = G_CONSTANT i64 1
362    %3(p0) = G_PTR_ADD %0, %2
363    G_STORE %1, %3 :: (store (s8) into %ir.addr)
364...
365
366---
367name:            store_s64_fpr
368legalized:       true
369regBankSelected: true
370
371registers:
372  - { id: 0, class: gpr }
373  - { id: 1, class: fpr }
374
375body:             |
376  bb.0:
377    liveins: $x0, $d1
378
379    ; CHECK-LABEL: name: store_s64_fpr
380    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
381    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
382    ; CHECK-NEXT: STRDui [[COPY1]], [[COPY]], 0 :: (store (s64) into %ir.addr)
383    %0(p0) = COPY $x0
384    %1(s64) = COPY $d1
385    G_STORE %1, %0 :: (store (s64) into %ir.addr)
386
387...
388
389---
390name:            store_s32_fpr
391legalized:       true
392regBankSelected: true
393
394registers:
395  - { id: 0, class: gpr }
396  - { id: 1, class: fpr }
397
398body:             |
399  bb.0:
400    liveins: $x0, $s1
401
402    ; CHECK-LABEL: name: store_s32_fpr
403    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
404    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
405    ; CHECK-NEXT: STRSui [[COPY1]], [[COPY]], 0 :: (store (s32) into %ir.addr)
406    %0(p0) = COPY $x0
407    %1(s32) = COPY $s1
408    G_STORE %1, %0 :: (store (s32) into %ir.addr)
409
410...
411
412---
413name:            store_gep_8_s64_fpr
414legalized:       true
415regBankSelected: true
416
417registers:
418  - { id: 0, class: gpr }
419  - { id: 1, class: fpr }
420  - { id: 2, class: gpr }
421  - { id: 3, class: gpr }
422
423body:             |
424  bb.0:
425    liveins: $x0, $d1
426
427    ; CHECK-LABEL: name: store_gep_8_s64_fpr
428    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
429    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
430    ; CHECK-NEXT: STRDui [[COPY1]], [[COPY]], 1 :: (store (s64) into %ir.addr)
431    %0(p0) = COPY $x0
432    %1(s64) = COPY $d1
433    %2(s64) = G_CONSTANT i64 8
434    %3(p0) = G_PTR_ADD %0, %2
435    G_STORE %1, %3 :: (store (s64) into %ir.addr)
436...
437
438---
439name:            store_gep_8_s32_fpr
440legalized:       true
441regBankSelected: true
442
443registers:
444  - { id: 0, class: gpr }
445  - { id: 1, class: fpr }
446  - { id: 2, class: gpr }
447  - { id: 3, class: gpr }
448
449body:             |
450  bb.0:
451    liveins: $x0, $s1
452
453    ; CHECK-LABEL: name: store_gep_8_s32_fpr
454    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
455    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
456    ; CHECK-NEXT: STRSui [[COPY1]], [[COPY]], 2 :: (store (s32) into %ir.addr)
457    %0(p0) = COPY $x0
458    %1(s32) = COPY $s1
459    %2(s64) = G_CONSTANT i64 8
460    %3(p0) = G_PTR_ADD %0, %2
461    G_STORE %1, %3 :: (store (s32) into %ir.addr)
462...
463---
464name:            store_v2s32
465legalized:       true
466regBankSelected: true
467
468registers:
469  - { id: 0, class: gpr }
470  - { id: 1, class: fpr }
471
472body:             |
473  bb.0:
474    liveins: $x0, $d1
475
476    ; CHECK-LABEL: name: store_v2s32
477    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
478    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
479    ; CHECK-NEXT: STRDui [[COPY1]], [[COPY]], 0 :: (store (<2 x s32>) into %ir.addr)
480    %0(p0) = COPY $x0
481    %1(<2 x s32>) = COPY $d1
482    G_STORE  %1, %0 :: (store (<2 x s32>) into %ir.addr)
483
484...
485---
486name:            store_v2s64
487legalized:       true
488regBankSelected: true
489
490registers:
491  - { id: 0, class: gpr }
492  - { id: 1, class: fpr }
493
494body:             |
495  bb.0:
496    liveins: $x0, $d1
497    ; CHECK-LABEL: name: store_v2s64
498    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
499    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1
500    ; CHECK-NEXT: STRQui [[COPY1]], [[COPY]], 0 :: (store (<2 x s64>) into %ir.addr, align 8)
501    %0(p0) = COPY $x0
502    %1(<2 x s64>) = COPY $q1
503    G_STORE %1, %0 :: (store (<2 x s64>) into %ir.addr, align 8)
504
505...
506---
507name:            store_4xi16
508alignment:       4
509legalized:       true
510regBankSelected: true
511tracksRegLiveness: true
512registers:
513  - { id: 0, class: fpr }
514  - { id: 1, class: gpr }
515machineFunctionInfo: {}
516body:             |
517  bb.1 (%ir-block.0):
518    liveins: $d0, $x0
519
520    ; CHECK-LABEL: name: store_4xi16
521    ; CHECK: liveins: $d0, $x0
522    ; CHECK-NEXT: {{  $}}
523    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
524    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
525    ; CHECK-NEXT: STRDui [[COPY]], [[COPY1]], 0 :: (store (<4 x s16>) into %ir.ptr)
526    ; CHECK-NEXT: RET_ReallyLR
527    %0:fpr(<4 x s16>) = COPY $d0
528    %1:gpr(p0) = COPY $x0
529    G_STORE %0(<4 x s16>), %1(p0) :: (store (<4 x s16>) into %ir.ptr)
530    RET_ReallyLR
531
532...
533---
534name:            store_4xi32
535alignment:       4
536legalized:       true
537regBankSelected: true
538tracksRegLiveness: true
539registers:
540  - { id: 0, class: fpr }
541  - { id: 1, class: gpr }
542machineFunctionInfo: {}
543body:             |
544  bb.1 (%ir-block.0):
545    liveins: $q0, $x0
546
547    ; CHECK-LABEL: name: store_4xi32
548    ; CHECK: liveins: $q0, $x0
549    ; CHECK-NEXT: {{  $}}
550    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
551    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
552    ; CHECK-NEXT: STRQui [[COPY]], [[COPY1]], 0 :: (store (<4 x s32>) into %ir.ptr)
553    ; CHECK-NEXT: RET_ReallyLR
554    %0:fpr(<4 x s32>) = COPY $q0
555    %1:gpr(p0) = COPY $x0
556    G_STORE %0(<4 x s32>), %1(p0) :: (store (<4 x s32>) into %ir.ptr)
557    RET_ReallyLR
558
559...
560---
561name:            store_8xi16
562alignment:       4
563legalized:       true
564regBankSelected: true
565tracksRegLiveness: true
566registers:
567  - { id: 0, class: fpr }
568  - { id: 1, class: gpr }
569machineFunctionInfo: {}
570body:             |
571  bb.1 (%ir-block.0):
572    liveins: $q0, $x0
573
574    ; CHECK-LABEL: name: store_8xi16
575    ; CHECK: liveins: $q0, $x0
576    ; CHECK-NEXT: {{  $}}
577    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
578    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
579    ; CHECK-NEXT: STRQui [[COPY]], [[COPY1]], 0 :: (store (<8 x s16>) into %ir.ptr)
580    ; CHECK-NEXT: RET_ReallyLR
581    %0:fpr(<8 x s16>) = COPY $q0
582    %1:gpr(p0) = COPY $x0
583    G_STORE %0(<8 x s16>), %1(p0) :: (store (<8 x s16>) into %ir.ptr)
584    RET_ReallyLR
585
586...
587---
588name:            store_16xi8
589alignment:       4
590legalized:       true
591regBankSelected: true
592tracksRegLiveness: true
593registers:
594  - { id: 0, class: fpr }
595  - { id: 1, class: gpr }
596machineFunctionInfo: {}
597body:             |
598  bb.1 (%ir-block.0):
599    liveins: $q0, $x0
600
601    ; CHECK-LABEL: name: store_16xi8
602    ; CHECK: liveins: $q0, $x0
603    ; CHECK-NEXT: {{  $}}
604    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
605    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
606    ; CHECK-NEXT: STRQui [[COPY]], [[COPY1]], 0 :: (store (<16 x s8>) into %ir.ptr)
607    ; CHECK-NEXT: RET_ReallyLR
608    %0:fpr(<16 x s8>) = COPY $q0
609    %1:gpr(p0) = COPY $x0
610    G_STORE %0(<16 x s8>), %1(p0) :: (store (<16 x s8>) into %ir.ptr)
611    RET_ReallyLR
612
613...
614---
615name:            store_adrp_add_low
616legalized:       true
617regBankSelected: true
618tracksRegLiveness: true
619body:             |
620  bb.0:
621    liveins: $x0
622    ; CHECK-LABEL: name: store_adrp_add_low
623    ; CHECK: liveins: $x0
624    ; CHECK-NEXT: {{  $}}
625    ; CHECK-NEXT: %copy:gpr64all = COPY $x0
626    ; CHECK-NEXT: %adrp:gpr64common = ADRP target-flags(aarch64-page) @x
627    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY %copy
628    ; CHECK-NEXT: STRXui [[COPY]], %adrp, target-flags(aarch64-pageoff, aarch64-nc) @x :: (store (p0) into @x)
629    %copy:gpr(p0) = COPY $x0
630    %adrp:gpr64(p0) = ADRP target-flags(aarch64-page) @x
631    %add_low:gpr(p0) = G_ADD_LOW %adrp(p0), target-flags(aarch64-pageoff, aarch64-nc) @x
632    G_STORE %copy(p0), %add_low(p0) :: (store (p0) into @x)
633
634...
635---
636name:            store_adrp_add_low_foldable_offset
637legalized:       true
638regBankSelected: true
639tracksRegLiveness: true
640body:             |
641  bb.0:
642    liveins: $x0
643    ; CHECK-LABEL: name: store_adrp_add_low_foldable_offset
644    ; CHECK: liveins: $x0
645    ; CHECK-NEXT: {{  $}}
646    ; CHECK-NEXT: %copy:gpr64all = COPY $x0
647    ; CHECK-NEXT: %adrp:gpr64common = ADRP target-flags(aarch64-page) @x + 8
648    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY %copy
649    ; CHECK-NEXT: STRXui [[COPY]], %adrp, target-flags(aarch64-pageoff, aarch64-nc) @x + 8 :: (store (p0) into @x)
650    %copy:gpr(p0) = COPY $x0
651    %adrp:gpr64(p0) = ADRP target-flags(aarch64-page) @x + 8
652    %add_low:gpr(p0) = G_ADD_LOW %adrp(p0), target-flags(aarch64-pageoff, aarch64-nc) @x + 8
653    G_STORE %copy(p0), %add_low(p0) :: (store (p0) into @x)
654
655...
656---
657name:            store_adrp_add_low_unfoldable_offset
658legalized:       true
659regBankSelected: true
660tracksRegLiveness: true
661body:             |
662  bb.0:
663    liveins: $x0
664    ; CHECK-LABEL: name: store_adrp_add_low_unfoldable_offset
665    ; CHECK: liveins: $x0
666    ; CHECK-NEXT: {{  $}}
667    ; CHECK-NEXT: %copy:gpr64all = COPY $x0
668    ; CHECK-NEXT: %add_low:gpr64common = MOVaddr target-flags(aarch64-page) @x + 3, target-flags(aarch64-pageoff, aarch64-nc) @x + 3
669    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY %copy
670    ; CHECK-NEXT: STRXui [[COPY]], %add_low, 0 :: (store (p0) into @x)
671    %copy:gpr(p0) = COPY $x0
672    %adrp:gpr64(p0) = ADRP target-flags(aarch64-page) @x + 3
673    %add_low:gpr(p0) = G_ADD_LOW %adrp(p0), target-flags(aarch64-pageoff, aarch64-nc) @x + 3
674    G_STORE %copy(p0), %add_low(p0) :: (store (p0) into @x)
675...
676
677---
678name:            truncstores
679legalized:       true
680regBankSelected: true
681body:             |
682  bb.0:
683    liveins: $x0, $w1, $x2
684
685    ; CHECK-LABEL: name: truncstores
686    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
687    ; CHECK-NEXT: %val32:gpr32 = COPY $w1
688    ; CHECK-NEXT: %val64:gpr64 = COPY $x2
689    ; CHECK-NEXT: STRBBui %val32, [[COPY]], 0 :: (store (s8))
690    ; CHECK-NEXT: STRBBui %val32, [[COPY]], 43 :: (store (s8))
691    ; CHECK-NEXT: STRHHui %val32, [[COPY]], 0 :: (store (s16))
692    ; CHECK-NEXT: STURHHi %val32, [[COPY]], 43 :: (store (s16))
693    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY %val64.sub_32
694    ; CHECK-NEXT: STRHHui [[COPY1]], [[COPY]], 0 :: (store (s16))
695    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY %val64.sub_32
696    ; CHECK-NEXT: STURHHi [[COPY2]], [[COPY]], 43 :: (store (s16))
697    ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32 = COPY %val64.sub_32
698    ; CHECK-NEXT: STRWui [[COPY3]], [[COPY]], 0 :: (store (s32))
699    ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr32 = COPY %val64.sub_32
700    ; CHECK-NEXT: STURWi [[COPY4]], [[COPY]], 43 :: (store (s32))
701    %0:gpr(p0) = COPY $x0
702    %val32:gpr(s32) = COPY $w1
703    %val64:gpr(s64) = COPY $x2
704    G_STORE %val32, %0 :: (store (s8))
705    ; unscaled offset:
706    %cst:gpr(s64) = G_CONSTANT i64 43
707    %newptr:gpr(p0) = G_PTR_ADD %0, %cst
708    G_STORE %val32, %newptr :: (store (s8))
709
710    G_STORE %val32, %0 :: (store (s16))
711    ; unscaled offset:
712    G_STORE %val32, %newptr :: (store (s16))
713
714    G_STORE %val64, %0 :: (store (s16))
715    ; unscaled offset:
716    G_STORE %val64, %newptr :: (store (s16))
717
718    G_STORE %val64, %0 :: (store (s32))
719    ; unscaled offset:
720    G_STORE %val64, %newptr :: (store (s32))
721...
722