xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-trunc-shift.mir (revision 9e9907f1cfa424366fba58d9520f9305b537cec9)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
3
4---
5name: trunc_s32_shl_s64_5
6legalized:       true
7tracksRegLiveness: true
8body:             |
9  bb.0:
10    liveins: $vgpr0_vgpr1
11
12    ; CHECK-LABEL: name: trunc_s32_shl_s64_5
13    ; CHECK: liveins: $vgpr0_vgpr1
14    ; CHECK-NEXT: {{  $}}
15    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
16    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
17    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
18    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]](s32)
19    ; CHECK-NEXT: $vgpr0 = COPY [[SHL]](s32)
20    %0:_(s64) = COPY $vgpr0_vgpr1
21    %1:_(s32) = G_CONSTANT i32 1
22    %2:_(s64) = G_SHL %0:_, %1
23    %3:_(s32) = G_TRUNC %2
24    $vgpr0 = COPY %3
25...
26
27---
28name: trunc_s16_shl_s32_5
29legalized:       true
30tracksRegLiveness: true
31body:             |
32  bb.0:
33    liveins: $vgpr0
34
35    ; CHECK-LABEL: name: trunc_s16_shl_s32_5
36    ; CHECK: liveins: $vgpr0
37    ; CHECK-NEXT: {{  $}}
38    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
39    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
40    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32)
41    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[SHL]](s32)
42    ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s16)
43    %0:_(s32) = COPY $vgpr0
44    %1:_(s32) = G_CONSTANT i32 1
45    %2:_(s32) = G_SHL %0:_, %1
46    %3:_(s16) = G_TRUNC %2
47    S_ENDPGM 0, implicit %3
48
49...
50
51---
52name: trunc_s16_shl_s64_5
53legalized:       true
54tracksRegLiveness: true
55body:             |
56  bb.0:
57    liveins: $vgpr0_vgpr1
58
59    ; CHECK-LABEL: name: trunc_s16_shl_s64_5
60    ; CHECK: liveins: $vgpr0_vgpr1
61    ; CHECK-NEXT: {{  $}}
62    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
63    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
64    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[C]](s32)
65    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[SHL]](s64)
66    ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s16)
67    %0:_(s64) = COPY $vgpr0_vgpr1
68    %1:_(s32) = G_CONSTANT i32 1
69    %2:_(s64) = G_SHL %0:_, %1
70    %3:_(s16) = G_TRUNC %2
71    S_ENDPGM 0, implicit %3
72
73...
74
75---
76name:            s16_trunc_s64_lshr_16
77tracksRegLiveness: true
78body:             |
79  bb.0:
80    liveins: $vgpr0
81    ; CHECK-LABEL: name: s16_trunc_s64_lshr_16
82    ; CHECK: liveins: $vgpr0
83    ; CHECK-NEXT: {{  $}}
84    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
85    ; CHECK-NEXT: %amt:_(s32) = G_CONSTANT i32 16
86    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], %amt(s32)
87    ; CHECK-NEXT: %trunc:_(s16) = G_TRUNC [[LSHR]](s32)
88    ; CHECK-NEXT: %foo:_(s16) = G_CONSTANT i16 55
89    ; CHECK-NEXT: %keep:_(s32) = G_MERGE_VALUES %trunc(s16), %foo(s16)
90    ; CHECK-NEXT: $vgpr0 = COPY %keep(s32)
91    %0:_(s32) = COPY $vgpr0
92    %src:_(s64) = G_ZEXT %0
93    %amt:_(s32) = G_CONSTANT i32 16
94    %shift:_(s64) = G_LSHR %src, %amt
95    %trunc:_(s16) = G_TRUNC %shift
96    %foo:_(s16) = G_CONSTANT i16 55
97    %keep:_(s32) = G_MERGE_VALUES %trunc, %foo
98    $vgpr0 = COPY %keep
99...
100
101---
102name:            s16_trunc_s64_ashr_16
103tracksRegLiveness: true
104body:             |
105  bb.0:
106    liveins: $vgpr0
107    ; CHECK-LABEL: name: s16_trunc_s64_ashr_16
108    ; CHECK: liveins: $vgpr0
109    ; CHECK-NEXT: {{  $}}
110    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
111    ; CHECK-NEXT: %amt:_(s32) = G_CONSTANT i32 16
112    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[COPY]], %amt(s32)
113    ; CHECK-NEXT: %trunc:_(s16) = G_TRUNC [[ASHR]](s32)
114    ; CHECK-NEXT: %foo:_(s16) = G_CONSTANT i16 55
115    ; CHECK-NEXT: %keep:_(s32) = G_MERGE_VALUES %trunc(s16), %foo(s16)
116    ; CHECK-NEXT: $vgpr0 = COPY %keep(s32)
117    %0:_(s32) = COPY $vgpr0
118    %src:_(s64) = G_ZEXT %0
119    %amt:_(s32) = G_CONSTANT i32 16
120    %shift:_(s64) = G_ASHR %src, %amt
121    %trunc:_(s16) = G_TRUNC %shift
122    %foo:_(s16) = G_CONSTANT i16 55
123    %keep:_(s32) = G_MERGE_VALUES %trunc, %foo
124    $vgpr0 = COPY %keep
125...
126
127---
128name:            s16_trunc_s64_lshr_17_nofold
129tracksRegLiveness: true
130body:             |
131  bb.0:
132    liveins: $vgpr0
133    ; CHECK-LABEL: name: s16_trunc_s64_lshr_17_nofold
134    ; CHECK: liveins: $vgpr0
135    ; CHECK-NEXT: {{  $}}
136    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
137    ; CHECK-NEXT: %src:_(s64) = G_ZEXT [[COPY]](s32)
138    ; CHECK-NEXT: %amt:_(s32) = G_CONSTANT i32 17
139    ; CHECK-NEXT: %shift:_(s64) = G_LSHR %src, %amt(s32)
140    ; CHECK-NEXT: %trunc:_(s16) = G_TRUNC %shift(s64)
141    ; CHECK-NEXT: %foo:_(s16) = G_CONSTANT i16 55
142    ; CHECK-NEXT: %keep:_(s32) = G_MERGE_VALUES %trunc(s16), %foo(s16)
143    ; CHECK-NEXT: $vgpr0 = COPY %keep(s32)
144    %0:_(s32) = COPY $vgpr0
145    %src:_(s64) = G_ZEXT %0
146    %amt:_(s32) = G_CONSTANT i32 17
147    %shift:_(s64) = G_LSHR %src, %amt
148    %trunc:_(s16) = G_TRUNC %shift
149    %foo:_(s16) = G_CONSTANT i16 55
150    %keep:_(s32) = G_MERGE_VALUES %trunc, %foo
151    $vgpr0 = COPY %keep
152...
153
154---
155name:            s26_trunc_s64_lshr_6
156tracksRegLiveness: true
157body:             |
158  bb.0:
159    liveins: $vgpr0
160    ; CHECK-LABEL: name: s26_trunc_s64_lshr_6
161    ; CHECK: liveins: $vgpr0
162    ; CHECK-NEXT: {{  $}}
163    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
164    ; CHECK-NEXT: %amt:_(s32) = G_CONSTANT i32 6
165    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], %amt(s32)
166    ; CHECK-NEXT: %trunc:_(s26) = G_TRUNC [[LSHR]](s32)
167    ; CHECK-NEXT: %foo:_(s26) = G_CONSTANT i26 55
168    ; CHECK-NEXT: %keep0:_(s26) = G_ADD %trunc, %foo
169    ; CHECK-NEXT: %keep1:_(s32) = G_ANYEXT %keep0(s26)
170    ; CHECK-NEXT: $vgpr0 = COPY %keep1(s32)
171    %0:_(s32) = COPY $vgpr0
172    %src:_(s64) = G_ZEXT %0
173    %amt:_(s32) = G_CONSTANT i32 6
174    %shift:_(s64) = G_LSHR %src, %amt
175    %trunc:_(s26) = G_TRUNC %shift
176    %foo:_(s26) = G_CONSTANT i26 55
177    %keep0:_(s26) = G_ADD %trunc, %foo
178    %keep1:_(s32) = G_ANYEXT %keep0
179    $vgpr0 = COPY %keep1
180...
181
182---
183name:            s26_trunc_s64_lshr_7_nofold
184tracksRegLiveness: true
185body:             |
186  bb.0:
187    liveins: $vgpr0
188    ; CHECK-LABEL: name: s26_trunc_s64_lshr_7_nofold
189    ; CHECK: liveins: $vgpr0
190    ; CHECK-NEXT: {{  $}}
191    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
192    ; CHECK-NEXT: %src:_(s64) = G_ZEXT [[COPY]](s32)
193    ; CHECK-NEXT: %amt:_(s32) = G_CONSTANT i32 7
194    ; CHECK-NEXT: %shift:_(s64) = G_LSHR %src, %amt(s32)
195    ; CHECK-NEXT: %trunc:_(s26) = G_TRUNC %shift(s64)
196    ; CHECK-NEXT: %foo:_(s26) = G_CONSTANT i26 55
197    ; CHECK-NEXT: %keep0:_(s26) = G_ADD %trunc, %foo
198    ; CHECK-NEXT: %keep1:_(s32) = G_ANYEXT %keep0(s26)
199    ; CHECK-NEXT: $vgpr0 = COPY %keep1(s32)
200    %0:_(s32) = COPY $vgpr0
201    %src:_(s64) = G_ZEXT %0
202    %amt:_(s32) = G_CONSTANT i32 7
203    %shift:_(s64) = G_LSHR %src, %amt
204    %trunc:_(s26) = G_TRUNC %shift
205    %foo:_(s26) = G_CONSTANT i26 55
206    %keep0:_(s26) = G_ADD %trunc, %foo
207    %keep1:_(s32) = G_ANYEXT %keep0
208    $vgpr0 = COPY %keep1
209...
210