Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / ldrpre-ldr-merge.mir
blob647130ba7d908fc093f296b93b4cc12a7dcead71
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2 # RUN: llc -o - %s -mtriple=aarch64 -mcpu=cortex-a55 -lsr-preferred-addressing-mode=preindexed -stop-after=aarch64-ldst-opt | FileCheck %s
4 ---
5 name:            1-ldrwpre-ldrwui-merge
6 tracksRegLiveness: true
7 liveins:
8   - { reg: '$x1' }
9   - { reg: '$w0' }
10   - { reg: '$w1' }
11 machineFunctionInfo:
12   hasRedZone:      false
13 body:             |
14   bb.0:
15     liveins: $w0, $w1, $x1
16     ; CHECK-LABEL: name: 1-ldrwpre-ldrwui-merge
17     ; CHECK: liveins: $w0, $w1, $x1
18     ; CHECK-NEXT: {{  $}}
19     ; CHECK-NEXT: early-clobber $x1, renamable $w0, renamable $w2 = LDPWpre renamable $x1, 5 :: (load (s32))
20     ; CHECK-NEXT: STPWi renamable $w0, renamable $w2, renamable $x1, 0 :: (store (s32))
21     ; CHECK-NEXT: RET undef $lr
22     early-clobber renamable $x1, renamable $w0 = LDRWpre killed renamable $x1, 20 :: (load (s32))
23     renamable $w2 = LDRWui renamable $x1, 1 :: (load (s32))
24     STRWui killed renamable $w0, renamable $x1, 0 :: (store (s32))
25     STRWui killed renamable $w2, renamable $x1, 1 :: (store (s32))
26     RET undef $lr
27 ...
30 ---
31 name:            2-ldrxpre-ldrxui-merge
32 tracksRegLiveness: true
33 liveins:
34   - { reg: '$x1' }
35   - { reg: '$x2' }
36   - { reg: '$x3' }
37 machineFunctionInfo:
38   hasRedZone:      false
39 body:             |
40   bb.0:
41     liveins: $x2, $x3, $x1
42     ; CHECK-LABEL: name: 2-ldrxpre-ldrxui-merge
43     ; CHECK: liveins: $x1, $x2, $x3
44     ; CHECK-NEXT: {{  $}}
45     ; CHECK-NEXT: early-clobber $x1, renamable $x2, renamable $x3 = LDPXpre renamable $x1, 3 :: (load (s64))
46     ; CHECK-NEXT: STPXi renamable $x2, renamable $x3, renamable $x1, 0 :: (store (s64))
47     ; CHECK-NEXT: RET undef $lr
48     early-clobber renamable $x1, renamable $x2 = LDRXpre killed renamable $x1, 24 :: (load (s64))
49     renamable $x3 = LDRXui renamable $x1, 1 :: (load (s64))
50     STRXui killed renamable $x2, renamable $x1, 0 :: (store (s64))
51     STRXui killed renamable $x3, renamable $x1, 1 :: (store (s64))
52     RET undef $lr
53 ...
56 ---
57 name:            3-ldrspre-ldrsui-merge
58 tracksRegLiveness: true
59 liveins:
60   - { reg: '$x1' }
61   - { reg: '$s0' }
62   - { reg: '$s1' }
63 machineFunctionInfo:
64   hasRedZone:      false
65 body:             |
66   bb.0:
67     liveins: $s0, $s1, $x1
68     ; CHECK-LABEL: name: 3-ldrspre-ldrsui-merge
69     ; CHECK: liveins: $s0, $s1, $x1
70     ; CHECK-NEXT: {{  $}}
71     ; CHECK-NEXT: early-clobber $x1, renamable $s0, renamable $s1 = LDPSpre renamable $x1, 3 :: (load (s32))
72     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
73     ; CHECK-NEXT: RET undef $lr
74     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 12 :: (load (s32))
75     renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
76     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
77     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
78     RET undef $lr
79 ...
82 ---
83 name:            4-ldrqdre-ldrdui-merge
84 tracksRegLiveness: true
85 liveins:
86   - { reg: '$x1' }
87   - { reg: '$d0' }
88   - { reg: '$d1' }
89 machineFunctionInfo:
90   hasRedZone:      false
91 body:             |
92   bb.0:
93     liveins: $d0, $d1, $x1
94     ; CHECK-LABEL: name: 4-ldrqdre-ldrdui-merge
95     ; CHECK: liveins: $d0, $d1, $x1
96     ; CHECK-NEXT: {{  $}}
97     ; CHECK-NEXT: early-clobber $x1, renamable $d0, renamable $d1 = LDPDpre renamable $x1, 16 :: (load (s64))
98     ; CHECK-NEXT: STPDi renamable $d0, renamable $d1, renamable $x1, 0 :: (store (s64))
99     ; CHECK-NEXT: RET undef $lr
100     early-clobber renamable $x1, renamable $d0 = LDRDpre killed renamable $x1, 128 :: (load (s64))
101     renamable $d1 = LDRDui renamable $x1, 1 :: (load (s64))
102     STRDui killed renamable $d0, renamable $x1, 0 :: (store (s64))
103     STRDui killed renamable $d1, renamable $x1, 1 :: (store (s64))
104     RET undef $lr
109 name:            5-ldrqpre-ldrqui-merge
110 alignment:       4
111 tracksRegLiveness: true
112 liveins:
113   - { reg: '$x1' }
114   - { reg: '$q0' }
115   - { reg: '$q1' }
116 frameInfo:
117   maxAlignment:    1
118   maxCallFrameSize: 0
119 machineFunctionInfo:
120   hasRedZone:      false
121 body:             |
122   bb.0:
123     liveins: $q0, $q1, $x1
124     ; CHECK-LABEL: name: 5-ldrqpre-ldrqui-merge
125     ; CHECK: liveins: $q0, $q1, $x1
126     ; CHECK-NEXT: {{  $}}
127     ; CHECK-NEXT: early-clobber $x1, renamable $q0, renamable $q1 = LDPQpre renamable $x1, 3 :: (load (s128))
128     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
129     ; CHECK-NEXT: RET undef $lr
130     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 48 :: (load (s128))
131     renamable $q1 = LDRQui renamable $x1, 1 :: (load (s128))
132     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
133     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
134     RET undef $lr
139 name:            6-ldrqui-ldrqpre-no-merge
140 alignment:       4
141 tracksRegLiveness: true
142 liveins:
143   - { reg: '$x1' }
144   - { reg: '$q0' }
145   - { reg: '$q1' }
146 frameInfo:
147   maxAlignment:    1
148   maxCallFrameSize: 0
149 machineFunctionInfo:
150   hasRedZone:      false
151 body:             |
152   bb.0:
153     liveins: $q0, $q1, $x1
154     ; CHECK-LABEL: name: 6-ldrqui-ldrqpre-no-merge
155     ; CHECK: liveins: $q0, $q1, $x1
156     ; CHECK-NEXT: {{  $}}
157     ; CHECK-NEXT: renamable $q1 = LDRQui renamable $x1, 1 :: (load (s128))
158     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 48, implicit $w1 :: (load (s128))
159     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
160     ; CHECK-NEXT: RET undef $lr
161     renamable $q1 = LDRQui renamable $x1, 1 :: (load (s128))
162     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 48 :: (load (s128))
163     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
164     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
165     RET undef $lr
170 name:            7-ldrqpre-ldrqui-max-offset-merge
171 alignment:       4
172 tracksRegLiveness: true
173 liveins:
174   - { reg: '$x1' }
175   - { reg: '$q0' }
176   - { reg: '$q1' }
177 frameInfo:
178   maxAlignment:    1
179   maxCallFrameSize: 0
180 machineFunctionInfo:
181   hasRedZone:      false
182 body:             |
183   bb.0:
184     liveins: $q0, $q1, $x1
185     ; CHECK-LABEL: name: 7-ldrqpre-ldrqui-max-offset-merge
186     ; CHECK: liveins: $q0, $q1, $x1
187     ; CHECK-NEXT: {{  $}}
188     ; CHECK-NEXT: early-clobber $x1, renamable $q0, renamable $q1 = LDPQpre renamable $x1, 15 :: (load (s128))
189     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
190     ; CHECK-NEXT: RET undef $lr
191     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 240 :: (load (s128))
192     renamable $q1 = LDRQui renamable $x1, 1 :: (load (s128))
193     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
194     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
195     RET undef $lr
200 name:            8-ldrqpre-ldrqui-min-offset-merge
201 alignment:       4
202 tracksRegLiveness: true
203 liveins:
204   - { reg: '$x1' }
205   - { reg: '$q0' }
206   - { reg: '$q1' }
207 frameInfo:
208   maxAlignment:    1
209   maxCallFrameSize: 0
210 machineFunctionInfo:
211   hasRedZone:      false
212 body:             |
213   bb.0:
214     liveins: $q0, $q1, $x1
215     ; CHECK-LABEL: name: 8-ldrqpre-ldrqui-min-offset-merge
216     ; CHECK: liveins: $q0, $q1, $x1
217     ; CHECK-NEXT: {{  $}}
218     ; CHECK-NEXT: early-clobber $x1, renamable $q0, renamable $q1 = LDPQpre renamable $x1, -16 :: (load (s128))
219     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
220     ; CHECK-NEXT: RET undef $lr
221     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, -256 :: (load (s128))
222     renamable $q1 = LDRQui renamable $x1, 1 :: (load (s128))
223     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
224     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
225     RET undef $lr
230 name:            9-ldrspre-ldrsui-mod-base-reg-no-merge
231 alignment:       4
232 tracksRegLiveness: true
233 liveins:
234   - { reg: '$x0' }
235   - { reg: '$x1' }
236   - { reg: '$s0' }
237   - { reg: '$s1' }
238 frameInfo:
239   maxAlignment:    1
240   maxCallFrameSize: 0
241 machineFunctionInfo:
242   hasRedZone:      false
243 body:             |
244   bb.0:
245     liveins: $s0, $s1, $x0, $x1
246     ; CHECK-LABEL: name: 9-ldrspre-ldrsui-mod-base-reg-no-merge
247     ; CHECK: liveins: $s0, $s1, $x0, $x1
248     ; CHECK-NEXT: {{  $}}
249     ; CHECK-NEXT: dead early-clobber renamable $x1, renamable $s0 = LDRSpre renamable $x1, 12, implicit $w1 :: (load (s32))
250     ; CHECK-NEXT: renamable $x1 = LDRXui renamable $x0, 1 :: (load (s64))
251     ; CHECK-NEXT: renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
252     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
253     ; CHECK-NEXT: RET undef $lr
254     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 12 :: (load (s32))
255     renamable $x1 = LDRXui renamable $x0, 1 :: (load (s64))
256     renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
257     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
258     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
259     RET undef $lr
264 name:            10-ldrspre-ldrsui-used-base-reg-no-merge
265 alignment:       4
266 tracksRegLiveness: true
267 liveins:
268   - { reg: '$x0' }
269   - { reg: '$x1' }
270   - { reg: '$s0' }
271   - { reg: '$s1' }
272 frameInfo:
273   maxAlignment:    1
274   maxCallFrameSize: 0
275 machineFunctionInfo:
276   hasRedZone:      false
277 body:             |
278   bb.0:
279     liveins: $s0, $s1, $x0, $x1
280     ; CHECK-LABEL: name: 10-ldrspre-ldrsui-used-base-reg-no-merge
281     ; CHECK: liveins: $s0, $s1, $x0, $x1
282     ; CHECK-NEXT: {{  $}}
283     ; CHECK-NEXT: early-clobber renamable $x1, renamable $s0 = LDRSpre renamable $x1, 12, implicit $w1 :: (load (s32))
284     ; CHECK-NEXT: renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))
285     ; CHECK-NEXT: STRXui renamable $x0, renamable $x0, 1 :: (store (s64))
286     ; CHECK-NEXT: renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
287     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
288     ; CHECK-NEXT: RET undef $lr
289     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 12 :: (load (s32))
290     renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))
291     STRXui killed renamable $x0, renamable $x0, 1 :: (store (s64))
292     renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
293     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
294     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
295     RET undef $lr
300 name:            11-ldrqpre-ldrqpre-no-merge
301 alignment:       4
302 tracksRegLiveness: true
303 liveins:
304   - { reg: '$x1' }
305   - { reg: '$q0' }
306   - { reg: '$q1' }
307 frameInfo:
308   maxAlignment:    1
309   maxCallFrameSize: 0
310 machineFunctionInfo:
311   hasRedZone:      false
312 body:             |
313   bb.0:
314     liveins: $q0, $q1, $x1
315     ; CHECK-LABEL: name: 11-ldrqpre-ldrqpre-no-merge
316     ; CHECK: liveins: $q0, $q1, $x1
317     ; CHECK-NEXT: {{  $}}
318     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $q0 = LDRQpre renamable $x1, 48, implicit $w1 :: (load (s128))
319     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $q1 = LDRQpre renamable $x1, 1, implicit $w1 :: (load (s128))
320     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $q0 = LDRQpre renamable $x1, 16, implicit $w1 :: (load (s128))
321     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $q1 = LDRQpre renamable $x1, 12, implicit $w1 :: (load (s128))
322     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 16, implicit $w1 :: (load (s128))
323     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q1 = LDRQpre renamable $x1, 16, implicit $w1 :: (load (s128))
324     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
325     ; CHECK-NEXT: RET undef $lr
326     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 48 :: (load (s128))
327     early-clobber renamable $x1, renamable $q1 = LDRQpre killed renamable $x1, 1  :: (load (s128))
328     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 16 :: (load (s128))
329     early-clobber renamable $x1, renamable $q1 = LDRQpre killed renamable $x1, 12  :: (load (s128))
330     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 16 :: (load (s128))
331     early-clobber renamable $x1, renamable $q1 = LDRQpre killed renamable $x1, 16  :: (load (s128))
332     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
333     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
334     RET undef $lr
339 name:            12-ldrspre-ldrsui-no-merge
340 tracksRegLiveness: true
341 liveins:
342   - { reg: '$x1' }
343   - { reg: '$s0' }
344   - { reg: '$s1' }
345 machineFunctionInfo:
346   hasRedZone:      false
347 body:             |
348   bb.0:
349     liveins: $s0, $s1, $x1
351     ; The offset of the second load is not equal to the
352     ; size of the destination register,  and hence can’t be merged.
354     ; CHECK-LABEL: name: 12-ldrspre-ldrsui-no-merge
355     ; CHECK: liveins: $s0, $s1, $x1
356     ; CHECK-NEXT: {{  $}}
357     ; CHECK-NEXT: early-clobber renamable $x1, renamable $s0 = LDRSpre renamable $x1, 12, implicit $w1 :: (load (s32))
358     ; CHECK-NEXT: renamable $s1 = LDRSui renamable $x1, 2 :: (load (s32))
359     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
360     ; CHECK-NEXT: RET undef $lr
361     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 12 :: (load (s32))
362     renamable $s1 = LDRSui renamable $x1, 2 :: (load (s32))
363     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
364     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
365     RET undef $lr
370 name:            13-ldrqpre-ldrdui-no-merge
371 alignment:       4
372 tracksRegLiveness: true
373 liveins:
374   - { reg: '$x1' }
375   - { reg: '$q0' }
376   - { reg: '$d1' }
377 frameInfo:
378   maxAlignment:    1
379   maxCallFrameSize: 0
380 machineFunctionInfo:
381   hasRedZone:      false
382 body:             |
383   bb.0:
384     liveins: $q0, $d1, $x1
385     ; CHECK-LABEL: name: 13-ldrqpre-ldrdui-no-merge
386     ; CHECK: liveins: $d1, $q0, $x1
387     ; CHECK-NEXT: {{  $}}
388     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 32, implicit $w1 :: (load (s128))
389     ; CHECK-NEXT: renamable $d1 = LDRDui renamable $x1, 1 :: (load (s64))
390     ; CHECK-NEXT: STRQui renamable $q0, renamable $x1, 0 :: (store (s128))
391     ; CHECK-NEXT: STRDui renamable $d1, renamable $x1, 1 :: (store (s64))
392     ; CHECK-NEXT: RET undef $lr
393     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
394     renamable $d1 = LDRDui renamable $x1, 1 :: (load (s64))
395     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
396     STRDui killed renamable $d1, renamable $x1, 1 :: (store (s64))
397     RET undef $lr
402 name:            14-ldrqpre-strqui-no-merge
403 alignment:       4
404 tracksRegLiveness: true
405 liveins:
406   - { reg: '$x1' }
407   - { reg: '$q0' }
408   - { reg: '$q1' }
409 frameInfo:
410   maxAlignment:    1
411   maxCallFrameSize: 0
412 machineFunctionInfo:
413   hasRedZone:      false
414 body:             |
415   bb.0:
416     liveins: $q0, $q1, $x1
417     ; CHECK-LABEL: name: 14-ldrqpre-strqui-no-merge
418     ; CHECK: liveins: $q0, $q1, $x1
419     ; CHECK-NEXT: {{  $}}
420     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 32, implicit $w1 :: (load (s128))
421     ; CHECK-NEXT: STRQui renamable $q0, renamable $x1, 0 :: (store (s128))
422     ; CHECK-NEXT: RET undef $lr
423     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
424     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
425     RET undef $lr
430 name:            15-ldrqpre-ldrqui-same-dst-reg-no-merge
431 alignment:       4
432 tracksRegLiveness: true
433 liveins:
434   - { reg: '$x1' }
435   - { reg: '$q0' }
436   - { reg: '$q1' }
437 frameInfo:
438   maxAlignment:    1
439   maxCallFrameSize: 0
440 machineFunctionInfo:
441   hasRedZone:      false
442 body:             |
443   bb.0:
444     liveins: $q0, $x1
445     ; CHECK-LABEL: name: 15-ldrqpre-ldrqui-same-dst-reg-no-merge
446     ; CHECK: liveins: $q0, $q1, $x1
447     ; CHECK-NEXT: {{  $}}
448     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $q0 = LDRQpre renamable $x1, 32, implicit $w1 :: (load (s128))
449     ; CHECK-NEXT: renamable $q0 = LDRQui renamable $x1, 1 :: (load (s128))
450     ; CHECK-NEXT: STRQui renamable $q0, renamable $x1, 0 :: (store (s128))
451     ; CHECK-NEXT: RET undef $lr
452     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
453     renamable $q0 = LDRQui renamable $x1, 1 :: (load (s128))
454     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
455     RET undef $lr
460 name:            16-ldrqpre-ldrqui-diff-base-reg-no-merge
461 alignment:       4
462 tracksRegLiveness: true
463 liveins:
464   - { reg: '$x1' }
465   - { reg: '$x2' }
466   - { reg: '$q0' }
467   - { reg: '$q1' }
468 frameInfo:
469   maxAlignment:    1
470   maxCallFrameSize: 0
471 machineFunctionInfo:
472   hasRedZone:      false
473 body:             |
474   bb.0:
475     liveins: $q0, $q1, $x1, $x2
476     ; CHECK-LABEL: name: 16-ldrqpre-ldrqui-diff-base-reg-no-merge
477     ; CHECK: liveins: $q0, $q1, $x1, $x2
478     ; CHECK-NEXT: {{  $}}
479     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 32, implicit $w1 :: (load (s128))
480     ; CHECK-NEXT: renamable $q1 = LDRQui renamable $x2, 1 :: (load (s128))
481     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
482     ; CHECK-NEXT: RET undef $lr
483     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
484     renamable $q1 = LDRQui renamable $x2, 1 :: (load (s128))
485     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
486     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
487     RET undef $lr
492 name:            17-ldrqpre-ldurqi-merge
493 alignment:       4
494 tracksRegLiveness: true
495 liveins:
496   - { reg: '$x1' }
497   - { reg: '$q0' }
498   - { reg: '$q1' }
499 frameInfo:
500   maxAlignment:    1
501   maxCallFrameSize: 0
502 machineFunctionInfo:
503   hasRedZone:      false
504 body:             |
505   bb.0:
506     liveins: $q0, $q1, $x1
507     ; CHECK-LABEL: name: 17-ldrqpre-ldurqi-merge
508     ; CHECK: liveins: $q0, $q1, $x1
509     ; CHECK-NEXT: {{  $}}
510     ; CHECK-NEXT: early-clobber $x1, renamable $q0, renamable $q1 = LDPQpre renamable $x1, 2 :: (load (s128))
511     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
512     ; CHECK-NEXT: RET undef $lr
513     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
514     renamable $q1 = LDURQi renamable $x1, 16 :: (load (s128))
515     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
516     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
517     RET undef $lr
522 name:            18-ldrqpre-ldurqi-no-merge
523 alignment:       4
524 tracksRegLiveness: true
525 liveins:
526   - { reg: '$x1' }
527   - { reg: '$q0' }
528   - { reg: '$q1' }
529 frameInfo:
530   maxAlignment:    1
531   maxCallFrameSize: 0
532 machineFunctionInfo:
533   hasRedZone:      false
534 body:             |
535   bb.0:
536     liveins: $q0, $q1, $x1
537     ; CHECK-LABEL: name: 18-ldrqpre-ldurqi-no-merge
538     ; CHECK: liveins: $q0, $q1, $x1
539     ; CHECK-NEXT: {{  $}}
540     ; CHECK-NEXT: early-clobber renamable $x1, renamable $q0 = LDRQpre renamable $x1, 32, implicit $w1 :: (load (s128))
541     ; CHECK-NEXT: renamable $q1 = LDURQi renamable $x1, 1 :: (load (s128))
542     ; CHECK-NEXT: STPQi renamable $q0, renamable $q1, renamable $x1, 0 :: (store (s128))
543     ; CHECK-NEXT: RET undef $lr
544     early-clobber renamable $x1, renamable $q0 = LDRQpre killed renamable $x1, 32 :: (load (s128))
545     renamable $q1 = LDURQi renamable $x1, 1 :: (load (s128))
546     STRQui killed renamable $q0, renamable $x1, 0 :: (store (s128))
547     STRQui killed renamable $q1, renamable $x1, 1 :: (store (s128))
548     RET undef $lr
553 name:            19-ldrspre-ldrsui-max-merge
554 tracksRegLiveness: true
555 liveins:
556   - { reg: '$x1' }
557   - { reg: '$s0' }
558   - { reg: '$s1' }
559 machineFunctionInfo:
560   hasRedZone:      false
561 body:             |
562   bb.0:
563     liveins: $s0, $s1, $x1
564     ; CHECK-LABEL: name: 19-ldrspre-ldrsui-max-merge
565     ; CHECK: liveins: $s0, $s1, $x1
566     ; CHECK-NEXT: {{  $}}
567     ; CHECK-NEXT: early-clobber $x1, renamable $s0, renamable $s1 = LDPSpre renamable $x1, 63 :: (load (s32))
568     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
569     ; CHECK-NEXT: RET undef $lr
570     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 252 :: (load (s32))
571     renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
572     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
573     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
574     RET undef $lr
579 name:            20-ldrspre-ldrsui-unaligned-no-merge
580 tracksRegLiveness: true
581 liveins:
582   - { reg: '$x1' }
583   - { reg: '$s0' }
584   - { reg: '$s1' }
585 machineFunctionInfo:
586   hasRedZone:      false
587 body:             |
588   bb.0:
589     liveins: $s0, $s1, $x1
590     ; CHECK-LABEL: name: 20-ldrspre-ldrsui-unaligned-no-merge
591     ; CHECK: liveins: $s0, $s1, $x1
592     ; CHECK-NEXT: {{  $}}
593     ; CHECK-NEXT: early-clobber renamable $x1, renamable $s0 = LDRSpre renamable $x1, 251, implicit $w1 :: (load (s32))
594     ; CHECK-NEXT: renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
595     ; CHECK-NEXT: STPSi renamable $s0, renamable $s1, renamable $x1, 0 :: (store (s32))
596     ; CHECK-NEXT: RET undef $lr
597     early-clobber renamable $x1, renamable $s0 = LDRSpre killed renamable $x1, 251 :: (load (s32))
598     renamable $s1 = LDRSui renamable $x1, 1 :: (load (s32))
599     STRSui killed renamable $s0, renamable $x1, 0 :: (store (s32))
600     STRSui killed renamable $s1, renamable $x1, 1 :: (store (s32))
601     RET undef $lr
606 name:            21-ldrswpre-ldrswui-merge
607 tracksRegLiveness: true
608 liveins:
609   - { reg: '$x0' }
610   - { reg: '$x1' }
611   - { reg: '$x2' }
612 machineFunctionInfo:
613   hasRedZone:      false
614 body:             |
615   bb.0:
616     liveins: $x0, $x1, $x2
617     ; CHECK-LABEL: name: 21-ldrswpre-ldrswui-merge
618     ; CHECK: liveins: $x0, $x1, $x2
619     ; CHECK-NEXT: {{  $}}
620     ; CHECK-NEXT: early-clobber $x1, renamable $x0, renamable $x2 = LDPSWpre renamable $x1, 10 :: (load (s32))
621     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
622     ; CHECK-NEXT: RET undef $lr
623     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
624     renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
625     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
626     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
627     RET undef $lr
632 name:            22-ldrswpre-ldurswi-merge
633 tracksRegLiveness: true
634 liveins:
635   - { reg: '$x0' }
636   - { reg: '$x1' }
637   - { reg: '$x2' }
638 machineFunctionInfo:
639   hasRedZone:      false
640 body:             |
641   bb.0:
642     liveins: $x0, $x1, $x2
643     ; CHECK-LABEL: name: 22-ldrswpre-ldurswi-merge
644     ; CHECK: liveins: $x0, $x1, $x2
645     ; CHECK-NEXT: {{  $}}
646     ; CHECK-NEXT: early-clobber $x1, renamable $x0, renamable $x2 = LDPSWpre renamable $x1, 10 :: (load (s32))
647     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
648     ; CHECK-NEXT: RET undef $lr
649     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
650     renamable $x2 = LDURSWi renamable $x1, 4 :: (load (s32))
651     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
652     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
653     RET undef $lr
658 name:            23-ldrswui-ldrswpre-no-merge
659 tracksRegLiveness: true
660 liveins:
661   - { reg: '$x0' }
662   - { reg: '$x1' }
663   - { reg: '$x2' }
664 machineFunctionInfo:
665   hasRedZone:      false
666 body:             |
667   bb.0:
668     liveins: $x0, $x1, $x2
669     ; CHECK-LABEL: name: 23-ldrswui-ldrswpre-no-merge
670     ; CHECK: liveins: $x0, $x1, $x2
671     ; CHECK-NEXT: {{  $}}
672     ; CHECK-NEXT: renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
673     ; CHECK-NEXT: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 40, implicit $w1 :: (load (s32))
674     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
675     ; CHECK-NEXT: RET undef $lr
676     renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
677     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
678     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
679     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
680     RET undef $lr
685 name:            24-ldurswi-ldrswpre-no-merge
686 tracksRegLiveness: true
687 liveins:
688   - { reg: '$x0' }
689   - { reg: '$x1' }
690   - { reg: '$x2' }
691 machineFunctionInfo:
692   hasRedZone:      false
693 body:             |
694   bb.0:
695     liveins: $x0, $x1, $x2
696     ; CHECK-LABEL: name: 24-ldurswi-ldrswpre-no-merge
697     ; CHECK: liveins: $x0, $x1, $x2
698     ; CHECK-NEXT: {{  $}}
699     ; CHECK-NEXT: renamable $x2 = LDURSWi renamable $x1, 4 :: (load (s32))
700     ; CHECK-NEXT: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 40, implicit $w1 :: (load (s32))
701     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
702     ; CHECK-NEXT: RET undef $lr
703     renamable $x2 = LDURSWi renamable $x1, 4 :: (load (s32))
704     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
705     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
706     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
707     RET undef $lr
712 name:            25-ldrswpre-ldrswpre-no-merge
713 tracksRegLiveness: true
714 liveins:
715   - { reg: '$x0' }
716   - { reg: '$x1' }
717   - { reg: '$x2' }
718 machineFunctionInfo:
719   hasRedZone:      false
720 body:             |
721   bb.0:
722     liveins: $x0, $x1, $x2
723     ; CHECK-LABEL: name: 25-ldrswpre-ldrswpre-no-merge
724     ; CHECK: liveins: $x0, $x1, $x2
725     ; CHECK-NEXT: {{  $}}
726     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $x0 = LDRSWpre renamable $x1, 48, implicit $w1 :: (load (s32))
727     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $x2 = LDRSWpre renamable $x1, 1, implicit $w1 :: (load (s32))
728     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $x0 = LDRSWpre renamable $x1, 16, implicit $w1 :: (load (s32))
729     ; CHECK-NEXT: early-clobber renamable $x1, dead renamable $x2 = LDRSWpre renamable $x1, 12, implicit $w1 :: (load (s32))
730     ; CHECK-NEXT: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 16, implicit $w1 :: (load (s32))
731     ; CHECK-NEXT: early-clobber renamable $x1, renamable $x2 = LDRSWpre renamable $x1, 16, implicit $w1 :: (load (s32))
732     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
733     ; CHECK-NEXT: RET undef $lr
734     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 48 :: (load (s32))
735     early-clobber renamable $x1, renamable $x2 = LDRSWpre killed renamable $x1, 1 :: (load (s32))
736     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 16 :: (load (s32))
737     early-clobber renamable $x1, renamable $x2 = LDRSWpre killed renamable $x1, 12 :: (load (s32))
738     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 16 :: (load (s32))
739     early-clobber renamable $x1, renamable $x2 = LDRSWpre killed renamable $x1, 16 :: (load (s32))
740     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
741     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
742     RET undef $lr
747 name:            26-ldrswpre-ldrwui-no-merge
748 tracksRegLiveness: true
749 liveins:
750   - { reg: '$x0' }
751   - { reg: '$x1' }
752   - { reg: '$x2' }
753 machineFunctionInfo:
754   hasRedZone:      false
755 body:             |
756   bb.0:
757     liveins: $x0, $x1, $x2
758     ; CHECK-LABEL: name: 26-ldrswpre-ldrwui-no-merge
759     ; CHECK: liveins: $x0, $x1, $x2
760     ; CHECK-NEXT: {{  $}}
761     ; CHECK-NEXT: early-clobber renamable $x1, renamable $x0 = LDRSWpre renamable $x1, 40, implicit $w1 :: (load (s32))
762     ; CHECK-NEXT: renamable $w2 = LDRWui renamable $x1, 1, implicit-def $x2 :: (load (s32))
763     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
764     ; CHECK-NEXT: RET undef $lr
765     early-clobber renamable $x1, renamable $x0 = LDRSWpre killed renamable $x1, 40 :: (load (s32))
766     renamable $w2 = LDRWui renamable $x1, 1 :: (load (s32))
767     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
768     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
769     RET undef $lr
774 name:            27-ldrwpre-ldrswui-no-merge
775 tracksRegLiveness: true
776 liveins:
777   - { reg: '$x0' }
778   - { reg: '$x1' }
779   - { reg: '$x2' }
780 machineFunctionInfo:
781   hasRedZone:      false
782 body:             |
783   bb.0:
784     liveins: $x0, $x1, $x2
785     ; CHECK-LABEL: name: 27-ldrwpre-ldrswui-no-merge
786     ; CHECK: liveins: $x0, $x1, $x2
787     ; CHECK-NEXT: {{  $}}
788     ; CHECK-NEXT: early-clobber renamable $x1, renamable $w0 = LDRWpre renamable $x1, 40, implicit $w1 :: (load (s32))
789     ; CHECK-NEXT: renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
790     ; CHECK-NEXT: STPXi renamable $x0, renamable $x2, renamable $x1, 0 :: (store (s64))
791     ; CHECK-NEXT: RET undef $lr
792     early-clobber renamable $x1, renamable $w0 = LDRWpre killed renamable $x1, 40 :: (load (s32))
793     renamable $x2 = LDRSWui renamable $x1, 1 :: (load (s32))
794     STRXui killed renamable $x0, renamable $x1, 0 :: (store (s64))
795     STRXui killed renamable $x2, renamable $x1, 1 :: (store (s64))
796     RET undef $lr
801 name:            28-ldrswpre-ldrwpre-no-merge
802 tracksRegLiveness: true
803 liveins:
804   - { reg: '$x11' }
805   - { reg: '$x13' }
806 machineFunctionInfo:
807   hasRedZone:      false
808 body:             |
809   bb.0:
810     liveins: $x11, $x13
811     ; CHECK-LABEL: name: 28-ldrswpre-ldrwpre-no-merge
812     ; CHECK: liveins: $x11, $x13
813     ; CHECK-NEXT: {{  $}}
814     ; CHECK-NEXT: early-clobber renamable $x11, dead renamable $x10 = LDRSWpre renamable $x11, 8, implicit $w11 :: (load (s32), align 8)
815     ; CHECK-NEXT: $x14 = EORXrs renamable $x11, renamable $x13, 0
816     ; CHECK-NEXT: early-clobber renamable $x11, dead renamable $w12 = LDRWpre renamable $x11, 4, implicit $w11 :: (load (s32))
817     ; CHECK-NEXT: $x13 = EORXrs renamable $x11, renamable $x13, 0
818     ; CHECK-NEXT: STPXi renamable $x13, renamable $x14, renamable $x11, 0 :: (store (s64))
819     ; CHECK-NEXT: RET undef $lr
820     early-clobber renamable $x11, renamable $x10 = LDRSWpre killed renamable $x11, 8 :: (load (s32), align 8)
821     $x14 = EORXrs renamable $x11, renamable $x13, 0
822     early-clobber renamable $x11, renamable $w12 = LDRWpre killed renamable $x11, 4 :: (load (s32))
823     $x13 = EORXrs renamable $x11, killed renamable $x13, 0
824     STRXui killed renamable $x13, renamable $x11, 0 :: (store (s64))
825     STRXui killed renamable $x14, renamable $x11, 1 :: (store (s64))
826     RET undef $lr
831 name:            29-ldrwpre-ldrswpre-no-merge
832 tracksRegLiveness: true
833 liveins:
834   - { reg: '$x11' }
835   - { reg: '$x13' }
836 machineFunctionInfo:
837   hasRedZone:      false
838 body:             |
839   bb.0:
840     liveins: $x11, $x13
841     ; CHECK-LABEL: name: 29-ldrwpre-ldrswpre-no-merge
842     ; CHECK: liveins: $x11, $x13
843     ; CHECK-NEXT: {{  $}}
844     ; CHECK-NEXT: early-clobber renamable $x11, dead renamable $w12 = LDRWpre renamable $x11, 8, implicit $w11 :: (load (s32))
845     ; CHECK-NEXT: $x14 = EORXrs renamable $x11, renamable $x13, 0
846     ; CHECK-NEXT: early-clobber renamable $x11, dead renamable $x10 = LDRSWpre renamable $x11, 4, implicit $w11 :: (load (s32), align 8)
847     ; CHECK-NEXT: $x13 = EORXrs renamable $x11, renamable $x13, 0
848     ; CHECK-NEXT: STPXi renamable $x13, renamable $x14, renamable $x11, 0 :: (store (s64))
849     ; CHECK-NEXT: RET undef $lr
850     early-clobber renamable $x11, renamable $w12 = LDRWpre killed renamable $x11, 8 :: (load (s32))
851     $x14 = EORXrs renamable $x11, renamable $x13, 0
852     early-clobber renamable $x11, renamable $x10 = LDRSWpre killed renamable $x11, 4 :: (load (s32), align 8)
853     $x13 = EORXrs renamable $x11, killed renamable $x13, 0
854     STRXui killed renamable $x13, renamable $x11, 0 :: (store (s64))
855     STRXui killed renamable $x14, renamable $x11, 1 :: (store (s64))
856     RET undef $lr