• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
3
4---
5name:  remove_and_255_zextload
6legalized:       true
7tracksRegLiveness: true
8body:             |
9  bb.0:
10    liveins: $vgpr0_vgpr1
11    ; CHECK-LABEL: name: remove_and_255_zextload
12    ; CHECK: liveins: $vgpr0_vgpr1
13    ; CHECK: %ptr:_(p1) = COPY $vgpr0_vgpr1
14    ; CHECK: %load:_(s32) = G_ZEXTLOAD %ptr(p1) :: (load 1, addrspace 1)
15    ; CHECK: $vgpr0 = COPY %load(s32)
16    %ptr:_(p1) = COPY $vgpr0_vgpr1
17    %load:_(s32) = G_ZEXTLOAD %ptr :: (load 1, addrspace 1, align 1)
18    %mask:_(s32) = G_CONSTANT i32 255
19    %and:_(s32) = G_AND %load, %mask
20    $vgpr0 = COPY %and
21
22...
23
24---
25name:  remove_and_255_smin_zextload
26legalized:       true
27tracksRegLiveness: true
28body:             |
29  bb.0:
30    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
31    ; CHECK-LABEL: name: remove_and_255_smin_zextload
32    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
33    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
34    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
35    ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1)
36    ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1)
37    ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1
38    ; CHECK: $vgpr0 = COPY %smin(s32)
39    %ptr0:_(p1) = COPY $vgpr0_vgpr1
40    %ptr1:_(p1) = COPY $vgpr2_vgpr3
41    %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1)
42    %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1)
43    %smin:_(s32) = G_SMIN %load0, %load1
44    %mask:_(s32) = G_CONSTANT i32 255
45    %and:_(s32) = G_AND %smin, %mask
46    $vgpr0 = COPY %and
47
48...
49
50---
51name:  remove_and_255_smax_zextload
52legalized:       true
53tracksRegLiveness: true
54body:             |
55  bb.0:
56    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
57    ; CHECK-LABEL: name: remove_and_255_smax_zextload
58    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
59    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
60    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
61    ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1)
62    ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1)
63    ; CHECK: %smax:_(s32) = G_SMAX %load0, %load1
64    ; CHECK: $vgpr0 = COPY %smax(s32)
65    %ptr0:_(p1) = COPY $vgpr0_vgpr1
66    %ptr1:_(p1) = COPY $vgpr2_vgpr3
67    %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1)
68    %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1)
69    %smax:_(s32) = G_SMAX %load0, %load1
70    %mask:_(s32) = G_CONSTANT i32 255
71    %and:_(s32) = G_AND %smax, %mask
72    $vgpr0 = COPY %and
73
74...
75
76---
77name:  remove_and_255_umin_zextload
78legalized:       true
79tracksRegLiveness: true
80body:             |
81  bb.0:
82    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
83    ; CHECK-LABEL: name: remove_and_255_umin_zextload
84    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
85    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
86    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
87    ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1)
88    ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1)
89    ; CHECK: %umin:_(s32) = G_UMIN %load0, %load1
90    ; CHECK: $vgpr0 = COPY %umin(s32)
91    %ptr0:_(p1) = COPY $vgpr0_vgpr1
92    %ptr1:_(p1) = COPY $vgpr2_vgpr3
93    %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1)
94    %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1)
95    %umin:_(s32) = G_UMIN %load0, %load1
96    %mask:_(s32) = G_CONSTANT i32 255
97    %and:_(s32) = G_AND %umin, %mask
98    $vgpr0 = COPY %and
99
100...
101
102---
103name:  remove_and_255_umax_zextload
104legalized:       true
105tracksRegLiveness: true
106body:             |
107  bb.0:
108    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
109    ; CHECK-LABEL: name: remove_and_255_umax_zextload
110    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
111    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
112    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
113    ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1)
114    ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1)
115    ; CHECK: %umax:_(s32) = G_UMAX %load0, %load1
116    ; CHECK: $vgpr0 = COPY %umax(s32)
117    %ptr0:_(p1) = COPY $vgpr0_vgpr1
118    %ptr1:_(p1) = COPY $vgpr2_vgpr3
119    %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1)
120    %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1)
121    %umax:_(s32) = G_UMAX %load0, %load1
122    %mask:_(s32) = G_CONSTANT i32 255
123    %and:_(s32) = G_AND %umax, %mask
124    $vgpr0 = COPY %and
125
126...
127
128# Don't have enough known bits for lhs
129---
130name:  remove_and_255_smin_fail_lhs
131legalized:       true
132tracksRegLiveness: true
133body:             |
134  bb.0:
135    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
136    ; CHECK-LABEL: name: remove_and_255_smin_fail_lhs
137    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
138    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
139    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
140    ; CHECK: %load0:_(s32) = G_LOAD %ptr0(p1) :: (load 4, addrspace 1)
141    ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1)
142    ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1
143    ; CHECK: %mask:_(s32) = G_CONSTANT i32 255
144    ; CHECK: %and:_(s32) = G_AND %smin, %mask
145    ; CHECK: $vgpr0 = COPY %and(s32)
146    %ptr0:_(p1) = COPY $vgpr0_vgpr1
147    %ptr1:_(p1) = COPY $vgpr2_vgpr3
148    %load0:_(s32) = G_LOAD %ptr0 :: (load 4, addrspace 1, align 4)
149    %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1)
150    %smin:_(s32) = G_SMIN %load0, %load1
151    %mask:_(s32) = G_CONSTANT i32 255
152    %and:_(s32) = G_AND %smin, %mask
153    $vgpr0 = COPY %and
154
155...
156
157# Don't have enough known bits for rhs
158---
159name:  remove_and_255_smin_fail_rhs
160legalized:       true
161tracksRegLiveness: true
162body:             |
163  bb.0:
164    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
165    ; CHECK-LABEL: name: remove_and_255_smin_fail_rhs
166    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
167    ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1
168    ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3
169    ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1)
170    ; CHECK: %load1:_(s32) = G_LOAD %ptr1(p1) :: (load 4, addrspace 1)
171    ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1
172    ; CHECK: %mask:_(s32) = G_CONSTANT i32 255
173    ; CHECK: %and:_(s32) = G_AND %smin, %mask
174    ; CHECK: $vgpr0 = COPY %and(s32)
175    %ptr0:_(p1) = COPY $vgpr0_vgpr1
176    %ptr1:_(p1) = COPY $vgpr2_vgpr3
177    %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1)
178    %load1:_(s32) = G_LOAD %ptr1 :: (load 4, addrspace 1, align 4)
179    %smin:_(s32) = G_SMIN %load0, %load1
180    %mask:_(s32) = G_CONSTANT i32 255
181    %and:_(s32) = G_AND %smin, %mask
182    $vgpr0 = COPY %and
183
184...
185
186# Test known bits for groupstaticsize is the maximum LDS size.
187---
188name:  remove_and_65535_groupstaticsize
189legalized:       true
190tracksRegLiveness: true
191body:             |
192  bb.0:
193    liveins: $vgpr0_vgpr1
194    ; CHECK-LABEL: name: remove_and_65535_groupstaticsize
195    ; CHECK: liveins: $vgpr0_vgpr1
196    ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
197    ; CHECK: %mask:_(s32) = G_CONSTANT i32 65535
198    ; CHECK: %and:_(s32) = G_AND %lds_size, %mask
199    ; CHECK: $vgpr0 = COPY %and(s32)
200    %ptr:_(p1) = COPY $vgpr0_vgpr1
201    %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
202    %mask:_(s32) = G_CONSTANT i32 65535
203    %and:_(s32) = G_AND %lds_size, %mask
204    $vgpr0 = COPY %and
205
206...
207
208---
209name:  remove_and_131071_groupstaticsize
210legalized:       true
211tracksRegLiveness: true
212body:             |
213  bb.0:
214    liveins: $vgpr0_vgpr1
215    ; CHECK-LABEL: name: remove_and_131071_groupstaticsize
216    ; CHECK: liveins: $vgpr0_vgpr1
217    ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
218    ; CHECK: $vgpr0 = COPY %lds_size(s32)
219    %ptr:_(p1) = COPY $vgpr0_vgpr1
220    %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
221    %mask:_(s32) = G_CONSTANT i32 131071
222    %and:_(s32) = G_AND %lds_size, %mask
223    $vgpr0 = COPY %and
224
225...
226
227---
228name:  no_remove_and_65536_groupstaticsize
229legalized:       true
230tracksRegLiveness: true
231body:             |
232  bb.0:
233    liveins: $vgpr0_vgpr1
234    ; CHECK-LABEL: name: no_remove_and_65536_groupstaticsize
235    ; CHECK: liveins: $vgpr0_vgpr1
236    ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
237    ; CHECK: %mask:_(s32) = G_CONSTANT i32 65536
238    ; CHECK: %and:_(s32) = G_AND %lds_size, %mask
239    ; CHECK: $vgpr0 = COPY %and(s32)
240    %ptr:_(p1) = COPY $vgpr0_vgpr1
241    %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
242    %mask:_(s32) = G_CONSTANT i32 65536
243    %and:_(s32) = G_AND %lds_size, %mask
244    $vgpr0 = COPY %and
245
246...
247
248---
249name:  no_remove_and_32767_groupstaticsize
250legalized:       true
251tracksRegLiveness: true
252body:             |
253  bb.0:
254    liveins: $vgpr0_vgpr1
255    ; CHECK-LABEL: name: no_remove_and_32767_groupstaticsize
256    ; CHECK: liveins: $vgpr0_vgpr1
257    ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
258    ; CHECK: %mask:_(s32) = G_CONSTANT i32 32767
259    ; CHECK: %and:_(s32) = G_AND %lds_size, %mask
260    ; CHECK: $vgpr0 = COPY %and(s32)
261    %ptr:_(p1) = COPY $vgpr0_vgpr1
262    %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
263    %mask:_(s32) = G_CONSTANT i32 32767
264    %and:_(s32) = G_AND %lds_size, %mask
265    $vgpr0 = COPY %and
266
267...
268
269# We can conclude the number of bits based only on one operand
270---
271name:  remove_and_umin_lhs_only
272legalized:       true
273tracksRegLiveness: true
274body:             |
275  bb.0:
276    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
277
278    ; CHECK-LABEL: name: remove_and_umin_lhs_only
279    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
280    ; CHECK: %val:_(s32) = COPY $vgpr4
281    ; CHECK: %k255:_(s32) = G_CONSTANT i32 255
282    ; CHECK: %umin0:_(s32) = G_UMIN %val, %k255
283    ; CHECK: $vgpr0 = COPY %umin0(s32)
284    %ptr0:_(p1) = COPY $vgpr0_vgpr1
285    %ptr1:_(p1) = COPY $vgpr2_vgpr3
286    %val:_(s32) = COPY $vgpr4
287    %k255:_(s32) = G_CONSTANT i32 255
288    %umin0:_(s32) = G_UMIN %val, %k255
289    %and:_(s32) = G_AND %umin0, %k255
290    $vgpr0 = COPY %and
291
292...
293
294---
295name:  remove_and_umin_rhs_only
296legalized:       true
297tracksRegLiveness: true
298body:             |
299  bb.0:
300    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
301
302    ; CHECK-LABEL: name: remove_and_umin_rhs_only
303    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
304    ; CHECK: %val:_(s32) = COPY $vgpr4
305    ; CHECK: %k255:_(s32) = G_CONSTANT i32 255
306    ; CHECK: %umin0:_(s32) = G_UMIN %k255, %val
307    ; CHECK: $vgpr0 = COPY %umin0(s32)
308    %ptr0:_(p1) = COPY $vgpr0_vgpr1
309    %ptr1:_(p1) = COPY $vgpr2_vgpr3
310    %val:_(s32) = COPY $vgpr4
311    %k255:_(s32) = G_CONSTANT i32 255
312    %umin0:_(s32) = G_UMIN %k255, %val
313    %and:_(s32) = G_AND %umin0, %k255
314    $vgpr0 = COPY %and
315
316...
317