[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / inline-memcpy.mir
blobddb9d3507d902fff8e21ccba79c54e22747295c4
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -march=aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
3 --- |
4   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5   target triple = "arm64-apple-darwin"
7   define void @test_memcpy1(i32* nocapture %dst, i32* nocapture readonly %src, i64 %len) local_unnamed_addr #0 {
8   entry:
9     %0 = bitcast i32* %dst to i8*
10     %1 = bitcast i32* %src to i8*
11     tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 %len, i1 false)
12     ret void
13   }
15   declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1 immarg) #1
17   define void @test_memcpy2_const(i32* nocapture %dst, i32* nocapture readonly %src) local_unnamed_addr #0 {
18   entry:
19     %0 = bitcast i32* %dst to i8*
20     %1 = bitcast i32* %src to i8*
21     tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 72, i1 false)
22     ret void
23   }
25   define void @test_memcpy2_const_optsize(i32* nocapture %dst, i32* nocapture readonly %src) local_unnamed_addr #2 {
26   entry:
27     %0 = bitcast i32* %dst to i8*
28     %1 = bitcast i32* %src to i8*
29     tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 72, i1 false)
30     ret void
31   }
33   define void @test_memcpy2_const_minsize(i32* nocapture %dst, i32* nocapture readonly %src) local_unnamed_addr #3 {
34   entry:
35     %0 = bitcast i32* %dst to i8*
36     %1 = bitcast i32* %src to i8*
37     tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 72, i1 false)
38     ret void
39   }
41   define void @test_memcpy3_const_arrays_unaligned(i32* nocapture %dst, i32* nocapture readonly %src) local_unnamed_addr #0 {
42   entry:
43     %0 = bitcast i32* %dst to i8*
44     %1 = bitcast i32* %src to i8*
45     tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 143, i1 false)
46     ret void
47   }
49   attributes #0 = { nounwind ssp uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="cyclone" "target-features"="+aes,+crypto,+fp-armv8,+neon,+sha2,+zcm,+zcz" "unsafe-fp-math"="false" "use-soft-float"="false" }
50   attributes #1 = { argmemonly nounwind }
51   attributes #2 = { optsize }
52   attributes #3 = { minsize }
54 ...
55 ---
56 name:            test_memcpy1
57 alignment:       4
58 tracksRegLiveness: true
59 registers:
60   - { id: 0, class: _ }
61   - { id: 1, class: _ }
62   - { id: 2, class: _ }
63 machineFunctionInfo: {}
64 body:             |
65   bb.1.entry:
66     liveins: $x0, $x1, $x2
68     ; CHECK-LABEL: name: test_memcpy1
69     ; CHECK: liveins: $x0, $x1, $x2
70     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
71     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
72     ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
73     ; CHECK: G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), [[COPY]](p0), [[COPY1]](p0), [[COPY2]](s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
74     ; CHECK: RET_ReallyLR
75     %0:_(p0) = COPY $x0
76     %1:_(p0) = COPY $x1
77     %2:_(s64) = COPY $x2
78     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), %0(p0), %1(p0), %2(s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
79     RET_ReallyLR
81 ...
82 ---
83 name:            test_memcpy2_const
84 alignment:       4
85 tracksRegLiveness: true
86 registers:
87   - { id: 0, class: _ }
88   - { id: 1, class: _ }
89   - { id: 2, class: _ }
90 machineFunctionInfo: {}
91 body:             |
92   bb.1.entry:
93     liveins: $x0, $x1
95     ; CHECK-LABEL: name: test_memcpy2_const
96     ; CHECK: liveins: $x0, $x1
97     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
98     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
99     ; CHECK: [[LOAD:%[0-9]+]]:_(s128) = G_LOAD [[COPY1]](p0) :: (load 16 from %ir.1, align 4)
100     ; CHECK: G_STORE [[LOAD]](s128), [[COPY]](p0) :: (store 16 into %ir.0, align 4)
101     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
102     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C]](s64)
103     ; CHECK: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[GEP]](p0) :: (load 16 from %ir.1 + 16, align 4)
104     ; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)
105     ; CHECK: G_STORE [[LOAD1]](s128), [[GEP1]](p0) :: (store 16 into %ir.0 + 16, align 4)
106     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32
107     ; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64)
108     ; CHECK: [[LOAD2:%[0-9]+]]:_(s128) = G_LOAD [[GEP2]](p0) :: (load 16 from %ir.1 + 32, align 4)
109     ; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C1]](s64)
110     ; CHECK: G_STORE [[LOAD2]](s128), [[GEP3]](p0) :: (store 16 into %ir.0 + 32, align 4)
111     ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 48
112     ; CHECK: [[GEP4:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C2]](s64)
113     ; CHECK: [[LOAD3:%[0-9]+]]:_(s128) = G_LOAD [[GEP4]](p0) :: (load 16 from %ir.1 + 48, align 4)
114     ; CHECK: [[GEP5:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C2]](s64)
115     ; CHECK: G_STORE [[LOAD3]](s128), [[GEP5]](p0) :: (store 16 into %ir.0 + 48, align 4)
116     ; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
117     ; CHECK: [[GEP6:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C3]](s64)
118     ; CHECK: [[LOAD4:%[0-9]+]]:_(s64) = G_LOAD [[GEP6]](p0) :: (load 8 from %ir.1 + 64, align 4)
119     ; CHECK: [[GEP7:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C3]](s64)
120     ; CHECK: G_STORE [[LOAD4]](s64), [[GEP7]](p0) :: (store 8 into %ir.0 + 64, align 4)
121     ; CHECK: RET_ReallyLR
122     %0:_(p0) = COPY $x0
123     %1:_(p0) = COPY $x1
124     %2:_(s64) = G_CONSTANT i64 72
125     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), %0(p0), %1(p0), %2(s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
126     RET_ReallyLR
130 name:            test_memcpy2_const_optsize
131 alignment:       4
132 tracksRegLiveness: true
133 registers:
134   - { id: 0, class: _ }
135   - { id: 1, class: _ }
136   - { id: 2, class: _ }
137 machineFunctionInfo: {}
138 body:             |
139   bb.1.entry:
140     liveins: $x0, $x1
142     ; CHECK-LABEL: name: test_memcpy2_const_optsize
143     ; CHECK: liveins: $x0, $x1
144     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
145     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
146     ; CHECK: [[LOAD:%[0-9]+]]:_(s128) = G_LOAD [[COPY1]](p0) :: (load 16 from %ir.1, align 4)
147     ; CHECK: G_STORE [[LOAD]](s128), [[COPY]](p0) :: (store 16 into %ir.0, align 4)
148     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
149     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C]](s64)
150     ; CHECK: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[GEP]](p0) :: (load 16 from %ir.1 + 16, align 4)
151     ; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)
152     ; CHECK: G_STORE [[LOAD1]](s128), [[GEP1]](p0) :: (store 16 into %ir.0 + 16, align 4)
153     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32
154     ; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64)
155     ; CHECK: [[LOAD2:%[0-9]+]]:_(s128) = G_LOAD [[GEP2]](p0) :: (load 16 from %ir.1 + 32, align 4)
156     ; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C1]](s64)
157     ; CHECK: G_STORE [[LOAD2]](s128), [[GEP3]](p0) :: (store 16 into %ir.0 + 32, align 4)
158     ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 48
159     ; CHECK: [[GEP4:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C2]](s64)
160     ; CHECK: [[LOAD3:%[0-9]+]]:_(s128) = G_LOAD [[GEP4]](p0) :: (load 16 from %ir.1 + 48, align 4)
161     ; CHECK: [[GEP5:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C2]](s64)
162     ; CHECK: G_STORE [[LOAD3]](s128), [[GEP5]](p0) :: (store 16 into %ir.0 + 48, align 4)
163     ; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
164     ; CHECK: [[GEP6:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C3]](s64)
165     ; CHECK: [[LOAD4:%[0-9]+]]:_(s64) = G_LOAD [[GEP6]](p0) :: (load 8 from %ir.1 + 64, align 4)
166     ; CHECK: [[GEP7:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C3]](s64)
167     ; CHECK: G_STORE [[LOAD4]](s64), [[GEP7]](p0) :: (store 8 into %ir.0 + 64, align 4)
168     ; CHECK: RET_ReallyLR
169     %0:_(p0) = COPY $x0
170     %1:_(p0) = COPY $x1
171     %2:_(s64) = G_CONSTANT i64 72
172     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), %0(p0), %1(p0), %2(s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
173     RET_ReallyLR
177 name:            test_memcpy2_const_minsize
178 alignment:       4
179 tracksRegLiveness: true
180 registers:
181   - { id: 0, class: _ }
182   - { id: 1, class: _ }
183   - { id: 2, class: _ }
184 machineFunctionInfo: {}
185 body:             |
186   bb.1.entry:
187     liveins: $x0, $x1
189     ; CHECK-LABEL: name: test_memcpy2_const_minsize
190     ; CHECK: liveins: $x0, $x1
191     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
192     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
193     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 72
194     ; CHECK: G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), [[COPY]](p0), [[COPY1]](p0), [[C]](s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
195     ; CHECK: RET_ReallyLR
196     %0:_(p0) = COPY $x0
197     %1:_(p0) = COPY $x1
198     %2:_(s64) = G_CONSTANT i64 72
199     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), %0(p0), %1(p0), %2(s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
200     RET_ReallyLR
204 name:            test_memcpy3_const_arrays_unaligned
205 alignment:       4
206 tracksRegLiveness: true
207 registers:
208   - { id: 0, class: _ }
209   - { id: 1, class: _ }
210   - { id: 2, class: _ }
211 machineFunctionInfo: {}
212 body:             |
213   bb.1.entry:
214     liveins: $x0, $x1
216     ; CHECK-LABEL: name: test_memcpy3_const_arrays_unaligned
217     ; CHECK: liveins: $x0, $x1
218     ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
219     ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
220     ; CHECK: [[LOAD:%[0-9]+]]:_(s128) = G_LOAD [[COPY1]](p0) :: (load 16 from %ir.1, align 4)
221     ; CHECK: G_STORE [[LOAD]](s128), [[COPY]](p0) :: (store 16 into %ir.0, align 4)
222     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
223     ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C]](s64)
224     ; CHECK: [[LOAD1:%[0-9]+]]:_(s128) = G_LOAD [[GEP]](p0) :: (load 16 from %ir.1 + 16, align 4)
225     ; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64)
226     ; CHECK: G_STORE [[LOAD1]](s128), [[GEP1]](p0) :: (store 16 into %ir.0 + 16, align 4)
227     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32
228     ; CHECK: [[GEP2:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64)
229     ; CHECK: [[LOAD2:%[0-9]+]]:_(s128) = G_LOAD [[GEP2]](p0) :: (load 16 from %ir.1 + 32, align 4)
230     ; CHECK: [[GEP3:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C1]](s64)
231     ; CHECK: G_STORE [[LOAD2]](s128), [[GEP3]](p0) :: (store 16 into %ir.0 + 32, align 4)
232     ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 48
233     ; CHECK: [[GEP4:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C2]](s64)
234     ; CHECK: [[LOAD3:%[0-9]+]]:_(s128) = G_LOAD [[GEP4]](p0) :: (load 16 from %ir.1 + 48, align 4)
235     ; CHECK: [[GEP5:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C2]](s64)
236     ; CHECK: G_STORE [[LOAD3]](s128), [[GEP5]](p0) :: (store 16 into %ir.0 + 48, align 4)
237     ; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
238     ; CHECK: [[GEP6:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C3]](s64)
239     ; CHECK: [[LOAD4:%[0-9]+]]:_(s128) = G_LOAD [[GEP6]](p0) :: (load 16 from %ir.1 + 64, align 4)
240     ; CHECK: [[GEP7:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C3]](s64)
241     ; CHECK: G_STORE [[LOAD4]](s128), [[GEP7]](p0) :: (store 16 into %ir.0 + 64, align 4)
242     ; CHECK: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 80
243     ; CHECK: [[GEP8:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C4]](s64)
244     ; CHECK: [[LOAD5:%[0-9]+]]:_(s128) = G_LOAD [[GEP8]](p0) :: (load 16 from %ir.1 + 80, align 4)
245     ; CHECK: [[GEP9:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C4]](s64)
246     ; CHECK: G_STORE [[LOAD5]](s128), [[GEP9]](p0) :: (store 16 into %ir.0 + 80, align 4)
247     ; CHECK: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 96
248     ; CHECK: [[GEP10:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C5]](s64)
249     ; CHECK: [[LOAD6:%[0-9]+]]:_(s128) = G_LOAD [[GEP10]](p0) :: (load 16 from %ir.1 + 96, align 4)
250     ; CHECK: [[GEP11:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C5]](s64)
251     ; CHECK: G_STORE [[LOAD6]](s128), [[GEP11]](p0) :: (store 16 into %ir.0 + 96, align 4)
252     ; CHECK: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 112
253     ; CHECK: [[GEP12:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C6]](s64)
254     ; CHECK: [[LOAD7:%[0-9]+]]:_(s128) = G_LOAD [[GEP12]](p0) :: (load 16 from %ir.1 + 112, align 4)
255     ; CHECK: [[GEP13:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C6]](s64)
256     ; CHECK: G_STORE [[LOAD7]](s128), [[GEP13]](p0) :: (store 16 into %ir.0 + 112, align 4)
257     ; CHECK: [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 127
258     ; CHECK: [[GEP14:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C7]](s64)
259     ; CHECK: [[LOAD8:%[0-9]+]]:_(s128) = G_LOAD [[GEP14]](p0) :: (load 16 from %ir.1 + 127, align 4)
260     ; CHECK: [[GEP15:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C7]](s64)
261     ; CHECK: G_STORE [[LOAD8]](s128), [[GEP15]](p0) :: (store 16 into %ir.0 + 127, align 4)
262     ; CHECK: RET_ReallyLR
263     %0:_(p0) = COPY $x0
264     %1:_(p0) = COPY $x1
265     %2:_(s64) = G_CONSTANT i64 143
266     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.memcpy), %0(p0), %1(p0), %2(s64), 1 :: (store 1 into %ir.0, align 4), (load 1 from %ir.1, align 4)
267     RET_ReallyLR