[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / postlegalizercombiner-and.mir
blobfdc22a23f74163bfc2698fc46654e55bd3e08470
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 # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
4 # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
6 ---
7 name:  remove_and_255_zextload
8 legalized:       true
9 tracksRegLiveness: true
10 body:             |
11   bb.0:
12     liveins: $vgpr0_vgpr1
13     ; CHECK-LABEL: name: remove_and_255_zextload
14     ; CHECK: liveins: $vgpr0_vgpr1
15     ; CHECK-NEXT: {{  $}}
16     ; CHECK-NEXT: %ptr:_(p1) = COPY $vgpr0_vgpr1
17     ; CHECK-NEXT: %and:_(s32) = G_ZEXTLOAD %ptr(p1) :: (load (s8), addrspace 1)
18     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
19     %ptr:_(p1) = COPY $vgpr0_vgpr1
20     %load:_(s32) = G_ZEXTLOAD %ptr :: (load (s8), addrspace 1, align 1)
21     %mask:_(s32) = G_CONSTANT i32 255
22     %and:_(s32) = G_AND %load, %mask
23     $vgpr0 = COPY %and
25 ...
27 ---
28 name:  remove_and_255_smin_zextload
29 legalized:       true
30 tracksRegLiveness: true
31 body:             |
32   bb.0:
33     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
34     ; CHECK-LABEL: name: remove_and_255_smin_zextload
35     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
36     ; CHECK-NEXT: {{  $}}
37     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
38     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
39     ; CHECK-NEXT: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load (s8), addrspace 1)
40     ; CHECK-NEXT: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load (s8), addrspace 1)
41     ; CHECK-NEXT: %smin:_(s32) = G_SMIN %load0, %load1
42     ; CHECK-NEXT: $vgpr0 = COPY %smin(s32)
43     %ptr0:_(p1) = COPY $vgpr0_vgpr1
44     %ptr1:_(p1) = COPY $vgpr2_vgpr3
45     %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load (s8), addrspace 1, align 1)
46     %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load (s8), addrspace 1, align 1)
47     %smin:_(s32) = G_SMIN %load0, %load1
48     %mask:_(s32) = G_CONSTANT i32 255
49     %and:_(s32) = G_AND %smin, %mask
50     $vgpr0 = COPY %and
52 ...
54 ---
55 name:  remove_and_255_smax_zextload
56 legalized:       true
57 tracksRegLiveness: true
58 body:             |
59   bb.0:
60     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
61     ; CHECK-LABEL: name: remove_and_255_smax_zextload
62     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
63     ; CHECK-NEXT: {{  $}}
64     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
65     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
66     ; CHECK-NEXT: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load (s8), addrspace 1)
67     ; CHECK-NEXT: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load (s8), addrspace 1)
68     ; CHECK-NEXT: %smax:_(s32) = G_SMAX %load0, %load1
69     ; CHECK-NEXT: $vgpr0 = COPY %smax(s32)
70     %ptr0:_(p1) = COPY $vgpr0_vgpr1
71     %ptr1:_(p1) = COPY $vgpr2_vgpr3
72     %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load (s8), addrspace 1, align 1)
73     %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load (s8), addrspace 1, align 1)
74     %smax:_(s32) = G_SMAX %load0, %load1
75     %mask:_(s32) = G_CONSTANT i32 255
76     %and:_(s32) = G_AND %smax, %mask
77     $vgpr0 = COPY %and
79 ...
81 ---
82 name:  remove_and_255_umin_zextload
83 legalized:       true
84 tracksRegLiveness: true
85 body:             |
86   bb.0:
87     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
88     ; CHECK-LABEL: name: remove_and_255_umin_zextload
89     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
90     ; CHECK-NEXT: {{  $}}
91     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
92     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
93     ; CHECK-NEXT: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load (s8), addrspace 1)
94     ; CHECK-NEXT: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load (s8), addrspace 1)
95     ; CHECK-NEXT: %umin:_(s32) = G_UMIN %load0, %load1
96     ; CHECK-NEXT: $vgpr0 = COPY %umin(s32)
97     %ptr0:_(p1) = COPY $vgpr0_vgpr1
98     %ptr1:_(p1) = COPY $vgpr2_vgpr3
99     %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load (s8), addrspace 1, align 1)
100     %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load (s8), addrspace 1, align 1)
101     %umin:_(s32) = G_UMIN %load0, %load1
102     %mask:_(s32) = G_CONSTANT i32 255
103     %and:_(s32) = G_AND %umin, %mask
104     $vgpr0 = COPY %and
109 name:  remove_and_255_umax_zextload
110 legalized:       true
111 tracksRegLiveness: true
112 body:             |
113   bb.0:
114     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
115     ; CHECK-LABEL: name: remove_and_255_umax_zextload
116     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
117     ; CHECK-NEXT: {{  $}}
118     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
119     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
120     ; CHECK-NEXT: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load (s8), addrspace 1)
121     ; CHECK-NEXT: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load (s8), addrspace 1)
122     ; CHECK-NEXT: %umax:_(s32) = G_UMAX %load0, %load1
123     ; CHECK-NEXT: $vgpr0 = COPY %umax(s32)
124     %ptr0:_(p1) = COPY $vgpr0_vgpr1
125     %ptr1:_(p1) = COPY $vgpr2_vgpr3
126     %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load (s8), addrspace 1, align 1)
127     %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load (s8), addrspace 1, align 1)
128     %umax:_(s32) = G_UMAX %load0, %load1
129     %mask:_(s32) = G_CONSTANT i32 255
130     %and:_(s32) = G_AND %umax, %mask
131     $vgpr0 = COPY %and
135 # Don't have enough known bits for lhs
137 name:  remove_and_255_smin_fail_lhs
138 legalized:       true
139 tracksRegLiveness: true
140 body:             |
141   bb.0:
142     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
143     ; CHECK-LABEL: name: remove_and_255_smin_fail_lhs
144     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
145     ; CHECK-NEXT: {{  $}}
146     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
147     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
148     ; CHECK-NEXT: %load0:_(s32) = G_LOAD %ptr0(p1) :: (load (s32), addrspace 1)
149     ; CHECK-NEXT: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load (s8), addrspace 1)
150     ; CHECK-NEXT: %smin:_(s32) = G_SMIN %load0, %load1
151     ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 255
152     ; CHECK-NEXT: %and:_(s32) = G_AND %smin, %mask
153     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
154     %ptr0:_(p1) = COPY $vgpr0_vgpr1
155     %ptr1:_(p1) = COPY $vgpr2_vgpr3
156     %load0:_(s32) = G_LOAD %ptr0 :: (load (s32), addrspace 1, align 4)
157     %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load (s8), addrspace 1, align 1)
158     %smin:_(s32) = G_SMIN %load0, %load1
159     %mask:_(s32) = G_CONSTANT i32 255
160     %and:_(s32) = G_AND %smin, %mask
161     $vgpr0 = COPY %and
165 # Don't have enough known bits for rhs
167 name:  remove_and_255_smin_fail_rhs
168 legalized:       true
169 tracksRegLiveness: true
170 body:             |
171   bb.0:
172     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
173     ; CHECK-LABEL: name: remove_and_255_smin_fail_rhs
174     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
175     ; CHECK-NEXT: {{  $}}
176     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
177     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
178     ; CHECK-NEXT: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load (s8), addrspace 1)
179     ; CHECK-NEXT: %load1:_(s32) = G_LOAD %ptr1(p1) :: (load (s32), addrspace 1)
180     ; CHECK-NEXT: %smin:_(s32) = G_SMIN %load0, %load1
181     ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 255
182     ; CHECK-NEXT: %and:_(s32) = G_AND %smin, %mask
183     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
184     %ptr0:_(p1) = COPY $vgpr0_vgpr1
185     %ptr1:_(p1) = COPY $vgpr2_vgpr3
186     %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load (s8), addrspace 1, align 1)
187     %load1:_(s32) = G_LOAD %ptr1 :: (load (s32), addrspace 1, align 4)
188     %smin:_(s32) = G_SMIN %load0, %load1
189     %mask:_(s32) = G_CONSTANT i32 255
190     %and:_(s32) = G_AND %smin, %mask
191     $vgpr0 = COPY %and
195 # Test known bits for groupstaticsize is the maximum LDS size.
197 name:  remove_and_65535_groupstaticsize
198 legalized:       true
199 tracksRegLiveness: true
200 body:             |
201   bb.0:
202     liveins: $vgpr0_vgpr1
203     ; CHECK-LABEL: name: remove_and_65535_groupstaticsize
204     ; CHECK: liveins: $vgpr0_vgpr1
205     ; CHECK-NEXT: {{  $}}
206     ; CHECK-NEXT: %ptr:_(p1) = COPY $vgpr0_vgpr1
207     ; CHECK-NEXT: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
208     ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 65535
209     ; CHECK-NEXT: %and:_(s32) = G_AND %lds_size, %mask
210     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
211     %ptr:_(p1) = COPY $vgpr0_vgpr1
212     %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
213     %mask:_(s32) = G_CONSTANT i32 65535
214     %and:_(s32) = G_AND %lds_size, %mask
215     $vgpr0 = COPY %and
220 name:  remove_and_131071_groupstaticsize
221 legalized:       true
222 tracksRegLiveness: true
223 body:             |
224   bb.0:
225     liveins: $vgpr0_vgpr1
226     ; CHECK-LABEL: name: remove_and_131071_groupstaticsize
227     ; CHECK: liveins: $vgpr0_vgpr1
228     ; CHECK-NEXT: {{  $}}
229     ; CHECK-NEXT: %ptr:_(p1) = COPY $vgpr0_vgpr1
230     ; CHECK-NEXT: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
231     ; CHECK-NEXT: $vgpr0 = COPY %lds_size(s32)
232     %ptr:_(p1) = COPY $vgpr0_vgpr1
233     %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
234     %mask:_(s32) = G_CONSTANT i32 131071
235     %and:_(s32) = G_AND %lds_size, %mask
236     $vgpr0 = COPY %and
241 name:  no_remove_and_65536_groupstaticsize
242 legalized:       true
243 tracksRegLiveness: true
244 body:             |
245   bb.0:
246     liveins: $vgpr0_vgpr1
247     ; CHECK-LABEL: name: no_remove_and_65536_groupstaticsize
248     ; CHECK: liveins: $vgpr0_vgpr1
249     ; CHECK-NEXT: {{  $}}
250     ; CHECK-NEXT: %ptr:_(p1) = COPY $vgpr0_vgpr1
251     ; CHECK-NEXT: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
252     ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 65536
253     ; CHECK-NEXT: %and:_(s32) = G_AND %lds_size, %mask
254     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
255     %ptr:_(p1) = COPY $vgpr0_vgpr1
256     %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
257     %mask:_(s32) = G_CONSTANT i32 65536
258     %and:_(s32) = G_AND %lds_size, %mask
259     $vgpr0 = COPY %and
264 name:  no_remove_and_32767_groupstaticsize
265 legalized:       true
266 tracksRegLiveness: true
267 body:             |
268   bb.0:
269     liveins: $vgpr0_vgpr1
270     ; CHECK-LABEL: name: no_remove_and_32767_groupstaticsize
271     ; CHECK: liveins: $vgpr0_vgpr1
272     ; CHECK-NEXT: {{  $}}
273     ; CHECK-NEXT: %ptr:_(p1) = COPY $vgpr0_vgpr1
274     ; CHECK-NEXT: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
275     ; CHECK-NEXT: %mask:_(s32) = G_CONSTANT i32 32767
276     ; CHECK-NEXT: %and:_(s32) = G_AND %lds_size, %mask
277     ; CHECK-NEXT: $vgpr0 = COPY %and(s32)
278     %ptr:_(p1) = COPY $vgpr0_vgpr1
279     %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize)
280     %mask:_(s32) = G_CONSTANT i32 32767
281     %and:_(s32) = G_AND %lds_size, %mask
282     $vgpr0 = COPY %and
286 # We can conclude the number of bits based only on one operand
288 name:  remove_and_umin_lhs_only
289 legalized:       true
290 tracksRegLiveness: true
291 body:             |
292   bb.0:
293     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
295     ; CHECK-LABEL: name: remove_and_umin_lhs_only
296     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
297     ; CHECK-NEXT: {{  $}}
298     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
299     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
300     ; CHECK-NEXT: %val:_(s32) = COPY $vgpr4
301     ; CHECK-NEXT: %k255:_(s32) = G_CONSTANT i32 255
302     ; CHECK-NEXT: %umin0:_(s32) = G_UMIN %val, %k255
303     ; CHECK-NEXT: $vgpr0 = COPY %umin0(s32)
304     %ptr0:_(p1) = COPY $vgpr0_vgpr1
305     %ptr1:_(p1) = COPY $vgpr2_vgpr3
306     %val:_(s32) = COPY $vgpr4
307     %k255:_(s32) = G_CONSTANT i32 255
308     %umin0:_(s32) = G_UMIN %val, %k255
309     %and:_(s32) = G_AND %umin0, %k255
310     $vgpr0 = COPY %and
315 name:  remove_and_umin_rhs_only
316 legalized:       true
317 tracksRegLiveness: true
318 body:             |
319   bb.0:
320     liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
322     ; CHECK-LABEL: name: remove_and_umin_rhs_only
323     ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4
324     ; CHECK-NEXT: {{  $}}
325     ; CHECK-NEXT: %ptr0:_(p1) = COPY $vgpr0_vgpr1
326     ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3
327     ; CHECK-NEXT: %val:_(s32) = COPY $vgpr4
328     ; CHECK-NEXT: %k255:_(s32) = G_CONSTANT i32 255
329     ; CHECK-NEXT: %umin0:_(s32) = G_UMIN %val, %k255
330     ; CHECK-NEXT: $vgpr0 = COPY %umin0(s32)
331     %ptr0:_(p1) = COPY $vgpr0_vgpr1
332     %ptr1:_(p1) = COPY $vgpr2_vgpr3
333     %val:_(s32) = COPY $vgpr4
334     %k255:_(s32) = G_CONSTANT i32 255
335     %umin0:_(s32) = G_UMIN %k255, %val
336     %and:_(s32) = G_AND %umin0, %k255
337     $vgpr0 = COPY %and