xref: /llvm-project/llvm/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir (revision 373c343a77a7afaa07179db1754a52b620dfaf2e)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=x86_64-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s
3
4--- |
5  define i64 @test_sext_i1(i8 %a) {
6    %val = trunc i8 %a to i1
7    %r = sext i1 %val to i64
8    ret i64 %r
9  }
10
11  define i64 @test_sext_i8(i8 %val) {
12    %r = sext i8 %val to i64
13    ret i64 %r
14  }
15
16  define i64 @test_sext_i16(i16 %val) {
17    %r = sext i16 %val to i64
18    ret i64 %r
19  }
20
21  define i64 @test_sext_i32(i32 %val) {
22    %r = sext i32 %val to i64
23    ret i64 %r
24  }
25
26  define i64 @test_zext_i1(i8 %a) {
27    %val = trunc i8 %a to i1
28    %r = zext i1 %val to i64
29    ret i64 %r
30  }
31
32  define i64 @test_zext_i8(i8 %val) {
33    %r = zext i8 %val to i64
34    ret i64 %r
35  }
36
37  define i64 @test_zext_i16(i16 %val) {
38    %r = zext i16 %val to i64
39    ret i64 %r
40  }
41
42  define i64 @test_zext_i32(i32 %val) {
43    %r = zext i32 %val to i64
44    ret i64 %r
45  }
46
47  define void @test_anyext_i1(i8 %a) {
48    ret void
49  }
50
51  define void @test_anyext_i8(i8 %val) {
52    ret void
53  }
54
55  define void @test_anyext_i16(i16 %val) {
56    ret void
57  }
58
59  define void @test_anyext_i32(i32 %val) {
60    ret void
61  }
62
63
64...
65---
66name:            test_sext_i1
67alignment:       16
68legalized:       false
69regBankSelected: false
70registers:
71  - { id: 0, class: _ }
72  - { id: 1, class: _ }
73  - { id: 2, class: _ }
74body:             |
75  bb.1 (%ir-block.0):
76    liveins: $edi
77
78    ; CHECK-LABEL: name: test_sext_i1
79    ; CHECK: liveins: $edi
80    ; CHECK-NEXT: {{  $}}
81    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
82    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
83    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 63
84    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ANYEXT]], [[C]](s8)
85    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s8) = COPY [[C]](s8)
86    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[COPY1]](s8)
87    ; CHECK-NEXT: $rax = COPY [[ASHR]](s64)
88    ; CHECK-NEXT: RET 0, implicit $rax
89    %0(s8) = COPY $dil
90    %1(s1) = G_TRUNC %0(s8)
91    %2(s64) = G_SEXT %1(s1)
92    $rax = COPY %2(s64)
93    RET 0, implicit $rax
94
95...
96---
97name:            test_sext_i8
98alignment:       16
99legalized:       false
100regBankSelected: false
101registers:
102  - { id: 0, class: _ }
103  - { id: 1, class: _ }
104body:             |
105  bb.1 (%ir-block.0):
106    liveins: $edi
107
108    ; CHECK-LABEL: name: test_sext_i8
109    ; CHECK: liveins: $edi
110    ; CHECK-NEXT: {{  $}}
111    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
112    ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s8)
113    ; CHECK-NEXT: $rax = COPY [[SEXT]](s64)
114    ; CHECK-NEXT: RET 0, implicit $rax
115    %0(s8) = COPY $dil
116    %1(s64) = G_SEXT %0(s8)
117    $rax = COPY %1(s64)
118    RET 0, implicit $rax
119
120...
121---
122name:            test_sext_i16
123alignment:       16
124legalized:       false
125regBankSelected: false
126registers:
127  - { id: 0, class: _ }
128  - { id: 1, class: _ }
129body:             |
130  bb.1 (%ir-block.0):
131    liveins: $edi
132
133    ; CHECK-LABEL: name: test_sext_i16
134    ; CHECK: liveins: $edi
135    ; CHECK-NEXT: {{  $}}
136    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $di
137    ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s16)
138    ; CHECK-NEXT: $rax = COPY [[SEXT]](s64)
139    ; CHECK-NEXT: RET 0, implicit $rax
140    %0(s16) = COPY $di
141    %1(s64) = G_SEXT %0(s16)
142    $rax = COPY %1(s64)
143    RET 0, implicit $rax
144
145...
146---
147name:            test_sext_i32
148alignment:       16
149legalized:       false
150regBankSelected: false
151registers:
152  - { id: 0, class: _ }
153  - { id: 1, class: _ }
154body:             |
155  bb.1 (%ir-block.0):
156    liveins: $edi
157
158    ; CHECK-LABEL: name: test_sext_i32
159    ; CHECK: liveins: $edi
160    ; CHECK-NEXT: {{  $}}
161    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
162    ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s32)
163    ; CHECK-NEXT: $rax = COPY [[SEXT]](s64)
164    ; CHECK-NEXT: RET 0, implicit $rax
165    %0(s32) = COPY $edi
166    %1(s64) = G_SEXT %0(s32)
167    $rax = COPY %1(s64)
168    RET 0, implicit $rax
169
170...
171---
172name:            test_zext_i1
173alignment:       16
174legalized:       false
175regBankSelected: false
176registers:
177  - { id: 0, class: _ }
178  - { id: 1, class: _ }
179  - { id: 2, class: _ }
180body:             |
181  bb.1 (%ir-block.0):
182    liveins: $edi
183
184    ; CHECK-LABEL: name: test_zext_i1
185    ; CHECK: liveins: $edi
186    ; CHECK-NEXT: {{  $}}
187    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
188    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
189    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
190    ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ANYEXT]], [[C]]
191    ; CHECK-NEXT: $rax = COPY [[AND]](s64)
192    ; CHECK-NEXT: RET 0, implicit $rax
193    %0(s8) = COPY $dil
194    %1(s1) = G_TRUNC %0(s8)
195    %2(s64) = G_ZEXT %1(s1)
196    $rax = COPY %2(s64)
197    RET 0, implicit $rax
198
199...
200---
201name:            test_zext_i8
202alignment:       16
203legalized:       false
204regBankSelected: false
205registers:
206  - { id: 0, class: _ }
207  - { id: 1, class: _ }
208body:             |
209  bb.1 (%ir-block.0):
210    liveins: $edi
211
212    ; CHECK-LABEL: name: test_zext_i8
213    ; CHECK: liveins: $edi
214    ; CHECK-NEXT: {{  $}}
215    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
216    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s8)
217    ; CHECK-NEXT: $rax = COPY [[ZEXT]](s64)
218    ; CHECK-NEXT: RET 0, implicit $rax
219    %0(s8) = COPY $dil
220    %1(s64) = G_ZEXT %0(s8)
221    $rax = COPY %1(s64)
222    RET 0, implicit $rax
223
224...
225---
226name:            test_zext_i16
227alignment:       16
228legalized:       false
229regBankSelected: false
230registers:
231  - { id: 0, class: _ }
232  - { id: 1, class: _ }
233body:             |
234  bb.1 (%ir-block.0):
235    liveins: $edi
236
237    ; CHECK-LABEL: name: test_zext_i16
238    ; CHECK: liveins: $edi
239    ; CHECK-NEXT: {{  $}}
240    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $di
241    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s16)
242    ; CHECK-NEXT: $rax = COPY [[ZEXT]](s64)
243    ; CHECK-NEXT: RET 0, implicit $rax
244    %0(s16) = COPY $di
245    %1(s64) = G_ZEXT %0(s16)
246    $rax = COPY %1(s64)
247    RET 0, implicit $rax
248
249...
250---
251name:            test_zext_i32
252alignment:       16
253legalized:       false
254regBankSelected: false
255registers:
256  - { id: 0, class: _ }
257  - { id: 1, class: _ }
258body:             |
259  bb.1 (%ir-block.0):
260    liveins: $edi
261
262    ; CHECK-LABEL: name: test_zext_i32
263    ; CHECK: liveins: $edi
264    ; CHECK-NEXT: {{  $}}
265    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
266    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32)
267    ; CHECK-NEXT: $rax = COPY [[ZEXT]](s64)
268    ; CHECK-NEXT: RET 0, implicit $rax
269    %0(s32) = COPY $edi
270    %1(s64) = G_ZEXT %0(s32)
271    $rax = COPY %1(s64)
272    RET 0, implicit $rax
273
274...
275---
276name:            test_anyext_i1
277alignment:       16
278legalized:       false
279regBankSelected: false
280registers:
281  - { id: 0, class: _ }
282  - { id: 1, class: _ }
283  - { id: 2, class: _ }
284body:             |
285  bb.1 (%ir-block.0):
286    liveins: $edi
287
288    ; CHECK-LABEL: name: test_anyext_i1
289    ; CHECK: liveins: $edi
290    ; CHECK-NEXT: {{  $}}
291    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
292    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
293    ; CHECK-NEXT: $rax = COPY [[ANYEXT]](s64)
294    ; CHECK-NEXT: RET 0, implicit $rax
295    %0(s8) = COPY $dil
296    %1(s1) = G_TRUNC %0(s8)
297    %2(s64) = G_ANYEXT %1(s1)
298    $rax = COPY %2(s64)
299    RET 0, implicit $rax
300
301...
302---
303name:            test_anyext_i8
304alignment:       16
305legalized:       false
306regBankSelected: false
307registers:
308  - { id: 0, class: _ }
309  - { id: 1, class: _ }
310body:             |
311  bb.1 (%ir-block.0):
312    liveins: $edi
313
314    ; CHECK-LABEL: name: test_anyext_i8
315    ; CHECK: liveins: $edi
316    ; CHECK-NEXT: {{  $}}
317    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
318    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
319    ; CHECK-NEXT: $rax = COPY [[ANYEXT]](s64)
320    ; CHECK-NEXT: RET 0, implicit $rax
321    %0(s8) = COPY $dil
322    %1(s64) = G_ANYEXT %0(s8)
323    $rax = COPY %1(s64)
324    RET 0, implicit $rax
325
326...
327---
328name:            test_anyext_i16
329alignment:       16
330legalized:       false
331regBankSelected: false
332registers:
333  - { id: 0, class: _ }
334  - { id: 1, class: _ }
335body:             |
336  bb.1 (%ir-block.0):
337    liveins: $edi
338
339    ; CHECK-LABEL: name: test_anyext_i16
340    ; CHECK: liveins: $edi
341    ; CHECK-NEXT: {{  $}}
342    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $di
343    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s16)
344    ; CHECK-NEXT: $rax = COPY [[ANYEXT]](s64)
345    ; CHECK-NEXT: RET 0, implicit $rax
346    %0(s16) = COPY $di
347    %1(s64) = G_ANYEXT %0(s16)
348    $rax = COPY %1(s64)
349    RET 0, implicit $rax
350
351...
352---
353name:            test_anyext_i32
354alignment:       16
355legalized:       false
356regBankSelected: false
357registers:
358  - { id: 0, class: _ }
359  - { id: 1, class: _ }
360body:             |
361  bb.1 (%ir-block.0):
362    liveins: $edi
363
364    ; CHECK-LABEL: name: test_anyext_i32
365    ; CHECK: liveins: $edi
366    ; CHECK-NEXT: {{  $}}
367    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
368    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s32)
369    ; CHECK-NEXT: $rax = COPY [[ANYEXT]](s64)
370    ; CHECK-NEXT: RET 0, implicit $rax
371    %0(s32) = COPY $edi
372    %1(s64) = G_ANYEXT %0(s32)
373    $rax = COPY %1(s64)
374    RET 0, implicit $rax
375
376...
377
378