[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / legalize-memcpy-et-al.mir
blob627b98bef44a3637d246d8890e6569a4a432424b
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-- -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
3 # RUN: llc -debugify-and-strip-all-safe -mtriple=aarch64-- -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
4 ---
5 name:            test_memcpy
6 tracksRegLiveness: true
7 body:             |
8   bb.1:
9     liveins: $w2, $x0, $x1
11     ; CHECK-LABEL: name: test_memcpy
12     ; CHECK: liveins: $w2, $x0, $x1
13     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
14     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
15     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
16     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
17     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
18     ; CHECK: $x0 = COPY [[COPY]](p0)
19     ; CHECK: $x1 = COPY [[COPY1]](p0)
20     ; CHECK: $x2 = COPY [[ZEXT]](s64)
21     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
22     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
23     ; CHECK: RET_ReallyLR
24     %0:_(p0) = COPY $x0
25     %1:_(p0) = COPY $x1
26     %2:_(s32) = COPY $w2
27     %3:_(s64) = G_ZEXT %2(s32)
28     G_MEMCPY %0(p0), %1(p0), %3(s64), 0 :: (store unknown-size), (load unknown-size)
29     RET_ReallyLR
31 ...
32 ---
33 name:            test_memcpy_tail
34 tracksRegLiveness: true
35 body:             |
36   bb.1:
37     liveins: $w2, $x0, $x1
39     ; CHECK-LABEL: name: test_memcpy_tail
40     ; CHECK: liveins: $w2, $x0, $x1
41     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
42     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
43     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
44     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
45     ; CHECK: $x0 = COPY [[COPY]](p0)
46     ; CHECK: $x1 = COPY [[COPY1]](p0)
47     ; CHECK: $x2 = COPY [[ZEXT]](s64)
48     ; CHECK: TCRETURNdi &memcpy, 0, csr_aarch64_aapcs, implicit $sp, implicit $x0, implicit $x1, implicit $x2
49     %0:_(p0) = COPY $x0
50     %1:_(p0) = COPY $x1
51     %2:_(s32) = COPY $w2
52     %3:_(s64) = G_ZEXT %2(s32)
53     G_MEMCPY %0(p0), %1(p0), %3(s64), 1 :: (store unknown-size), (load unknown-size)
54     RET_ReallyLR
56 ...
57 ---
58 name:            test_memmove
59 tracksRegLiveness: true
60 body:             |
61   bb.1:
62     liveins: $w2, $x0, $x1
64     ; CHECK-LABEL: name: test_memmove
65     ; CHECK: liveins: $w2, $x0, $x1
66     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
67     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
68     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
69     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
70     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
71     ; CHECK: $x0 = COPY [[COPY]](p0)
72     ; CHECK: $x1 = COPY [[COPY1]](p0)
73     ; CHECK: $x2 = COPY [[ZEXT]](s64)
74     ; CHECK: BL &memmove, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
75     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
76     ; CHECK: RET_ReallyLR
77     %0:_(p0) = COPY $x0
78     %1:_(p0) = COPY $x1
79     %2:_(s32) = COPY $w2
80     %3:_(s64) = G_ZEXT %2(s32)
81     G_MEMMOVE %0(p0), %1(p0), %3(s64), 0 :: (store unknown-size), (load unknown-size)
82     RET_ReallyLR
84 ...
85 ---
86 name:            test_memset
87 tracksRegLiveness: true
88 body:             |
89   bb.1:
90     liveins: $w1, $w2, $x0
92     ; CHECK-LABEL: name: test_memset
93     ; CHECK: liveins: $w1, $w2, $x0
94     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
95     ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
96     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
97     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
98     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
99     ; CHECK: $x0 = COPY [[COPY]](p0)
100     ; CHECK: $w1 = COPY [[COPY1]](s32)
101     ; CHECK: $x2 = COPY [[ZEXT]](s64)
102     ; CHECK: BL &memset, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $w1, implicit $x2
103     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
104     ; CHECK: RET_ReallyLR
105     %0:_(p0) = COPY $x0
106     %1:_(s32) = COPY $w1
107     %2:_(s32) = COPY $w2
108     %3:_(s8) = G_TRUNC %1(s32)
109     %4:_(s64) = G_ZEXT %2(s32)
110     G_MEMSET %0(p0), %3(s8), %4(s64), 0 :: (store unknown-size)
111     RET_ReallyLR
115 name:            no_tail_call
116 tracksRegLiveness: true
117 body:             |
118   bb.1:
119     liveins: $w2, $x0, $x1
121     ; CHECK-LABEL: name: no_tail_call
122     ; CHECK: liveins: $w2, $x0, $x1
123     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x1
124     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x0
125     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
126     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
127     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
128     ; CHECK: $x0 = COPY [[COPY]](p0)
129     ; CHECK: $x1 = COPY [[COPY1]](p0)
130     ; CHECK: $x2 = COPY [[ZEXT]](s64)
131     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
132     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
133     ; CHECK: $x0 = COPY [[ZEXT]](s64)
134     ; CHECK: RET_ReallyLR implicit $x0
135     %0:_(p0) = COPY $x1
136     %1:_(p0) = COPY $x0
137     %2:_(s32) = COPY $w2
138     %3:_(s64) = G_ZEXT %2(s32)
139     G_MEMCPY %0(p0), %1(p0), %3(s64), 1 :: (store unknown-size), (load unknown-size)
140     $x0 = COPY %3
141     RET_ReallyLR implicit $x0
145 name:            dont_tc_twice
146 tracksRegLiveness: true
147 body:             |
148   bb.1:
149     liveins: $w2, $x0, $x1
150     ; CHECK-LABEL: name: dont_tc_twice
151     ; CHECK: liveins: $w2, $x0, $x1
152     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
153     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
154     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
155     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY2]](s32)
156     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
157     ; CHECK: $x0 = COPY [[COPY]](p0)
158     ; CHECK: $x1 = COPY [[COPY1]](p0)
159     ; CHECK: $x2 = COPY [[ZEXT]](s64)
160     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
161     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
162     ; CHECK: TCRETURNdi &memset, 0, csr_aarch64_aapcs, implicit $sp
163     %0:_(p0) = COPY $x0
164     %1:_(p0) = COPY $x1
165     %2:_(s32) = COPY $w2
166     %4:_(s1) = G_CONSTANT i1 false
167     %3:_(s64) = G_ZEXT %2(s32)
168     G_MEMCPY %0(p0), %1(p0), %3(s64), 1 :: (store unknown-size), (load unknown-size)
169     TCRETURNdi &memset, 0, csr_aarch64_aapcs, implicit $sp
173 name:            tail_with_copy_ret
174 alignment:       4
175 tracksRegLiveness: true
176 registers:
177   - { id: 0, class: _ }
178   - { id: 1, class: _ }
179   - { id: 2, class: _ }
180 liveins:
181   - { reg: '$x0' }
182   - { reg: '$x1' }
183   - { reg: '$x2' }
184 frameInfo:
185   maxAlignment:    1
186 machineFunctionInfo: {}
187 body:             |
188   bb.1.entry:
189     liveins: $x0, $x1, $x2
191     ; CHECK-LABEL: name: tail_with_copy_ret
192     ; CHECK: liveins: $x0, $x1, $x2
193     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
194     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
195     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
196     ; CHECK: $x0 = COPY [[COPY]](p0)
197     ; CHECK: $x1 = COPY [[COPY1]](p0)
198     ; CHECK: $x2 = COPY [[COPY2]](s64)
199     ; CHECK: TCRETURNdi &memcpy, 0, csr_aarch64_aapcs, implicit $sp, implicit $x0, implicit $x1, implicit $x2
200     %0:_(p0) = COPY $x0
201     %1:_(p0) = COPY $x1
202     %2:_(s64) = COPY $x2
203     G_MEMCPY %0(p0), %1(p0), %2(s64), 1 :: (store (s8)), (load (s8))
204     $x0 = COPY %0(p0)
205     RET_ReallyLR implicit $x0
209 name:            dont_tc_mismatched_copies
210 alignment:       4
211 tracksRegLiveness: true
212 registers:
213   - { id: 0, class: _ }
214   - { id: 1, class: _ }
215   - { id: 2, class: _ }
216 liveins:
217   - { reg: '$x0' }
218   - { reg: '$x1' }
219   - { reg: '$x2' }
220 frameInfo:
221   maxAlignment:    1
222 machineFunctionInfo: {}
223 body:             |
224   bb.1.entry:
225     liveins: $x0, $x1, $x2
227     ; CHECK-LABEL: name: dont_tc_mismatched_copies
228     ; CHECK: liveins: $x0, $x1, $x2
229     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
230     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
231     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
232     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
233     ; CHECK: $x0 = COPY [[COPY]](p0)
234     ; CHECK: $x1 = COPY [[COPY1]](p0)
235     ; CHECK: $x2 = COPY [[COPY2]](s64)
236     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
237     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
238     ; CHECK: $x1 = COPY [[COPY]](p0)
239     ; CHECK: RET_ReallyLR implicit $x0
240     %0:_(p0) = COPY $x0
241     %1:_(p0) = COPY $x1
242     %2:_(s64) = COPY $x2
243     G_MEMCPY %0(p0), %1(p0), %2(s64), 1 :: (store (s8)), (load (s8))
244     $x1 = COPY %0(p0)
245     RET_ReallyLR implicit $x0
249 name:            dont_tc_extra_copy
250 alignment:       4
251 tracksRegLiveness: true
252 registers:
253   - { id: 0, class: _ }
254   - { id: 1, class: _ }
255   - { id: 2, class: _ }
256 liveins:
257   - { reg: '$x0' }
258   - { reg: '$x1' }
259   - { reg: '$x2' }
260 frameInfo:
261   maxAlignment:    1
262 machineFunctionInfo: {}
263 body:             |
264   bb.1.entry:
265     liveins: $x0, $x1, $x2
267     ; CHECK-LABEL: name: dont_tc_extra_copy
268     ; CHECK: liveins: $x0, $x1, $x2
269     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
270     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
271     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
272     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
273     ; CHECK: $x0 = COPY [[COPY]](p0)
274     ; CHECK: $x1 = COPY [[COPY1]](p0)
275     ; CHECK: $x2 = COPY [[COPY2]](s64)
276     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
277     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
278     ; CHECK: $x0 = COPY [[COPY]](p0)
279     ; CHECK: $x0 = COPY [[COPY]](p0)
280     ; CHECK: RET_ReallyLR implicit $x0
281     %0:_(p0) = COPY $x0
282     %1:_(p0) = COPY $x1
283     %2:_(s64) = COPY $x2
284     G_MEMCPY %0(p0), %1(p0), %2(s64), 1 :: (store (s8)), (load (s8))
285     $x0 = COPY %0(p0)
286     $x0 = COPY %0(p0)
287     RET_ReallyLR implicit $x0
291 name:            dont_tc_mismatched_ret
292 alignment:       4
293 tracksRegLiveness: true
294 registers:
295   - { id: 0, class: _ }
296   - { id: 1, class: _ }
297   - { id: 2, class: _ }
298 liveins:
299   - { reg: '$x0' }
300   - { reg: '$x1' }
301   - { reg: '$x2' }
302 frameInfo:
303   maxAlignment:    1
304 machineFunctionInfo: {}
305 body:             |
306   bb.1.entry:
307     liveins: $x0, $x1, $x2
309     ; CHECK-LABEL: name: dont_tc_mismatched_ret
310     ; CHECK: liveins: $x0, $x1, $x2
311     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x1
312     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x0
313     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
314     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
315     ; CHECK: $x0 = COPY [[COPY]](p0)
316     ; CHECK: $x1 = COPY [[COPY1]](p0)
317     ; CHECK: $x2 = COPY [[COPY2]](s64)
318     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
319     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
320     ; CHECK: $x1 = COPY [[COPY]](p0)
321     ; CHECK: RET_ReallyLR implicit $x0
322     %0:_(p0) = COPY $x1
323     %1:_(p0) = COPY $x0
324     %2:_(s64) = COPY $x2
325     G_MEMCPY %0(p0), %1(p0), %2(s64), 1 :: (store (s8)), (load (s8))
326     $x1 = COPY %0(p0)
327     RET_ReallyLR implicit $x0
331 name:            dont_tc_ret_void_copy
332 alignment:       4
333 tracksRegLiveness: true
334 registers:
335   - { id: 0, class: _ }
336   - { id: 1, class: _ }
337   - { id: 2, class: _ }
338 liveins:
339   - { reg: '$x0' }
340   - { reg: '$x1' }
341   - { reg: '$x2' }
342 frameInfo:
343   maxAlignment:    1
344 machineFunctionInfo: {}
345 body:             |
346   bb.1.entry:
347     liveins: $x0, $x1, $x2
349     ; CHECK-LABEL: name: dont_tc_ret_void_copy
350     ; CHECK: liveins: $x0, $x1, $x2
351     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
352     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
353     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
354     ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
355     ; CHECK: $x0 = COPY [[COPY]](p0)
356     ; CHECK: $x1 = COPY [[COPY1]](p0)
357     ; CHECK: $x2 = COPY [[COPY2]](s64)
358     ; CHECK: BL &memcpy, csr_aarch64_aapcs_thisreturn, implicit-def $lr, implicit $sp, implicit $x0, implicit $x1, implicit $x2
359     ; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
360     ; CHECK: $x0 = COPY [[COPY]](p0)
361     ; CHECK: RET_ReallyLR
362     %0:_(p0) = COPY $x0
363     %1:_(p0) = COPY $x1
364     %2:_(s64) = COPY $x2
365     G_MEMCPY %0(p0), %1(p0), %2(s64), 1 :: (store (s8)), (load (s8))
366     $x0 = COPY %0(p0)
367     RET_ReallyLR