[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / legalize-extracts.mir
blob62a0c92004f7f87aaf641af3019cca7857773db2
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-linux-gnu -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
5 ---
6 name:            test_extracts_4
7 tracksRegLiveness: true
8 body: |
9   bb.0:
10     liveins: $x0, $x1, $x2
13     ; CHECK-LABEL: name: test_extracts_4
14     ; CHECK: liveins: $x0, $x1, $x2
15     ; CHECK-NEXT: {{  $}}
16     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
17     ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 32
18     ; CHECK-NEXT: $w0 = COPY [[EXTRACT]](s32)
19     ; CHECK-NEXT: RET_ReallyLR implicit $w0
20     %0:_(s64) = COPY $x0
21     %1:_(s64) = COPY $x1
22     %2:_(s128) = G_MERGE_VALUES %0, %1
23     %3:_(s32) = G_EXTRACT %2, 32
24     $w0 = COPY %3
25     RET_ReallyLR implicit $w0
26 ...
27 ---
28 name:            p0_from_s128
29 tracksRegLiveness: true
30 body: |
31   bb.0:
32     liveins: $x0, $q0
33     ; CHECK-LABEL: name: p0_from_s128
34     ; CHECK: liveins: $x0, $q0
35     ; CHECK-NEXT: {{  $}}
36     ; CHECK-NEXT: %val:_(s128) = COPY $q0
37     ; CHECK-NEXT: %extract:_(p0) = G_EXTRACT %val(s128), 0
38     ; CHECK-NEXT: $x0 = COPY %extract(p0)
39     ; CHECK-NEXT: RET_ReallyLR implicit $x0
40     %val:_(s128) = COPY $q0
41     %extract:_(p0) = G_EXTRACT %val, 0
42     $x0 = COPY %extract
43     RET_ReallyLR implicit $x0
44 ...
45 ---
46 name:            s64_from_s128
47 tracksRegLiveness: true
48 body: |
49   bb.0:
50     liveins: $x0, $q0
51     ; CHECK-LABEL: name: s64_from_s128
52     ; CHECK: liveins: $x0, $q0
53     ; CHECK-NEXT: {{  $}}
54     ; CHECK-NEXT: %val:_(s128) = COPY $q0
55     ; CHECK-NEXT: %extract:_(s64) = G_EXTRACT %val(s128), 0
56     ; CHECK-NEXT: $x0 = COPY %extract(s64)
57     ; CHECK-NEXT: RET_ReallyLR implicit $x0
58     %val:_(s128) = COPY $q0
59     %extract:_(s64) = G_EXTRACT %val, 0
60     $x0 = COPY %extract
61     RET_ReallyLR implicit $x0
62 ...
63 ---
64 name:            s32_from_s128
65 tracksRegLiveness: true
66 body: |
67   bb.0:
68     liveins: $w0, $q0
69     ; CHECK-LABEL: name: s32_from_s128
70     ; CHECK: liveins: $w0, $q0
71     ; CHECK-NEXT: {{  $}}
72     ; CHECK-NEXT: %val:_(s128) = COPY $q0
73     ; CHECK-NEXT: %extract:_(s32) = G_EXTRACT %val(s128), 0
74     ; CHECK-NEXT: $w0 = COPY %extract(s32)
75     ; CHECK-NEXT: RET_ReallyLR implicit $w0
76     %val:_(s128) = COPY $q0
77     %extract:_(s32) = G_EXTRACT %val, 0
78     $w0 = COPY %extract
79     RET_ReallyLR implicit $w0
80 ...
81 ---
82 name:            s32_from_s64
83 tracksRegLiveness: true
84 body: |
85   bb.0:
86     liveins: $w0
87     ; CHECK-LABEL: name: s32_from_s64
88     ; CHECK: liveins: $w0
89     ; CHECK-NEXT: {{  $}}
90     ; CHECK-NEXT: %val:_(s64) = COPY $x0
91     ; CHECK-NEXT: %extract:_(s32) = G_EXTRACT %val(s64), 0
92     ; CHECK-NEXT: $w0 = COPY %extract(s32)
93     ; CHECK-NEXT: RET_ReallyLR implicit $w0
94     %val:_(s64) = COPY $x0
95     %extract:_(s32) = G_EXTRACT %val, 0
96     $w0 = COPY %extract
97     RET_ReallyLR implicit $w0
98 ...
99 ---
100 name:            s32_from_p0
101 tracksRegLiveness: true
102 body: |
103   bb.0:
104     liveins: $w0
105     ; CHECK-LABEL: name: s32_from_p0
106     ; CHECK: liveins: $w0
107     ; CHECK-NEXT: {{  $}}
108     ; CHECK-NEXT: %val:_(p0) = COPY $x0
109     ; CHECK-NEXT: %extract:_(s32) = G_EXTRACT %val(p0), 0
110     ; CHECK-NEXT: $w0 = COPY %extract(s32)
111     ; CHECK-NEXT: RET_ReallyLR implicit $w0
112     %val:_(p0) = COPY $x0
113     %extract:_(s32) = G_EXTRACT %val, 0
114     $w0 = COPY %extract
115     RET_ReallyLR implicit $w0
118 name:            s16_from_s128
119 tracksRegLiveness: true
120 body: |
121   bb.0:
122     liveins: $h0, $q0
123     ; CHECK-LABEL: name: s16_from_s128
124     ; CHECK: liveins: $h0, $q0
125     ; CHECK-NEXT: {{  $}}
126     ; CHECK-NEXT: %val:_(s128) = COPY $q0
127     ; CHECK-NEXT: %extract:_(s16) = G_EXTRACT %val(s128), 0
128     ; CHECK-NEXT: $h0 = COPY %extract(s16)
129     ; CHECK-NEXT: RET_ReallyLR implicit $h0
130     %val:_(s128) = COPY $q0
131     %extract:_(s16) = G_EXTRACT %val, 0
132     $h0 = COPY %extract
133     RET_ReallyLR implicit $h0
136 name:            s16_from_s64
137 tracksRegLiveness: true
138 body: |
139   bb.0:
140     liveins: $h0, $x0
141     ; CHECK-LABEL: name: s16_from_s64
142     ; CHECK: liveins: $h0, $x0
143     ; CHECK-NEXT: {{  $}}
144     ; CHECK-NEXT: %val:_(s64) = COPY $x0
145     ; CHECK-NEXT: %extract:_(s16) = G_EXTRACT %val(s64), 0
146     ; CHECK-NEXT: $h0 = COPY %extract(s16)
147     ; CHECK-NEXT: RET_ReallyLR implicit $h0
148     %val:_(s64) = COPY $x0
149     %extract:_(s16) = G_EXTRACT %val, 0
150     $h0 = COPY %extract
151     RET_ReallyLR implicit $h0
154 name:            s16_from_s32
155 tracksRegLiveness: true
156 body: |
157   bb.0:
158     liveins: $h0, $w0
159     ; CHECK-LABEL: name: s16_from_s32
160     ; CHECK: liveins: $h0, $w0
161     ; CHECK-NEXT: {{  $}}
162     ; CHECK-NEXT: %val:_(s32) = COPY $w0
163     ; CHECK-NEXT: %extract:_(s16) = G_EXTRACT %val(s32), 0
164     ; CHECK-NEXT: $h0 = COPY %extract(s16)
165     ; CHECK-NEXT: RET_ReallyLR implicit $h0
166     %val:_(s32) = COPY $w0
167     %extract:_(s16) = G_EXTRACT %val, 0
168     $h0 = COPY %extract
169     RET_ReallyLR implicit $h0
172 name:            s8_from_s128
173 tracksRegLiveness: true
174 body: |
175   bb.0:
176     liveins: $b0, $q0
177     ; CHECK-LABEL: name: s8_from_s128
178     ; CHECK: liveins: $b0, $q0
179     ; CHECK-NEXT: {{  $}}
180     ; CHECK-NEXT: %val:_(s128) = COPY $q0
181     ; CHECK-NEXT: %extract:_(s8) = G_TRUNC %val(s128)
182     ; CHECK-NEXT: $b0 = COPY %extract(s8)
183     ; CHECK-NEXT: RET_ReallyLR implicit $b0
184     %val:_(s128) = COPY $q0
185     %extract:_(s8) = G_EXTRACT %val, 0
186     $b0 = COPY %extract
187     RET_ReallyLR implicit $b0
190 name:            s8_from_s64
191 tracksRegLiveness: true
192 body: |
193   bb.0:
194     liveins: $b0, $x0
195     ; CHECK-LABEL: name: s8_from_s64
196     ; CHECK: liveins: $b0, $x0
197     ; CHECK-NEXT: {{  $}}
198     ; CHECK-NEXT: %val:_(s64) = COPY $x0
199     ; CHECK-NEXT: %extract:_(s8) = G_TRUNC %val(s64)
200     ; CHECK-NEXT: $b0 = COPY %extract(s8)
201     ; CHECK-NEXT: RET_ReallyLR implicit $b0
202     %val:_(s64) = COPY $x0
203     %extract:_(s8) = G_EXTRACT %val, 0
204     $b0 = COPY %extract
205     RET_ReallyLR implicit $b0
208 name:            s8_from_s32
209 tracksRegLiveness: true
210 body: |
211   bb.0:
212     liveins: $b0, $w0
213     ; CHECK-LABEL: name: s8_from_s32
214     ; CHECK: liveins: $b0, $w0
215     ; CHECK-NEXT: {{  $}}
216     ; CHECK-NEXT: %val:_(s32) = COPY $w0
217     ; CHECK-NEXT: %extract:_(s8) = G_TRUNC %val(s32)
218     ; CHECK-NEXT: $b0 = COPY %extract(s8)
219     ; CHECK-NEXT: RET_ReallyLR implicit $b0
220     %val:_(s32) = COPY $w0
221     %extract:_(s8) = G_EXTRACT %val, 0
222     $b0 = COPY %extract
223     RET_ReallyLR implicit $b0
226 name:            s8_from_s16
227 tracksRegLiveness: true
228 body: |
229   bb.0:
230     liveins: $b0, $h0
231     ; CHECK-LABEL: name: s8_from_s16
232     ; CHECK: liveins: $b0, $h0
233     ; CHECK-NEXT: {{  $}}
234     ; CHECK-NEXT: %val:_(s16) = COPY $h0
235     ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT %val(s16)
236     ; CHECK-NEXT: %extract:_(s8) = G_TRUNC [[ANYEXT]](s32)
237     ; CHECK-NEXT: $b0 = COPY %extract(s8)
238     ; CHECK-NEXT: RET_ReallyLR implicit $b0
239     %val:_(s16) = COPY $h0
240     %extract:_(s8) = G_EXTRACT %val, 0
241     $b0 = COPY %extract
242     RET_ReallyLR implicit $b0
245 name:            s1_from_s32
246 tracksRegLiveness: true
247 body: |
248   bb.0:
249     liveins: $w0
250     ; CHECK-LABEL: name: s1_from_s32
251     ; CHECK: liveins: $w0
252     ; CHECK-NEXT: {{  $}}
253     ; CHECK-NEXT: %val:_(s32) = COPY $w0
254     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
255     ; CHECK-NEXT: %ext:_(s32) = G_AND %val, [[C]]
256     ; CHECK-NEXT: $w0 = COPY %ext(s32)
257     ; CHECK-NEXT: RET_ReallyLR implicit $w0
258     %val:_(s32) = COPY $w0
259     %extract:_(s1) = G_EXTRACT %val, 0
260     %ext:_(s32) = G_ZEXT %extract
261     $w0 = COPY %ext
262     RET_ReallyLR implicit $w0
265 name:            s3_from_s32
266 tracksRegLiveness: true
267 body: |
268   bb.0:
269     liveins: $w0
270     ; CHECK-LABEL: name: s3_from_s32
271     ; CHECK: liveins: $w0
272     ; CHECK-NEXT: {{  $}}
273     ; CHECK-NEXT: %val:_(s32) = COPY $w0
274     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
275     ; CHECK-NEXT: %ext:_(s32) = G_AND %val, [[C]]
276     ; CHECK-NEXT: $w0 = COPY %ext(s32)
277     ; CHECK-NEXT: RET_ReallyLR implicit $w0
278     %val:_(s32) = COPY $w0
279     %extract:_(s3) = G_EXTRACT %val, 0
280     %ext:_(s32) = G_ZEXT %extract
281     $w0 = COPY %ext
282     RET_ReallyLR implicit $w0
285 name:            s3_from_s35
286 tracksRegLiveness: true
287 body: |
288   bb.0:
289     liveins: $w0
290     ; CHECK-LABEL: name: s3_from_s35
291     ; CHECK: liveins: $w0
292     ; CHECK-NEXT: {{  $}}
293     ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
294     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 7
295     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[DEF]](s64)
296     ; CHECK-NEXT: %ext:_(s32) = G_AND [[TRUNC]], [[C]]
297     ; CHECK-NEXT: $w0 = COPY %ext(s32)
298     ; CHECK-NEXT: RET_ReallyLR implicit $w0
299     %val:_(s35) = G_IMPLICIT_DEF
300     %extract:_(s3) = G_EXTRACT %val, 0
301     %ext:_(s32) = G_ZEXT %extract
302     $w0 = COPY %ext
303     RET_ReallyLR implicit $w0
306 name:            s4_from_s32
307 tracksRegLiveness: true
308 body: |
309   bb.0:
310     liveins: $w0
311     ; CHECK-LABEL: name: s4_from_s32
312     ; CHECK: liveins: $w0
313     ; CHECK-NEXT: {{  $}}
314     ; CHECK-NEXT: %val:_(s32) = COPY $w0
315     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15
316     ; CHECK-NEXT: %ext:_(s32) = G_AND %val, [[C]]
317     ; CHECK-NEXT: $w0 = COPY %ext(s32)
318     ; CHECK-NEXT: RET_ReallyLR implicit $w0
319     %val:_(s32) = COPY $w0
320     %extract:_(s4) = G_EXTRACT %val, 0
321     %ext:_(s32) = G_ZEXT %extract
322     $w0 = COPY %ext
323     RET_ReallyLR implicit $w0
326 name:            s64_from_s264
327 tracksRegLiveness: true
328 body: |
329   bb.0:
330     liveins: $x0
331     ; CHECK-LABEL: name: s64_from_s264
332     ; CHECK: liveins: $x0
333     ; CHECK-NEXT: {{  $}}
334     ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
335     ; CHECK-NEXT: %extract:_(s64) = COPY [[DEF]](s64)
336     ; CHECK-NEXT: $x0 = COPY %extract(s64)
337     ; CHECK-NEXT: RET_ReallyLR implicit $x0
338     %val:_(s264) = G_IMPLICIT_DEF
339     %extract:_(s64) = G_EXTRACT %val, 0
340     $x0 = COPY %extract
341     RET_ReallyLR implicit $x0
344 name:            s16_from_s144
345 tracksRegLiveness: true
346 body: |
347   bb.0:
348     liveins: $h0
349     ; CHECK-LABEL: name: s16_from_s144
350     ; CHECK: liveins: $h0
351     ; CHECK-NEXT: {{  $}}
352     ; CHECK-NEXT: %h0:_(s16) = COPY $h0
353     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES %h0(s16), %h0(s16), %h0(s16), %h0(s16)
354     ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[MV]](s64), 1
355     ; CHECK-NEXT: %extract:_(s16) = COPY [[EXTRACT]](s16)
356     ; CHECK-NEXT: $h0 = COPY %extract(s16)
357     ; CHECK-NEXT: RET_ReallyLR implicit $h0
358     %h0:_(s16) = COPY $h0
359     %val:_(s144) = G_MERGE_VALUES %h0, %h0, %h0, %h0, %h0, %h0, %h0, %h0, %h0
360     %extract:_(s16) = G_EXTRACT %val, 1
361     $h0 = COPY %extract
362     RET_ReallyLR implicit $h0
365 name:            s32_from_s144
366 tracksRegLiveness: true
367 body: |
368   bb.0:
369     liveins: $h0, $w0
370     ; CHECK-LABEL: name: s32_from_s144
371     ; CHECK: liveins: $h0, $w0
372     ; CHECK-NEXT: {{  $}}
373     ; CHECK-NEXT: %h0:_(s16) = COPY $h0
374     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES %h0(s16), %h0(s16), %h0(s16), %h0(s16)
375     ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[MV]](s64), 1
376     ; CHECK-NEXT: %extract:_(s32) = COPY [[EXTRACT]](s32)
377     ; CHECK-NEXT: $w0 = COPY %extract(s32)
378     ; CHECK-NEXT: RET_ReallyLR implicit $w0
379     %h0:_(s16) = COPY $h0
380     %val:_(s144) = G_MERGE_VALUES %h0, %h0, %h0, %h0, %h0, %h0, %h0, %h0, %h0
381     %extract:_(s32) = G_EXTRACT %val, 1
382     $w0 = COPY %extract
383     RET_ReallyLR implicit $w0