xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir (revision 143be6a60186d6c1a6a298d0b7acdc1a4d69a321)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -debugify-and-strip-all-safe -mtriple=aarch64 -run-pass=legalizer -global-isel-abort=1 %s -o - | FileCheck %s
3---
4name:            test_shift
5body:             |
6  bb.0.entry:
7    ; CHECK-LABEL: name: test_shift
8    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
9    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
10    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
11    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
12    ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC]], [[C]]
13    ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
14    ; CHECK-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[TRUNC1]], 8
15    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SEXT_INREG]], [[AND]](s32)
16    ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)
17    ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
18    ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[TRUNC2]], [[C]]
19    ; CHECK-NEXT: [[TRUNC3:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
20    ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[TRUNC3]], [[C]]
21    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND2]], [[AND1]](s32)
22    ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
23    ; CHECK-NEXT: [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
24    ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(s32) = G_AND [[TRUNC4]], [[C]]
25    ; CHECK-NEXT: [[TRUNC5:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
26    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC5]], [[AND3]](s32)
27    ; CHECK-NEXT: $w0 = COPY [[SHL]](s32)
28    %0:_(s64) = COPY $x0
29    %1:_(s64) = COPY $x1
30    %2:_(s8) = G_TRUNC %0(s64)
31    %3:_(s8) = G_TRUNC %1(s64)
32    %4:_(s8) = G_ASHR %2, %3
33    %7:_(s32) = G_ANYEXT %4(s8)
34    $w0 = COPY %7(s32)
35    %5:_(s8) = G_LSHR %2, %3
36    %8:_(s32) = G_ANYEXT %5(s8)
37    $w0 = COPY %8(s32)
38    %6:_(s8) = G_SHL %2, %3
39    %9:_(s32) = G_ANYEXT %6(s8)
40    $w0 = COPY %9(s32)
41
42...
43---
44name: test_shl_i64_i32
45body:             |
46  bb.0:
47    ; CHECK-LABEL: name: test_shl_i64_i32
48    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
49    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
50    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY1]](s32)
51    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY]], [[ZEXT]](s64)
52    ; CHECK-NEXT: $x0 = COPY [[SHL]](s64)
53    %0:_(s64) = COPY $x0
54    %1:_(s32) = COPY $w1
55    %2:_(s64) = G_SHL %0, %1
56    $x0 = COPY %2(s64)
57
58...
59---
60name: test_ashr_i64_i32
61body:             |
62  bb.0:
63    ; CHECK-LABEL: name: test_ashr_i64_i32
64    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
65    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
66    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY1]](s32)
67    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[COPY]], [[ZEXT]](s64)
68    ; CHECK-NEXT: $x0 = COPY [[ASHR]](s64)
69    %0:_(s64) = COPY $x0
70    %1:_(s32) = COPY $w1
71    %2:_(s64) = G_ASHR %0, %1
72    $x0 = COPY %2(s64)
73
74...
75---
76name: test_lshr_i64_i32
77body:             |
78  bb.0:
79    ; CHECK-LABEL: name: test_lshr_i64_i32
80    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
81    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
82    ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY1]](s32)
83    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[COPY]], [[ZEXT]](s64)
84    ; CHECK-NEXT: $x0 = COPY [[LSHR]](s64)
85    %0:_(s64) = COPY $x0
86    %1:_(s32) = COPY $w1
87    %2:_(s64) = G_LSHR %0, %1
88    $x0 = COPY %2(s64)
89
90...
91
92---
93name: test_shl_s128_s128
94body:             |
95  bb.0:
96    ; CHECK-LABEL: name: test_shl_s128_s128
97    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
98    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s128) = COPY $q1
99    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[COPY1]](s128)
100    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
101    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](s128)
102    ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[TRUNC]], [[C]]
103    ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C]], [[TRUNC]]
104    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
105    ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[TRUNC]](s64), [[C]]
106    ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[TRUNC]](s64), [[C1]]
107    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[UV]], [[TRUNC]](s64)
108    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[UV]], [[SUB1]](s64)
109    ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[UV1]], [[TRUNC]](s64)
110    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR]], [[SHL1]]
111    ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s64) = G_SHL [[UV]], [[SUB]](s64)
112    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[SHL]], [[C1]]
113    ; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[OR]], [[SHL2]]
114    ; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s32), [[UV1]], [[SELECT1]]
115    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[SELECT]](s64), [[SELECT2]](s64)
116    ; CHECK-NEXT: $q0 = COPY [[MV]](s128)
117    %0:_(s128) = COPY $q0
118    %1:_(s128) = COPY $q1
119    %2:_(s128) = G_SHL %0, %1
120    $q0 = COPY %2
121
122...
123
124---
125name: test_lshr_s128_s128
126body:             |
127  bb.0:
128    ; CHECK-LABEL: name: test_lshr_s128_s128
129    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
130    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s128) = COPY $q1
131    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[COPY1]](s128)
132    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
133    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](s128)
134    ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[TRUNC]], [[C]]
135    ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C]], [[TRUNC]]
136    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
137    ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[TRUNC]](s64), [[C]]
138    ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[TRUNC]](s64), [[C1]]
139    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[UV1]], [[TRUNC]](s64)
140    ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s64) = G_LSHR [[UV]], [[TRUNC]](s64)
141    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[UV1]], [[SUB1]](s64)
142    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR1]], [[SHL]]
143    ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s64) = G_LSHR [[UV1]], [[SUB]](s64)
144    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[OR]], [[LSHR2]]
145    ; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s32), [[UV]], [[SELECT]]
146    ; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[LSHR]], [[C1]]
147    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[SELECT1]](s64), [[SELECT2]](s64)
148    ; CHECK-NEXT: $q0 = COPY [[MV]](s128)
149    %0:_(s128) = COPY $q0
150    %1:_(s128) = COPY $q1
151    %2:_(s128) = G_LSHR %0, %1
152    $q0 = COPY %2
153
154...
155
156---
157name: test_ashr_s128_s128
158body:             |
159  bb.0:
160    ; CHECK-LABEL: name: test_ashr_s128_s128
161    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
162    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s128) = COPY $q1
163    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[COPY1]](s128)
164    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
165    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](s128)
166    ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[TRUNC]], [[C]]
167    ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C]], [[TRUNC]]
168    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
169    ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[TRUNC]](s64), [[C]]
170    ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[TRUNC]](s64), [[C1]]
171    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[UV1]], [[TRUNC]](s64)
172    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[UV]], [[TRUNC]](s64)
173    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[UV1]], [[SUB1]](s64)
174    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR]], [[SHL]]
175    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 63
176    ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(s64) = G_ASHR [[UV1]], [[C2]](s64)
177    ; CHECK-NEXT: [[ASHR2:%[0-9]+]]:_(s64) = G_ASHR [[UV1]], [[SUB]](s64)
178    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[OR]], [[ASHR2]]
179    ; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s32), [[UV]], [[SELECT]]
180    ; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[ASHR]], [[ASHR1]]
181    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[SELECT1]](s64), [[SELECT2]](s64)
182    ; CHECK-NEXT: $q0 = COPY [[MV]](s128)
183    %0:_(s128) = COPY $q0
184    %1:_(s128) = COPY $q1
185    %2:_(s128) = G_ASHR %0, %1
186    $q0 = COPY %2
187
188...
189
190---
191name: test_ashr_v2i32
192body:             |
193  bb.0:
194    ; CHECK-LABEL: name: test_ashr_v2i32
195    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
196    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
197    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<2 x s32>) = G_ASHR [[COPY]], [[COPY1]](<2 x s32>)
198    ; CHECK-NEXT: $d0 = COPY [[ASHR]](<2 x s32>)
199    %0:_(<2 x s32>) = COPY $d0
200    %1:_(<2 x s32>) = COPY $d1
201    %2:_(<2 x s32>) = G_ASHR %0, %1
202    $d0 = COPY %2
203
204...
205---
206name: test_ashr_v4i32
207body:             |
208  bb.0:
209    ; CHECK-LABEL: name: test_ashr_v4i32
210    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
211    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
212    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<4 x s32>) = G_ASHR [[COPY]], [[COPY1]](<4 x s32>)
213    ; CHECK-NEXT: $q0 = COPY [[ASHR]](<4 x s32>)
214    %0:_(<4 x s32>) = COPY $q0
215    %1:_(<4 x s32>) = COPY $q1
216    %2:_(<4 x s32>) = G_ASHR %0, %1
217    $q0 = COPY %2
218
219...
220---
221name:            shl_cimm_32
222body:             |
223  bb.1:
224    liveins: $w0
225
226    ; CHECK-LABEL: name: shl_cimm_32
227    ; CHECK: liveins: $w0
228    ; CHECK-NEXT: {{  $}}
229    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
230    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
231    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s64)
232    ; CHECK-NEXT: $w0 = COPY [[SHL]](s32)
233    ; CHECK-NEXT: RET_ReallyLR implicit $w0
234    %0:_(s32) = COPY $w0
235    %1:_(s32) = G_CONSTANT i32 8
236    %2:_(s32) = G_SHL %0, %1(s32)
237    $w0 = COPY %2(s32)
238    RET_ReallyLR implicit $w0
239
240...
241---
242name:            lshr_cimm_32
243body:             |
244  bb.1:
245    liveins: $w0
246
247    ; CHECK-LABEL: name: lshr_cimm_32
248    ; CHECK: liveins: $w0
249    ; CHECK-NEXT: {{  $}}
250    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
251    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
252    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s64)
253    ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)
254    ; CHECK-NEXT: RET_ReallyLR implicit $w0
255    %0:_(s32) = COPY $w0
256    %1:_(s32) = G_CONSTANT i32 8
257    %2:_(s32) = G_LSHR %0, %1(s32)
258    $w0 = COPY %2(s32)
259    RET_ReallyLR implicit $w0
260
261...
262---
263name:            ashr_cimm_32
264body:             |
265  bb.1:
266    liveins: $w0
267
268    ; CHECK-LABEL: name: ashr_cimm_32
269    ; CHECK: liveins: $w0
270    ; CHECK-NEXT: {{  $}}
271    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
272    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
273    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[COPY]], [[C]](s64)
274    ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)
275    ; CHECK-NEXT: RET_ReallyLR implicit $w0
276    %0:_(s32) = COPY $w0
277    %1:_(s32) = G_CONSTANT i32 8
278    %2:_(s32) = G_ASHR %0, %1(s32)
279    $w0 = COPY %2(s32)
280    RET_ReallyLR implicit $w0
281
282...
283---
284name: test_ashr_v16i8
285body:             |
286  bb.0:
287    ; CHECK-LABEL: name: test_ashr_v16i8
288    ; CHECK: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
289    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<16 x s8>) = COPY $q1
290    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<16 x s8>) = G_ASHR [[COPY]], [[COPY1]](<16 x s8>)
291    ; CHECK-NEXT: $q0 = COPY [[ASHR]](<16 x s8>)
292    %0:_(<16 x s8>) = COPY $q0
293    %1:_(<16 x s8>) = COPY $q1
294    %2:_(<16 x s8>) = G_ASHR %0, %1
295    $q0 = COPY %2
296...
297---
298name: test_ashr_v8i16
299body:             |
300  bb.0:
301    ; CHECK-LABEL: name: test_ashr_v8i16
302    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0
303    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s16>) = COPY $q1
304    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<8 x s16>) = G_ASHR [[COPY]], [[COPY1]](<8 x s16>)
305    ; CHECK-NEXT: $q0 = COPY [[ASHR]](<8 x s16>)
306    %0:_(<8 x s16>) = COPY $q0
307    %1:_(<8 x s16>) = COPY $q1
308    %2:_(<8 x s16>) = G_ASHR %0, %1
309    $q0 = COPY %2
310...
311---
312name: test_shl_v16i8
313body:             |
314  bb.0:
315    ; CHECK-LABEL: name: test_shl_v16i8
316    ; CHECK: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
317    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<16 x s8>) = COPY $q1
318    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<16 x s8>) = G_SHL [[COPY]], [[COPY1]](<16 x s8>)
319    ; CHECK-NEXT: $q0 = COPY [[SHL]](<16 x s8>)
320    %0:_(<16 x s8>) = COPY $q0
321    %1:_(<16 x s8>) = COPY $q1
322    %2:_(<16 x s8>) = G_SHL %0, %1
323    $q0 = COPY %2
324...
325---
326name: test_shl_v8i16
327body:             |
328  bb.0:
329    ; CHECK-LABEL: name: test_shl_v8i16
330    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0
331    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s16>) = COPY $q1
332    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<8 x s16>) = G_SHL [[COPY]], [[COPY1]](<8 x s16>)
333    ; CHECK-NEXT: $q0 = COPY [[SHL]](<8 x s16>)
334    %0:_(<8 x s16>) = COPY $q0
335    %1:_(<8 x s16>) = COPY $q1
336    %2:_(<8 x s16>) = G_SHL %0, %1
337    $q0 = COPY %2
338...
339---
340name: test_lshr_v16i8
341body:             |
342  bb.0:
343    ; CHECK-LABEL: name: test_lshr_v16i8
344    ; CHECK: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $q0
345    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<16 x s8>) = COPY $q1
346    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<16 x s8>) = G_LSHR [[COPY]], [[COPY1]](<16 x s8>)
347    ; CHECK-NEXT: $q0 = COPY [[LSHR]](<16 x s8>)
348    %0:_(<16 x s8>) = COPY $q0
349    %1:_(<16 x s8>) = COPY $q1
350    %2:_(<16 x s8>) = G_LSHR %0, %1
351    $q0 = COPY %2
352...
353---
354name: test_lshr_v8i16
355body:             |
356  bb.0:
357    ; CHECK-LABEL: name: test_lshr_v8i16
358    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0
359    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s16>) = COPY $q1
360    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<8 x s16>) = G_LSHR [[COPY]], [[COPY1]](<8 x s16>)
361    ; CHECK-NEXT: $q0 = COPY [[LSHR]](<8 x s16>)
362    %0:_(<8 x s16>) = COPY $q0
363    %1:_(<8 x s16>) = COPY $q1
364    %2:_(<8 x s16>) = G_LSHR %0, %1
365    $q0 = COPY %2
366...
367---
368name: test_shl_v4i16
369body:             |
370  bb.0:
371    ; CHECK-LABEL: name: test_shl_v4i16
372    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
373    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s16>) = COPY $d1
374    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<4 x s16>) = G_SHL [[COPY]], [[COPY1]](<4 x s16>)
375    ; CHECK-NEXT: $d0 = COPY [[SHL]](<4 x s16>)
376    %0:_(<4 x s16>) = COPY $d0
377    %1:_(<4 x s16>) = COPY $d1
378    %2:_(<4 x s16>) = G_SHL %0, %1
379    $d0 = COPY %2
380...
381---
382name: test_lshr_v4i16
383body:             |
384  bb.0:
385    ; CHECK-LABEL: name: test_lshr_v4i16
386    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
387    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s16>) = COPY $d1
388    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<4 x s16>) = G_LSHR [[COPY]], [[COPY1]](<4 x s16>)
389    ; CHECK-NEXT: $d0 = COPY [[LSHR]](<4 x s16>)
390    %0:_(<4 x s16>) = COPY $d0
391    %1:_(<4 x s16>) = COPY $d1
392    %2:_(<4 x s16>) = G_LSHR %0, %1
393    $d0 = COPY %2
394...
395---
396name: test_ashr_v4i16
397body:             |
398  bb.0:
399    ; CHECK-LABEL: name: test_ashr_v4i16
400    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
401    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s16>) = COPY $d1
402    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<4 x s16>) = G_ASHR [[COPY]], [[COPY1]](<4 x s16>)
403    ; CHECK-NEXT: $d0 = COPY [[ASHR]](<4 x s16>)
404    %0:_(<4 x s16>) = COPY $d0
405    %1:_(<4 x s16>) = COPY $d1
406    %2:_(<4 x s16>) = G_ASHR %0, %1
407    $d0 = COPY %2
408...
409---
410name: test_ashr_v8s32
411body:             |
412  bb.0:
413    ; CHECK-LABEL: name: test_ashr_v8s32
414    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
415    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<4 x s32>) = G_ASHR [[DEF]], [[DEF]](<4 x s32>)
416    ; CHECK-NEXT: [[ASHR1:%[0-9]+]]:_(<4 x s32>) = G_ASHR [[DEF]], [[DEF]](<4 x s32>)
417    ; CHECK-NEXT: $q0 = COPY [[ASHR]](<4 x s32>)
418    ; CHECK-NEXT: $q1 = COPY [[ASHR1]](<4 x s32>)
419    %0:_(<8 x s32>) = G_IMPLICIT_DEF
420    %1:_(<8 x s32>) = G_IMPLICIT_DEF
421    %2:_(<8 x s32>) = G_ASHR %0, %1
422    %3:_(<4 x s32>), %4:_(<4 x s32>) = G_UNMERGE_VALUES %2
423    $q0 = COPY %3(<4 x s32>)
424    $q1 = COPY %4(<4 x s32>)
425...
426---
427name: test_shl_v8s8
428body:             |
429  bb.0:
430    ; CHECK-LABEL: name: test_shl_v8s8
431    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
432    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
433    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<8 x s8>) = G_SHL [[COPY]], [[COPY1]](<8 x s8>)
434    ; CHECK-NEXT: $d0 = COPY [[SHL]](<8 x s8>)
435    %0:_(<8 x s8>) = COPY $d0
436    %1:_(<8 x s8>) = COPY $d1
437    %2:_(<8 x s8>) = G_SHL %0, %1
438    $d0 = COPY %2
439...
440---
441name: test_ashr_v8s8
442body:             |
443  bb.0:
444    ; CHECK-LABEL: name: test_ashr_v8s8
445    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
446    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
447    ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(<8 x s8>) = G_ASHR [[COPY]], [[COPY1]](<8 x s8>)
448    ; CHECK-NEXT: $d0 = COPY [[ASHR]](<8 x s8>)
449    %0:_(<8 x s8>) = COPY $d0
450    %1:_(<8 x s8>) = COPY $d1
451    %2:_(<8 x s8>) = G_ASHR %0, %1
452    $d0 = COPY %2
453...
454
455---
456name: test_lshr_v8s8
457body:             |
458  bb.0:
459    ; CHECK-LABEL: name: test_lshr_v8s8
460    ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
461    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
462    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<8 x s8>) = G_LSHR [[COPY]], [[COPY1]](<8 x s8>)
463    ; CHECK-NEXT: $d0 = COPY [[LSHR]](<8 x s8>)
464    %0:_(<8 x s8>) = COPY $d0
465    %1:_(<8 x s8>) = COPY $d1
466    %2:_(<8 x s8>) = G_LSHR %0, %1
467    $d0 = COPY %2
468...
469---
470name: test_lshr_nonpow2
471body:             |
472  bb.0:
473    ; CHECK-LABEL: name: test_lshr_nonpow2
474    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
475    ; CHECK-NEXT: %a:_(s32) = COPY $w1
476    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
477    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES %a(s32), %a(s32)
478    ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES %a(s32), [[C]](s32)
479    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
480    ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[C1]]
481    ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C1]], [[COPY]]
482    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
483    ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s64), [[C1]]
484    ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s64), [[C2]]
485    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[MV]], [[COPY]](s64)
486    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[MV1]], [[SUB1]](s64)
487    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR]], [[SHL]]
488    ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s64) = G_LSHR [[MV1]], [[SUB]](s64)
489    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[OR]], [[LSHR1]]
490    ; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s32), [[MV]], [[SELECT]]
491    ; CHECK-NEXT: %d1:_(s32), %d2:_(s32) = G_UNMERGE_VALUES [[SELECT1]](s64)
492    ; CHECK-NEXT: $w0 = COPY %d2(s32)
493    %0:_(s64) = COPY $x0
494    %a:_(s32) = COPY $w1
495    %merge:_(s96) = G_MERGE_VALUES %a, %a, %a
496    %lshr:_(s96) = G_LSHR %merge, %0
497    %d1:_(s32), %d2:_(s32), %d3:_(s32) = G_UNMERGE_VALUES %lshr
498    $w0 = COPY %d2(s32)
499
500...
501---
502name: test_lshr_nonpow2_wide
503body:             |
504  bb.0:
505    ; CHECK-LABEL: name: test_lshr_nonpow2_wide
506    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
507    ; CHECK-NEXT: %a:_(s32) = COPY $w1
508    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
509    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES %a(s32), %a(s32)
510    ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES %a(s32), %a(s32)
511    ; CHECK-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES %a(s32), [[C]](s32)
512    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
513    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 128
514    ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[C2]]
515    ; CHECK-NEXT: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C2]], [[COPY]]
516    ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s64), [[C2]]
517    ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s64), [[C1]]
518    ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
519    ; CHECK-NEXT: [[SUB2:%[0-9]+]]:_(s64) = G_SUB [[COPY]], [[C3]]
520    ; CHECK-NEXT: [[SUB3:%[0-9]+]]:_(s64) = G_SUB [[C3]], [[COPY]]
521    ; CHECK-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[COPY]](s64), [[C3]]
522    ; CHECK-NEXT: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s64), [[C1]]
523    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[MV]], [[COPY]](s64)
524    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[MV1]], [[SUB3]](s64)
525    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR]], [[SHL]]
526    ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s64) = G_LSHR [[MV1]], [[SUB2]](s64)
527    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP2]](s32), [[OR]], [[LSHR1]]
528    ; CHECK-NEXT: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[ICMP3]](s32), [[MV]], [[SELECT]]
529    ; CHECK-NEXT: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[SUB1]](s64), [[C3]]
530    ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[MV2]], [[SUB1]](s64)
531    ; CHECK-NEXT: [[SELECT2:%[0-9]+]]:_(s64) = G_SELECT [[ICMP4]](s32), [[SHL1]], [[C1]]
532    ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s64) = G_OR [[SELECT1]], [[SELECT2]]
533    ; CHECK-NEXT: [[SUB4:%[0-9]+]]:_(s64) = G_SUB [[SUB]], [[C3]]
534    ; CHECK-NEXT: [[SUB5:%[0-9]+]]:_(s64) = G_SUB [[C3]], [[SUB]]
535    ; CHECK-NEXT: [[ICMP5:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[SUB]](s64), [[C3]]
536    ; CHECK-NEXT: [[ICMP6:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[SUB]](s64), [[C1]]
537    ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s64) = G_LSHR [[MV2]], [[SUB]](s64)
538    ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s64) = G_SHL [[C1]], [[SUB5]](s64)
539    ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s64) = G_OR [[LSHR2]], [[SHL2]]
540    ; CHECK-NEXT: [[LSHR3:%[0-9]+]]:_(s64) = G_LSHR [[C1]], [[SUB4]](s64)
541    ; CHECK-NEXT: [[SELECT3:%[0-9]+]]:_(s64) = G_SELECT [[ICMP5]](s32), [[OR2]], [[LSHR3]]
542    ; CHECK-NEXT: [[SELECT4:%[0-9]+]]:_(s64) = G_SELECT [[ICMP6]](s32), [[MV2]], [[SELECT3]]
543    ; CHECK-NEXT: [[SELECT5:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s32), [[OR1]], [[SELECT4]]
544    ; CHECK-NEXT: [[SELECT6:%[0-9]+]]:_(s64) = G_SELECT [[ICMP1]](s32), [[MV]], [[SELECT5]]
545    ; CHECK-NEXT: %d1:_(s32), %d2:_(s32) = G_UNMERGE_VALUES [[SELECT6]](s64)
546    ; CHECK-NEXT: $w0 = COPY %d2(s32)
547    %0:_(s64) = COPY $x0
548    %a:_(s32) = COPY $w1
549    %merge:_(s160) = G_MERGE_VALUES %a, %a, %a, %a, %a
550    %lshr:_(s160) = G_LSHR %merge, %0
551    %d1:_(s32), %d2:_(s32), %d3:_(s32), %d4:_(s32), %d5:_(s32) = G_UNMERGE_VALUES %lshr
552    $w0 = COPY %d2(s32)
553
554...
555