[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / GlobalISel / legalize-ext-x86-64.mir
blobc891608d60adfc272ec7c52c40e931ff420a661d
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
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   }
11   define i64 @test_sext_i8(i8 %val) {
12     %r = sext i8 %val to i64
13     ret i64 %r
14   }
16   define i64 @test_sext_i16(i16 %val) {
17     %r = sext i16 %val to i64
18     ret i64 %r
19   }
21   define i64 @test_sext_i32(i32 %val) {
22     %r = sext i32 %val to i64
23     ret i64 %r
24   }
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   }
32   define i64 @test_zext_i8(i8 %val) {
33     %r = zext i8 %val to i64
34     ret i64 %r
35   }
37   define i64 @test_zext_i16(i16 %val) {
38     %r = zext i16 %val to i64
39     ret i64 %r
40   }
42   define i64 @test_zext_i32(i32 %val) {
43     %r = zext i32 %val to i64
44     ret i64 %r
45   }
47   define void @test_anyext_i1(i8 %a) {
48     ret void
49   }
51   define void @test_anyext_i8(i8 %val) {
52     ret void
53   }
55   define void @test_anyext_i16(i16 %val) {
56     ret void
57   }
59   define void @test_anyext_i32(i32 %val) {
60     ret void
61   }
64 ...
65 ---
66 name:            test_sext_i1
67 alignment:       16
68 legalized:       false
69 regBankSelected: false
70 registers:
71   - { id: 0, class: _ }
72   - { id: 1, class: _ }
73   - { id: 2, class: _ }
74 body:             |
75   bb.1 (%ir-block.0):
76     liveins: $edi
78     ; CHECK-LABEL: name: test_sext_i1
79     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
80     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
81     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63
82     ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s64)
83     ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ANYEXT]], [[TRUNC]](s8)
84     ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s64)
85     ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[TRUNC1]](s8)
86     ; CHECK: $rax = COPY [[ASHR]](s64)
87     ; CHECK: RET 0, implicit $rax
88     %0(s8) = COPY $dil
89     %1(s1) = G_TRUNC %0(s8)
90     %2(s64) = G_SEXT %1(s1)
91     $rax = COPY %2(s64)
92     RET 0, implicit $rax
94 ...
95 ---
96 name:            test_sext_i8
97 alignment:       16
98 legalized:       false
99 regBankSelected: false
100 registers:
101   - { id: 0, class: _ }
102   - { id: 1, class: _ }
103 body:             |
104   bb.1 (%ir-block.0):
105     liveins: $edi
107     ; CHECK-LABEL: name: test_sext_i8
108     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
109     ; CHECK: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s8)
110     ; CHECK: $rax = COPY [[SEXT]](s64)
111     ; CHECK: RET 0, implicit $rax
112     %0(s8) = COPY $dil
113     %1(s64) = G_SEXT %0(s8)
114     $rax = COPY %1(s64)
115     RET 0, implicit $rax
119 name:            test_sext_i16
120 alignment:       16
121 legalized:       false
122 regBankSelected: false
123 registers:
124   - { id: 0, class: _ }
125   - { id: 1, class: _ }
126 body:             |
127   bb.1 (%ir-block.0):
128     liveins: $edi
130     ; CHECK-LABEL: name: test_sext_i16
131     ; CHECK: [[COPY:%[0-9]+]]:_(s16) = COPY $di
132     ; CHECK: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s16)
133     ; CHECK: $rax = COPY [[SEXT]](s64)
134     ; CHECK: RET 0, implicit $rax
135     %0(s16) = COPY $di
136     %1(s64) = G_SEXT %0(s16)
137     $rax = COPY %1(s64)
138     RET 0, implicit $rax
142 name:            test_sext_i32
143 alignment:       16
144 legalized:       false
145 regBankSelected: false
146 registers:
147   - { id: 0, class: _ }
148   - { id: 1, class: _ }
149 body:             |
150   bb.1 (%ir-block.0):
151     liveins: $edi
153     ; CHECK-LABEL: name: test_sext_i32
154     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
155     ; CHECK: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[COPY]](s32)
156     ; CHECK: $rax = COPY [[SEXT]](s64)
157     ; CHECK: RET 0, implicit $rax
158     %0(s32) = COPY $edi
159     %1(s64) = G_SEXT %0(s32)
160     $rax = COPY %1(s64)
161     RET 0, implicit $rax
165 name:            test_zext_i1
166 alignment:       16
167 legalized:       false
168 regBankSelected: false
169 registers:
170   - { id: 0, class: _ }
171   - { id: 1, class: _ }
172   - { id: 2, class: _ }
173 body:             |
174   bb.1 (%ir-block.0):
175     liveins: $edi
177     ; CHECK-LABEL: name: test_zext_i1
178     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
179     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
180     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
181     ; CHECK: [[AND:%[0-9]+]]:_(s64) = G_AND [[ANYEXT]], [[C]]
182     ; CHECK: $rax = COPY [[AND]](s64)
183     ; CHECK: RET 0, implicit $rax
184     %0(s8) = COPY $dil
185     %1(s1) = G_TRUNC %0(s8)
186     %2(s64) = G_ZEXT %1(s1)
187     $rax = COPY %2(s64)
188     RET 0, implicit $rax
192 name:            test_zext_i8
193 alignment:       16
194 legalized:       false
195 regBankSelected: false
196 registers:
197   - { id: 0, class: _ }
198   - { id: 1, class: _ }
199 body:             |
200   bb.1 (%ir-block.0):
201     liveins: $edi
203     ; CHECK-LABEL: name: test_zext_i8
204     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
205     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s8)
206     ; CHECK: $rax = COPY [[ZEXT]](s64)
207     ; CHECK: RET 0, implicit $rax
208     %0(s8) = COPY $dil
209     %1(s64) = G_ZEXT %0(s8)
210     $rax = COPY %1(s64)
211     RET 0, implicit $rax
215 name:            test_zext_i16
216 alignment:       16
217 legalized:       false
218 regBankSelected: false
219 registers:
220   - { id: 0, class: _ }
221   - { id: 1, class: _ }
222 body:             |
223   bb.1 (%ir-block.0):
224     liveins: $edi
226     ; CHECK-LABEL: name: test_zext_i16
227     ; CHECK: [[COPY:%[0-9]+]]:_(s16) = COPY $di
228     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s16)
229     ; CHECK: $rax = COPY [[ZEXT]](s64)
230     ; CHECK: RET 0, implicit $rax
231     %0(s16) = COPY $di
232     %1(s64) = G_ZEXT %0(s16)
233     $rax = COPY %1(s64)
234     RET 0, implicit $rax
238 name:            test_zext_i32
239 alignment:       16
240 legalized:       false
241 regBankSelected: false
242 registers:
243   - { id: 0, class: _ }
244   - { id: 1, class: _ }
245 body:             |
246   bb.1 (%ir-block.0):
247     liveins: $edi
249     ; CHECK-LABEL: name: test_zext_i32
250     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
251     ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32)
252     ; CHECK: $rax = COPY [[ZEXT]](s64)
253     ; CHECK: RET 0, implicit $rax
254     %0(s32) = COPY $edi
255     %1(s64) = G_ZEXT %0(s32)
256     $rax = COPY %1(s64)
257     RET 0, implicit $rax
261 name:            test_anyext_i1
262 alignment:       16
263 legalized:       false
264 regBankSelected: false
265 registers:
266   - { id: 0, class: _ }
267   - { id: 1, class: _ }
268   - { id: 2, class: _ }
269 body:             |
270   bb.1 (%ir-block.0):
271     liveins: $edi
273     ; CHECK-LABEL: name: test_anyext_i1
274     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
275     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
276     ; CHECK: $rax = COPY [[ANYEXT]](s64)
277     ; CHECK: RET 0, implicit $rax
278     %0(s8) = COPY $dil
279     %1(s1) = G_TRUNC %0(s8)
280     %2(s64) = G_ANYEXT %1(s1)
281     $rax = COPY %2(s64)
282     RET 0, implicit $rax
286 name:            test_anyext_i8
287 alignment:       16
288 legalized:       false
289 regBankSelected: false
290 registers:
291   - { id: 0, class: _ }
292   - { id: 1, class: _ }
293 body:             |
294   bb.1 (%ir-block.0):
295     liveins: $edi
297     ; CHECK-LABEL: name: test_anyext_i8
298     ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil
299     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8)
300     ; CHECK: $rax = COPY [[ANYEXT]](s64)
301     ; CHECK: RET 0, implicit $rax
302     %0(s8) = COPY $dil
303     %1(s64) = G_ANYEXT %0(s8)
304     $rax = COPY %1(s64)
305     RET 0, implicit $rax
309 name:            test_anyext_i16
310 alignment:       16
311 legalized:       false
312 regBankSelected: false
313 registers:
314   - { id: 0, class: _ }
315   - { id: 1, class: _ }
316 body:             |
317   bb.1 (%ir-block.0):
318     liveins: $edi
320     ; CHECK-LABEL: name: test_anyext_i16
321     ; CHECK: [[COPY:%[0-9]+]]:_(s16) = COPY $di
322     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s16)
323     ; CHECK: $rax = COPY [[ANYEXT]](s64)
324     ; CHECK: RET 0, implicit $rax
325     %0(s16) = COPY $di
326     %1(s64) = G_ANYEXT %0(s16)
327     $rax = COPY %1(s64)
328     RET 0, implicit $rax
332 name:            test_anyext_i32
333 alignment:       16
334 legalized:       false
335 regBankSelected: false
336 registers:
337   - { id: 0, class: _ }
338   - { id: 1, class: _ }
339 body:             |
340   bb.1 (%ir-block.0):
341     liveins: $edi
343     ; CHECK-LABEL: name: test_anyext_i32
344     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
345     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s32)
346     ; CHECK: $rax = COPY [[ANYEXT]](s64)
347     ; CHECK: RET 0, implicit $rax
348     %0(s32) = COPY $edi
349     %1(s64) = G_ANYEXT %0(s32)
350     $rax = COPY %1(s64)
351     RET 0, implicit $rax