Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / GlobalISel / select-shl-scalar.mir
blobd97d36cfa5e2e9ce23ff18317eb831ab7b8174bf
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL
3 --- |
5   define i64 @test_shl_i64(i64 %arg1, i64 %arg2) {
6     %res = shl i64 %arg1, %arg2
7     ret i64 %res
8   }
10   define i64 @test_shl_i64_imm(i64 %arg1) {
11     %res = shl i64 %arg1, 5
12     ret i64 %res
13   }
15   define i64 @test_shl_i64_imm1(i64 %arg1) {
16     %res = shl i64 %arg1, 1
17     ret i64 %res
18   }
20   define i32 @test_shl_i32(i32 %arg1, i32 %arg2) {
21     %res = shl i32 %arg1, %arg2
22     ret i32 %res
23   }
25   define i32 @test_shl_i32_imm(i32 %arg1) {
26     %res = shl i32 %arg1, 5
27     ret i32 %res
28   }
30   define i32 @test_shl_i32_imm1(i32 %arg1) {
31     %res = shl i32 %arg1, 1
32     ret i32 %res
33   }
35   define i16 @test_shl_i16(i32 %arg1, i32 %arg2) {
36     %a = trunc i32 %arg1 to i16
37     %a2 = trunc i32 %arg2 to i16
38     %res = shl i16 %a, %a2
39     ret i16 %res
40   }
42   define i16 @test_shl_i16_imm(i32 %arg1) {
43     %a = trunc i32 %arg1 to i16
44     %res = shl i16 %a, 5
45     ret i16 %res
46   }
48   define i16 @test_shl_i16_imm1(i32 %arg1) {
49     %a = trunc i32 %arg1 to i16
50     %res = shl i16 %a, 1
51     ret i16 %res
52   }
54   define i8 @test_shl_i8(i32 %arg1, i32 %arg2) {
55     %a = trunc i32 %arg1 to i8
56     %a2 = trunc i32 %arg2 to i8
57     %res = shl i8 %a, %a2
58     ret i8 %res
59   }
61   define i8 @test_shl_i8_imm(i32 %arg1) {
62     %a = trunc i32 %arg1 to i8
63     %res = shl i8 %a, 5
64     ret i8 %res
65   }
67   define i8 @test_shl_i8_imm1(i32 %arg1) {
68     %a = trunc i32 %arg1 to i8
69     %res = shl i8 %a, 1
70     ret i8 %res
71   }
73 ...
74 ---
75 name:            test_shl_i64
76 alignment:       16
77 legalized:       true
78 regBankSelected: true
79 tracksRegLiveness: true
80 registers:
81   - { id: 0, class: gpr, preferred-register: '' }
82   - { id: 1, class: gpr, preferred-register: '' }
83   - { id: 2, class: gpr, preferred-register: '' }
84   - { id: 3, class: gpr, preferred-register: '' }
85 liveins:
86 fixedStack:
87 stack:
88 constants:
89 body:             |
90   bb.1 (%ir-block.0):
91     liveins: $rdi, $rsi
93     ; ALL-LABEL: name: test_shl_i64
94     ; ALL: liveins: $rdi, $rsi
95     ; ALL-NEXT: {{  $}}
96     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
97     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr64_with_sub_8bit = COPY $rsi
98     ; ALL-NEXT: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit
99     ; ALL-NEXT: $cl = COPY [[COPY2]]
100     ; ALL-NEXT: [[SHL64rCL:%[0-9]+]]:gr64 = SHL64rCL [[COPY]], implicit-def dead $eflags, implicit $cl
101     ; ALL-NEXT: $rax = COPY [[SHL64rCL]]
102     ; ALL-NEXT: RET 0, implicit $rax
103     %0(s64) = COPY $rdi
104     %1(s64) = COPY $rsi
105     %2(s8) = G_TRUNC %1
106     %3(s64) = G_SHL %0, %2
107     $rax = COPY %3(s64)
108     RET 0, implicit $rax
112 name:            test_shl_i64_imm
113 alignment:       16
114 legalized:       true
115 regBankSelected: true
116 tracksRegLiveness: true
117 registers:
118   - { id: 0, class: gpr, preferred-register: '' }
119   - { id: 1, class: gpr, preferred-register: '' }
120   - { id: 2, class: gpr, preferred-register: '' }
121 liveins:
122 fixedStack:
123 stack:
124 constants:
125 body:             |
126   bb.1 (%ir-block.0):
127     liveins: $rdi
129     ; ALL-LABEL: name: test_shl_i64_imm
130     ; ALL: liveins: $rdi
131     ; ALL-NEXT: {{  $}}
132     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
133     ; ALL-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 5, implicit-def dead $eflags
134     ; ALL-NEXT: $rax = COPY [[SHL64ri]]
135     ; ALL-NEXT: RET 0, implicit $rax
136     %0(s64) = COPY $rdi
137     %1(s8) = G_CONSTANT i8 5
138     %2(s64) = G_SHL %0, %1
139     $rax = COPY %2(s64)
140     RET 0, implicit $rax
144 name:            test_shl_i64_imm1
145 alignment:       16
146 legalized:       true
147 regBankSelected: true
148 tracksRegLiveness: true
149 registers:
150   - { id: 0, class: gpr, preferred-register: '' }
151   - { id: 1, class: gpr, preferred-register: '' }
152   - { id: 2, class: gpr, preferred-register: '' }
153 liveins:
154 fixedStack:
155 stack:
156 constants:
157 body:             |
158   bb.1 (%ir-block.0):
159     liveins: $rdi
161     ; ALL-LABEL: name: test_shl_i64_imm1
162     ; ALL: liveins: $rdi
163     ; ALL-NEXT: {{  $}}
164     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
165     ; ALL-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY]], implicit-def dead $eflags
166     ; ALL-NEXT: $rax = COPY [[ADD64rr]]
167     ; ALL-NEXT: RET 0, implicit $rax
168     %0(s64) = COPY $rdi
169     %1(s8) = G_CONSTANT i8 1
170     %2(s64) = G_SHL %0, %1
171     $rax = COPY %2(s64)
172     RET 0, implicit $rax
176 name:            test_shl_i32
177 alignment:       16
178 legalized:       true
179 regBankSelected: true
180 tracksRegLiveness: true
181 registers:
182   - { id: 0, class: gpr, preferred-register: '' }
183   - { id: 1, class: gpr, preferred-register: '' }
184   - { id: 2, class: gpr, preferred-register: '' }
185   - { id: 3, class: gpr, preferred-register: '' }
186 liveins:
187 fixedStack:
188 stack:
189 constants:
190 body:             |
191   bb.1 (%ir-block.0):
192     liveins: $edi, $esi
194     ; ALL-LABEL: name: test_shl_i32
195     ; ALL: liveins: $edi, $esi
196     ; ALL-NEXT: {{  $}}
197     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
198     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
199     ; ALL-NEXT: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit
200     ; ALL-NEXT: $cl = COPY [[COPY2]]
201     ; ALL-NEXT: [[SHL32rCL:%[0-9]+]]:gr32 = SHL32rCL [[COPY]], implicit-def dead $eflags, implicit $cl
202     ; ALL-NEXT: $eax = COPY [[SHL32rCL]]
203     ; ALL-NEXT: RET 0, implicit $eax
204     %0(s32) = COPY $edi
205     %1(s32) = COPY $esi
206     %2(s8) = G_TRUNC %1
207     %3(s32) = G_SHL %0, %2
208     $eax = COPY %3(s32)
209     RET 0, implicit $eax
213 name:            test_shl_i32_imm
214 alignment:       16
215 legalized:       true
216 regBankSelected: true
217 tracksRegLiveness: true
218 registers:
219   - { id: 0, class: gpr, preferred-register: '' }
220   - { id: 1, class: gpr, preferred-register: '' }
221   - { id: 2, class: gpr, preferred-register: '' }
222 liveins:
223 fixedStack:
224 stack:
225 constants:
226 body:             |
227   bb.1 (%ir-block.0):
228     liveins: $edi
230     ; ALL-LABEL: name: test_shl_i32_imm
231     ; ALL: liveins: $edi
232     ; ALL-NEXT: {{  $}}
233     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
234     ; ALL-NEXT: [[SHL32ri:%[0-9]+]]:gr32 = SHL32ri [[COPY]], 5, implicit-def dead $eflags
235     ; ALL-NEXT: $eax = COPY [[SHL32ri]]
236     ; ALL-NEXT: RET 0, implicit $eax
237     %0(s32) = COPY $edi
238     %1(s8) = G_CONSTANT i8 5
239     %2(s32) = G_SHL %0, %1
240     $eax = COPY %2(s32)
241     RET 0, implicit $eax
245 name:            test_shl_i32_imm1
246 alignment:       16
247 legalized:       true
248 regBankSelected: true
249 tracksRegLiveness: true
250 registers:
251   - { id: 0, class: gpr, preferred-register: '' }
252   - { id: 1, class: gpr, preferred-register: '' }
253   - { id: 2, class: gpr, preferred-register: '' }
254 liveins:
255 fixedStack:
256 stack:
257 constants:
258 body:             |
259   bb.1 (%ir-block.0):
260     liveins: $edi
262     ; ALL-LABEL: name: test_shl_i32_imm1
263     ; ALL: liveins: $edi
264     ; ALL-NEXT: {{  $}}
265     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
266     ; ALL-NEXT: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr [[COPY]], [[COPY]], implicit-def dead $eflags
267     ; ALL-NEXT: $eax = COPY [[ADD32rr]]
268     ; ALL-NEXT: RET 0, implicit $eax
269     %0(s32) = COPY $edi
270     %1(s8) = G_CONSTANT i8 1
271     %2(s32) = G_SHL %0, %1
272     $eax = COPY %2(s32)
273     RET 0, implicit $eax
277 name:            test_shl_i16
278 alignment:       16
279 legalized:       true
280 regBankSelected: true
281 tracksRegLiveness: true
282 registers:
283   - { id: 0, class: gpr, preferred-register: '' }
284   - { id: 1, class: gpr, preferred-register: '' }
285   - { id: 2, class: gpr, preferred-register: '' }
286   - { id: 3, class: gpr, preferred-register: '' }
287   - { id: 4, class: gpr, preferred-register: '' }
288 liveins:
289 fixedStack:
290 stack:
291 constants:
292 body:             |
293   bb.1 (%ir-block.0):
294     liveins: $edi, $esi
296     ; ALL-LABEL: name: test_shl_i16
297     ; ALL: liveins: $edi, $esi
298     ; ALL-NEXT: {{  $}}
299     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
300     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
301     ; ALL-NEXT: [[COPY2:%[0-9]+]]:gr16 = COPY [[COPY]].sub_16bit
302     ; ALL-NEXT: [[COPY3:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit
303     ; ALL-NEXT: $cl = COPY [[COPY3]]
304     ; ALL-NEXT: [[SHL16rCL:%[0-9]+]]:gr16 = SHL16rCL [[COPY2]], implicit-def dead $eflags, implicit $cl
305     ; ALL-NEXT: $ax = COPY [[SHL16rCL]]
306     ; ALL-NEXT: RET 0, implicit $ax
307     %0(s32) = COPY $edi
308     %1(s32) = COPY $esi
309     %2(s16) = G_TRUNC %0(s32)
310     %3(s8) = G_TRUNC %1(s32)
311     %4(s16) = G_SHL %2, %3
312     $ax = COPY %4(s16)
313     RET 0, implicit $ax
317 name:            test_shl_i16_imm
318 alignment:       16
319 legalized:       true
320 regBankSelected: true
321 tracksRegLiveness: true
322 registers:
323   - { id: 0, class: gpr, preferred-register: '' }
324   - { id: 1, class: gpr, preferred-register: '' }
325   - { id: 2, class: gpr, preferred-register: '' }
326   - { id: 3, class: gpr, preferred-register: '' }
327 liveins:
328 fixedStack:
329 stack:
330 constants:
331 body:             |
332   bb.1 (%ir-block.0):
333     liveins: $edi
335     ; ALL-LABEL: name: test_shl_i16_imm
336     ; ALL: liveins: $edi
337     ; ALL-NEXT: {{  $}}
338     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
339     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr16 = COPY [[COPY]].sub_16bit
340     ; ALL-NEXT: [[SHL16ri:%[0-9]+]]:gr16 = SHL16ri [[COPY1]], 5, implicit-def dead $eflags
341     ; ALL-NEXT: $ax = COPY [[SHL16ri]]
342     ; ALL-NEXT: RET 0, implicit $ax
343     %0(s32) = COPY $edi
344     %2(s8) = G_CONSTANT i8 5
345     %1(s16) = G_TRUNC %0(s32)
346     %3(s16) = G_SHL %1, %2
347     $ax = COPY %3(s16)
348     RET 0, implicit $ax
352 name:            test_shl_i16_imm1
353 alignment:       16
354 legalized:       true
355 regBankSelected: true
356 tracksRegLiveness: true
357 registers:
358   - { id: 0, class: gpr, preferred-register: '' }
359   - { id: 1, class: gpr, preferred-register: '' }
360   - { id: 2, class: gpr, preferred-register: '' }
361   - { id: 3, class: gpr, preferred-register: '' }
362 liveins:
363 fixedStack:
364 stack:
365 constants:
366 body:             |
367   bb.1 (%ir-block.0):
368     liveins: $edi
370     ; ALL-LABEL: name: test_shl_i16_imm1
371     ; ALL: liveins: $edi
372     ; ALL-NEXT: {{  $}}
373     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
374     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr16 = COPY [[COPY]].sub_16bit
375     ; ALL-NEXT: [[ADD16rr:%[0-9]+]]:gr16 = ADD16rr [[COPY1]], [[COPY1]], implicit-def dead $eflags
376     ; ALL-NEXT: $ax = COPY [[ADD16rr]]
377     ; ALL-NEXT: RET 0, implicit $ax
378     %0(s32) = COPY $edi
379     %2(s8) = G_CONSTANT i8 1
380     %1(s16) = G_TRUNC %0(s32)
381     %3(s16) = G_SHL %1, %2
382     $ax = COPY %3(s16)
383     RET 0, implicit $ax
387 name:            test_shl_i8
388 alignment:       16
389 legalized:       true
390 regBankSelected: true
391 tracksRegLiveness: true
392 registers:
393   - { id: 0, class: gpr, preferred-register: '' }
394   - { id: 1, class: gpr, preferred-register: '' }
395   - { id: 2, class: gpr, preferred-register: '' }
396   - { id: 3, class: gpr, preferred-register: '' }
397   - { id: 4, class: gpr, preferred-register: '' }
398 liveins:
399 fixedStack:
400 stack:
401 constants:
402 body:             |
403   bb.1 (%ir-block.0):
404     liveins: $edi, $esi
406     ; ALL-LABEL: name: test_shl_i8
407     ; ALL: liveins: $edi, $esi
408     ; ALL-NEXT: {{  $}}
409     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
410     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
411     ; ALL-NEXT: [[COPY2:%[0-9]+]]:gr8 = COPY [[COPY]].sub_8bit
412     ; ALL-NEXT: [[COPY3:%[0-9]+]]:gr8 = COPY [[COPY1]].sub_8bit
413     ; ALL-NEXT: $cl = COPY [[COPY3]]
414     ; ALL-NEXT: [[SHL8rCL:%[0-9]+]]:gr8 = SHL8rCL [[COPY2]], implicit-def dead $eflags, implicit $cl
415     ; ALL-NEXT: $al = COPY [[SHL8rCL]]
416     ; ALL-NEXT: RET 0, implicit $al
417     %0(s32) = COPY $edi
418     %1(s32) = COPY $esi
419     %2(s8) = G_TRUNC %0(s32)
420     %3(s8) = G_TRUNC %1(s32)
421     %4(s8) = G_SHL %2, %3
422     $al = COPY %4(s8)
423     RET 0, implicit $al
427 name:            test_shl_i8_imm
428 alignment:       16
429 legalized:       true
430 regBankSelected: true
431 tracksRegLiveness: true
432 registers:
433   - { id: 0, class: gpr, preferred-register: '' }
434   - { id: 1, class: gpr, preferred-register: '' }
435   - { id: 2, class: gpr, preferred-register: '' }
436   - { id: 3, class: gpr, preferred-register: '' }
437 liveins:
438 fixedStack:
439 stack:
440 constants:
441 body:             |
442   bb.1 (%ir-block.0):
443     liveins: $edi
445     ; ALL-LABEL: name: test_shl_i8_imm
446     ; ALL: liveins: $edi
447     ; ALL-NEXT: {{  $}}
448     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
449     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr8 = COPY [[COPY]].sub_8bit
450     ; ALL-NEXT: [[SHL8ri:%[0-9]+]]:gr8 = SHL8ri [[COPY1]], 5, implicit-def dead $eflags
451     ; ALL-NEXT: $al = COPY [[SHL8ri]]
452     ; ALL-NEXT: RET 0, implicit $al
453     %0(s32) = COPY $edi
454     %2(s8) = G_CONSTANT i8 5
455     %1(s8) = G_TRUNC %0(s32)
456     %3(s8) = G_SHL %1, %2
457     $al = COPY %3(s8)
458     RET 0, implicit $al
462 name:            test_shl_i8_imm1
463 alignment:       16
464 legalized:       true
465 regBankSelected: true
466 tracksRegLiveness: true
467 registers:
468   - { id: 0, class: gpr, preferred-register: '' }
469   - { id: 1, class: gpr, preferred-register: '' }
470   - { id: 2, class: gpr, preferred-register: '' }
471   - { id: 3, class: gpr, preferred-register: '' }
472 liveins:
473 fixedStack:
474 stack:
475 constants:
476 body:             |
477   bb.1 (%ir-block.0):
478     liveins: $edi
480     ; ALL-LABEL: name: test_shl_i8_imm1
481     ; ALL: liveins: $edi
482     ; ALL-NEXT: {{  $}}
483     ; ALL-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
484     ; ALL-NEXT: [[COPY1:%[0-9]+]]:gr8 = COPY [[COPY]].sub_8bit
485     ; ALL-NEXT: [[ADD8rr:%[0-9]+]]:gr8 = ADD8rr [[COPY1]], [[COPY1]], implicit-def dead $eflags
486     ; ALL-NEXT: $al = COPY [[ADD8rr]]
487     ; ALL-NEXT: RET 0, implicit $al
488     %0(s32) = COPY $edi
489     %2(s8) = G_CONSTANT i8 1
490     %1(s8) = G_TRUNC %0(s32)
491     %3(s8) = G_SHL %1, %2
492     $al = COPY %3(s8)
493     RET 0, implicit $al