[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / strpre-str-merge.mir
blob5c1937e0d7753e9c928c43bfab46ae8bcbca01da
1 # RUN: llc -o - %s -mtriple=aarch64 -mcpu=cortex-a55 -lsr-preferred-addressing-mode=preindexed -stop-after=aarch64-ldst-opt | FileCheck %s
3 ---
4 name:            1-strwpre-strwui-merge
5 alignment:       4
6 tracksRegLiveness: true
7 liveins:
8   - { reg: '$x0' }
9   - { reg: '$w1' }
10   - { reg: '$w2' }
11 frameInfo:
12   maxAlignment:    1
13   maxCallFrameSize: 0
14 machineFunctionInfo:
15   hasRedZone:      false
16 body:             |
17   bb.0.entry:
18     liveins: $w1, $w2, $x0
19     ; CHECK-LABEL: name: 1-strwpre-strwui-merge
20     ; CHECK: liveins: $w1, $w2, $x0
21     ; CHECK: early-clobber $x0 = STPWpre renamable $w1, renamable $w2, renamable $x0, 5 :: (store (s32))
22     ; CHECK: RET undef $lr, implicit $x0
23     early-clobber renamable $x0 = STRWpre killed renamable $w1, killed renamable $x0, 20 :: (store (s32))
24     STRWui killed renamable $w2, renamable $x0, 1 :: (store (s32))
25     RET undef $lr, implicit $x0
27 ...
30 ---
31 name:            2-strxpre-strxui-merge
32 alignment:       4
33 tracksRegLiveness: true
34 liveins:
35   - { reg: '$x0' }
36   - { reg: '$x1' }
37   - { reg: '$x2' }
38 frameInfo:
39   maxAlignment:    1
40   maxCallFrameSize: 0
41 machineFunctionInfo:
42   hasRedZone:      false
43 body:             |
44   bb.0.entry:
45     liveins: $x0, $x1, $x2
47     ; CHECK-LABEL: name: 2-strxpre-strxui-merge
48     ; CHECK: liveins: $x0, $x1, $x2
49     ; CHECK: early-clobber $x0 = STPXpre renamable $x1, renamable $x2, renamable $x0, 3 :: (store (s64))
50     ; CHECK: RET undef $lr, implicit $x0
51     early-clobber renamable $x0 = STRXpre killed renamable $x1, killed renamable $x0, 24 :: (store (s64))
52     STRXui killed renamable $x2, renamable $x0, 1 :: (store (s64))
53     RET undef $lr, implicit $x0
55 ...
58 ---
59 name:            3-strspre-strsui-merge
60 alignment:       4
61 tracksRegLiveness: true
62 liveins:
63   - { reg: '$x0' }
64   - { reg: '$s0' }
65   - { reg: '$s1' }
66 frameInfo:
67   maxAlignment:    1
68   maxCallFrameSize: 0
69 machineFunctionInfo:
70   hasRedZone:      false
71 body:             |
72   bb.0.entry:
73     liveins: $s0, $s1, $x0
74     ; CHECK-LABEL: name: 3-strspre-strsui-merge
75     ; CHECK: liveins: $s0, $s1, $x0
76     ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, 3 :: (store (s32))
77     ; CHECK: RET undef $lr, implicit $x0
78     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))
79     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
80     RET undef $lr, implicit $x0
81 ...
84 ---
85 name:            4-strdpre-strdui-merge
86 alignment:       4
87 tracksRegLiveness: true
88 liveins:
89   - { reg: '$x0' }
90   - { reg: '$d0' }
91   - { reg: '$d1' }
92 frameInfo:
93   maxAlignment:    1
94   maxCallFrameSize: 0
95 machineFunctionInfo:
96   hasRedZone:      false
97 body:             |
98   bb.0.entry:
99     liveins: $d0, $d1, $x0
101     ; CHECK-LABEL: name: 4-strdpre-strdui-merge
102     ; CHECK: liveins: $d0, $d1, $x0
103     ; CHECK: early-clobber $x0 = STPDpre renamable $d0, renamable $d1, renamable $x0, 16 :: (store (s64))
104     ; CHECK: RET undef $lr, implicit $x0
105     early-clobber renamable $x0 = STRDpre killed renamable $d0, killed renamable $x0, 128 :: (store (s64))
106     STRDui killed renamable $d1, renamable $x0, 1 :: (store (s64))
107     RET undef $lr, implicit $x0
113 name:            5-strqpre-strqui-merge
114 alignment:       4
115 tracksRegLiveness: true
116 liveins:
117   - { reg: '$x0' }
118   - { reg: '$q0' }
119   - { reg: '$q1' }
120 frameInfo:
121   maxAlignment:    1
122   maxCallFrameSize: 0
123 machineFunctionInfo:
124   hasRedZone:      false
125 body:             |
126   bb.0.entry:
127     liveins: $q0, $q1, $x0
129     ; CHECK-LABEL: name: 5-strqpre-strqui-merge
130     ; CHECK: liveins: $q0, $q1, $x0
131     ; CHECK: early-clobber $x0 = STPQpre renamable $q0, renamable $q1, renamable $x0, 3 :: (store (s128))
132     ; CHECK: RET undef $lr, implicit $x0
133     early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))
134     STRQui killed renamable $q1, renamable $x0, 1 :: (store (s128))
135     RET undef $lr, implicit $x0
141 name:            6-strqui-strqpre-no-merge
142 alignment:       4
143 tracksRegLiveness: true
144 liveins:
145   - { reg: '$x0' }
146   - { reg: '$q0' }
147   - { reg: '$q1' }
148 frameInfo:
149   maxAlignment:    1
150   maxCallFrameSize: 0
151 machineFunctionInfo:
152   hasRedZone:      false
153 body:             |
154   bb.0.entry:
155     liveins: $q0, $q1, $x0
156     ; CHECK-LABEL: name: 6-strqui-strqpre-no-merge
157     ; CHECK: liveins: $q0, $q1, $x0
158     ; CHECK: STRQui renamable $q1, renamable $x0, 1 :: (store (s128))
159     ; CHECK: early-clobber renamable $x0 = STRQpre renamable $q0, renamable $x0, 48, implicit $w0, implicit $w0_hi :: (store (s128))
160     ; CHECK: RET undef $lr, implicit $x0
161     STRQui killed renamable $q1, renamable $x0, 1 :: (store (s128))
162     early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))
163     RET undef $lr, implicit $x0
168 name:            7-strspre-strsui-max-offset-merge
169 alignment:       4
170 tracksRegLiveness: true
171 liveins:
172   - { reg: '$x0' }
173   - { reg: '$s0' }
174   - { reg: '$s1' }
175 frameInfo:
176   maxAlignment:    1
177   maxCallFrameSize: 0
178 machineFunctionInfo:
179   hasRedZone:      false
180 body:             |
181   bb.0.entry:
182     liveins: $s0, $s1, $x0
183     ; CHECK-LABEL: name: 7-strspre-strsui-max-offset-merge
184     ; CHECK: liveins: $s0, $s1, $x0
185     ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, 63 :: (store (s32))
186     ; CHECK: RET undef $lr, implicit $x0
187     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 252 :: (store (s32))
188     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
189     RET undef $lr, implicit $x0
194 name:            8-strspre-strsui-min-offset-merge
195 alignment:       4
196 tracksRegLiveness: true
197 liveins:
198   - { reg: '$x0' }
199   - { reg: '$s0' }
200   - { reg: '$s1' }
201 frameInfo:
202   maxAlignment:    1
203   maxCallFrameSize: 0
204 machineFunctionInfo:
205   hasRedZone:      false
206 body:             |
207   bb.0.entry:
208     liveins: $s0, $s1, $x0
209     ; CHECK-LABEL: name: 8-strspre-strsui-min-offset-merge
210     ; CHECK: liveins: $s0, $s1, $x0
211     ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, -64 :: (store (s32))
212     ; CHECK: RET undef $lr, implicit $x0
213     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, -256 :: (store (s32))
214     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
215     RET undef $lr, implicit $x0
220 name:            9-strspre-strsui-mod-base-reg-no-merge
221 alignment:       4
222 tracksRegLiveness: true
223 liveins:
224   - { reg: '$x0' }
225   - { reg: '$x1' }
226   - { reg: '$s0' }
227   - { reg: '$s1' }
228 frameInfo:
229   maxAlignment:    1
230   maxCallFrameSize: 0
231 machineFunctionInfo:
232   hasRedZone:      false
233 body:             |
234   bb.0.entry:
235     liveins: $s0, $s1, $x0, $x1
236     ; CHECK-LABEL: name: 9-strspre-strsui-mod-base-reg-no-merge
237     ; CHECK: liveins: $s0, $s1, $x0, $x1
238     ; CHECK: dead early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))
239     ; CHECK: renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))
240     ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))
241     ; CHECK: RET undef $lr, implicit $x0
242     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))
243     renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))
244     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
245     RET undef $lr, implicit $x0
250 name:            10-strspre-strsui-used-base-reg-no-merge
251 alignment:       4
252 tracksRegLiveness: true
253 liveins:
254   - { reg: '$x0' }
255   - { reg: '$x1' }
256   - { reg: '$s0' }
257   - { reg: '$s1' }
258 frameInfo:
259   maxAlignment:    1
260   maxCallFrameSize: 0
261 machineFunctionInfo:
262   hasRedZone:      false
263 body:             |
264   bb.0.entry:
265     liveins: $s0, $s1, $x0, $x1
266     ; CHECK-LABEL: name: 10-strspre-strsui-used-base-reg-no-merge
267     ; CHECK: liveins: $s0, $s1, $x0, $x1
268     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))
269     ; CHECK: STRXui renamable $x1, renamable $x1, 1 :: (store (s32))
270     ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))
271     ; CHECK: RET undef $lr, implicit $x0
272     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))
274     STRXui killed renamable $x1, renamable $x1, 1 :: (store (s32))
276     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
277     RET undef $lr, implicit $x0
282 name:            11-strspre-strspre-no-merge
283 alignment:       4
284 tracksRegLiveness: true
285 liveins:
286   - { reg: '$x0' }
287   - { reg: '$s0' }
288   - { reg: '$s1' }
289 frameInfo:
290   maxAlignment:    1
291   maxCallFrameSize: 0
292 machineFunctionInfo:
293   hasRedZone:      false
294 body:             |
295   bb.0.entry:
296     liveins: $s0, $s1, $x0
297     ; CHECK-LABEL: name: 11-strspre-strspre-no-merge
298     ; CHECK: liveins: $s0, $s1, $x0
299     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))
300     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 16, implicit $w0, implicit $w0_hi :: (store (s32))
301     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))
302     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))
303     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))
304     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))
305     ; CHECK: RET undef $lr, implicit $x0
306     early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 12 :: (store (s32))
307     early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 16 :: (store (s32))
308     early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 4 :: (store (s32))
309     early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 12 :: (store (s32))
310     early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 4 :: (store (s32))
311     early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 4 :: (store (s32))
312     RET undef $lr, implicit $x0
317 name:            12-strspre-strsui-no-merge
318 alignment:       4
319 tracksRegLiveness: true
320 liveins:
321   - { reg: '$x0' }
322   - { reg: '$s0' }
323   - { reg: '$s1' }
324 frameInfo:
325   maxAlignment:    1
326   maxCallFrameSize: 0
327 machineFunctionInfo:
328   hasRedZone:      false
329 body:             |
330   bb.0.entry:
332     ; The offset of the second st is not equal to the
333     ; size of the destination register,  and hence can’t be merged.
335     liveins: $s0, $s1, $x0
336     ; CHECK-LABEL: name: 12-strspre-strsui-no-merge
337     ; CHECK: liveins: $s0, $s1, $x0
338     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))
339     ; CHECK: STRSui renamable $s1, renamable $x0, 2 :: (store (s32))
340     ; CHECK: RET undef $lr, implicit $x0
341     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))
342     STRSui killed renamable $s1, renamable $x0, 2 :: (store (s32))
343     RET undef $lr, implicit $x0
348 name:            13-strqpre-sturqi-merge
349 alignment:       4
350 tracksRegLiveness: true
351 liveins:
352   - { reg: '$x0' }
353   - { reg: '$q0' }
354   - { reg: '$q1' }
355 frameInfo:
356   maxAlignment:    1
357   maxCallFrameSize: 0
358 machineFunctionInfo:
359   hasRedZone:      false
360 body:             |
361   bb.0.entry:
362     liveins: $q0, $q1, $x0
364     ; CHECK-LABEL: name: 13-strqpre-sturqi-merge
365     ; CHECK: liveins: $q0, $q1, $x0
366     ; CHECK: early-clobber $x0 = STPQpre renamable $q0, renamable $q1, renamable $x0, 3 :: (store (s128))
367     ; CHECK: RET undef $lr, implicit $x0
368     early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))
369     STURQi killed renamable $q1, renamable $x0, 16 :: (store (s128))
370     RET undef $lr, implicit $x0
376 name:            14-strqpre-sturqi-no-merge
377 alignment:       4
378 tracksRegLiveness: true
379 liveins:
380   - { reg: '$x0' }
381   - { reg: '$q0' }
382   - { reg: '$q1' }
383 frameInfo:
384   maxAlignment:    1
385   maxCallFrameSize: 0
386 machineFunctionInfo:
387   hasRedZone:      false
388 body:             |
389   bb.0.entry:
390     liveins: $q0, $q1, $x0
391     ; CHECK-LABEL: name: 14-strqpre-sturqi-no-merge
392     ; CHECK: liveins: $q0, $q1, $x0
393     ; CHECK: early-clobber renamable $x0 = STRQpre renamable $q0, renamable $x0, 48, implicit $w0, implicit $w0_hi :: (store (s128))
394     ; CHECK: STURQi renamable $q1, renamable $x0, 1 :: (store (s128))
395     ; CHECK: RET undef $lr, implicit $x0
396     early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))
397     STURQi killed renamable $q1, renamable $x0, 1 :: (store (s128))
398     RET undef $lr, implicit $x0
403 name:            15-strspre-strsui-unaligned-no-merge
404 alignment:       4
405 tracksRegLiveness: true
406 liveins:
407   - { reg: '$x0' }
408   - { reg: '$s0' }
409   - { reg: '$s1' }
410 frameInfo:
411   maxAlignment:    1
412   maxCallFrameSize: 0
413 machineFunctionInfo:
414   hasRedZone:      false
415 body:             |
416   bb.0.entry:
417     liveins: $s0, $s1, $x0
418     ; CHECK-LABEL: name: 15-strspre-strsui-unaligned-no-merge
419     ; CHECK: liveins: $s0, $s1, $x0
420     ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 251, implicit $w0, implicit $w0_hi :: (store (s32))
421     ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))
422     ; CHECK: RET undef $lr, implicit $x0
423     early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 251 :: (store (s32))
424     STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))
425     RET undef $lr, implicit $x0
429 name:            16-strxpre-strxui-same-reg-no-merge
430 alignment:       4
431 tracksRegLiveness: true
432 liveins:
433   - { reg: '$x0' }
434   - { reg: '$x1' }
435   - { reg: '$x2' }
436 frameInfo:
437   maxAlignment:    1
438   maxCallFrameSize: 0
439 machineFunctionInfo:
440   hasRedZone:      false
441 body:             |
442   bb.0.entry:
443     liveins: $x0, $x1, $x2
444     ; CHECK-LABEL: name: 16-strxpre-strxui-same-reg-no-merge
445     ; CHECK: liveins: $x0, $x1, $x2
446     ; CHECK: early-clobber renamable $x0 = STRXpre renamable $x1, renamable $x0, 24, implicit $w0, implicit $w0_hi :: (store (s64))
447     ; CHECK: STRXui renamable $x0, renamable $x0, 1 :: (store (s64))
448     ; CHECK: RET undef $lr, implicit $x0
449     early-clobber renamable $x0 = STRXpre killed renamable $x1, killed renamable $x0, 24 :: (store (s64))
450     STRXui renamable $x0, renamable $x0, 1 :: (store (s64))
451     RET undef $lr, implicit $x0
456 name:            17-strwpre-strwui-same-reg-no-merge
457 alignment:       4
458 tracksRegLiveness: true
459 liveins:
460   - { reg: '$x0' }
461   - { reg: '$x1' }
462   - { reg: '$x2' }
463 frameInfo:
464   maxAlignment:    1
465   maxCallFrameSize: 0
466 machineFunctionInfo:
467   hasRedZone:      false
468 body:             |
469   bb.0.entry:
470     liveins: $x0, $x1, $x2
471     ; CHECK-LABEL: name: 17-strwpre-strwui-same-reg-no-merge
472     ; CHECK: liveins: $x0, $x1, $x2
473     ; CHECK: early-clobber renamable $x0 = STRWpre renamable $w1, renamable $x0, 24, implicit $w0, implicit $w0_hi, implicit-def $w0 :: (store (s32))
474     ; CHECK: STRWui renamable $w0, renamable $x0, 1 :: (store (s32))
475     ; CHECK: RET undef $lr, implicit $x0
476     early-clobber renamable $x0 = STRWpre killed renamable $w1, killed renamable $x0, 24 :: (store (s32))
477     STRWui renamable $w0, renamable $x0, 1 :: (store (s32))
478     RET undef $lr, implicit $x0