[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / coalesce-identity-copies-undef-subregs.mir
blob350d561f659d462ad6e3147b3a39ba5ca835217a
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -verify-coalescing -verify-machineinstrs -start-before=simple-register-coalescing -stop-after=machine-scheduler -o - %s | FileCheck %s
4 # Tests that break due to the handling of partially undef registers
5 # when whole register identity copies are erased.
7 # Make sure there is no verifier error after
8 # RenameIndepependentSubregs processes this. The coalescer would
9 # remove the identity copy in %bb.1, and leave behind a dummy interval
10 # across bb.1 with no corresponding value anywhere in the function.
12 ---
13 name:            identity_copy_undef_subrange
14 tracksRegLiveness: true
15 body:             |
16   ; CHECK-LABEL: name: identity_copy_undef_subrange
17   ; CHECK: bb.0:
18   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
19   ; CHECK-NEXT:   liveins: $vgpr0
20   ; CHECK-NEXT: {{  $}}
21   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
22   ; CHECK-NEXT: {{  $}}
23   ; CHECK-NEXT: bb.1:
24   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
25   ; CHECK-NEXT: {{  $}}
26   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
27   ; CHECK-NEXT:   S_BRANCH %bb.2
28   ; CHECK-NEXT: {{  $}}
29   ; CHECK-NEXT: bb.2:
30   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
31   ; CHECK-NEXT: {{  $}}
32   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
33   ; CHECK-NEXT:   S_BRANCH %bb.1
34   bb.0:
35     liveins: $vgpr0
37     undef %0.sub1:vreg_64 = COPY killed $vgpr0
39   bb.1:
40     successors: %bb.2, %bb.1
42     %0:vreg_64 = COPY %0
43     S_CBRANCH_EXECNZ %bb.1, implicit $exec
44     S_BRANCH %bb.2
46   bb.2:
47     undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec
48     S_BRANCH %bb.1
50 ...
52 # Test another use of the register inside the block.
53 ---
54 name:            identity_copy_undef_subrange_other_uses0
55 tracksRegLiveness: true
56 body:             |
57   ; CHECK-LABEL: name: identity_copy_undef_subrange_other_uses0
58   ; CHECK: bb.0:
59   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
60   ; CHECK-NEXT:   liveins: $vgpr0
61   ; CHECK-NEXT: {{  $}}
62   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
63   ; CHECK-NEXT: {{  $}}
64   ; CHECK-NEXT: bb.1:
65   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
66   ; CHECK-NEXT: {{  $}}
67   ; CHECK-NEXT:   S_NOP 0, implicit undef %0.sub0
68   ; CHECK-NEXT:   S_NOP 0, implicit undef %0.sub0
69   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
70   ; CHECK-NEXT:   S_BRANCH %bb.2
71   ; CHECK-NEXT: {{  $}}
72   ; CHECK-NEXT: bb.2:
73   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
74   ; CHECK-NEXT: {{  $}}
75   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
76   ; CHECK-NEXT:   S_BRANCH %bb.1
77   bb.0:
78     liveins: $vgpr0
79     undef %0.sub1:vreg_64 = COPY killed $vgpr0
81   bb.1:
82     successors: %bb.2, %bb.1
84     %0:vreg_64 = COPY %0
85     S_NOP 0, implicit %0.sub0
86     S_NOP 0, implicit %0.sub0
87     S_CBRANCH_EXECNZ %bb.1, implicit $exec
88     S_BRANCH %bb.2
90   bb.2:
91     undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec
92     S_BRANCH %bb.1
94 ...
96 ---
97 name: second_identity_copy
98 tracksRegLiveness: true
99 body:             |
100   ; CHECK-LABEL: name: second_identity_copy
101   ; CHECK: bb.0:
102   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
103   ; CHECK-NEXT:   liveins: $vgpr0
104   ; CHECK-NEXT: {{  $}}
105   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
106   ; CHECK-NEXT: {{  $}}
107   ; CHECK-NEXT: bb.1:
108   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
109   ; CHECK-NEXT: {{  $}}
110   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
111   ; CHECK-NEXT:   S_BRANCH %bb.2
112   ; CHECK-NEXT: {{  $}}
113   ; CHECK-NEXT: bb.2:
114   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
115   ; CHECK-NEXT: {{  $}}
116   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, %0.sub1, implicit $mode, implicit $exec
117   ; CHECK-NEXT:   S_BRANCH %bb.1
118   bb.0:
119     liveins: $vgpr0
121     undef %0.sub1:vreg_64 = COPY killed $vgpr0
123   bb.1:
124     successors: %bb.2, %bb.1
126     %0:vreg_64 = COPY killed %0
127     %0:vreg_64 = COPY %0
128     S_CBRANCH_EXECNZ %bb.1, implicit $exec
129     S_BRANCH %bb.2
131   bb.2:
132     undef %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, killed %0.sub1, implicit $mode, implicit $exec
133     S_BRANCH %bb.1
138 name: second_identity_copy_undef_lane_outblock
139 tracksRegLiveness: true
140 body:             |
141   ; CHECK-LABEL: name: second_identity_copy_undef_lane_outblock
142   ; CHECK: bb.0:
143   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
144   ; CHECK-NEXT:   liveins: $vgpr0
145   ; CHECK-NEXT: {{  $}}
146   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
147   ; CHECK-NEXT: {{  $}}
148   ; CHECK-NEXT: bb.1:
149   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
150   ; CHECK-NEXT: {{  $}}
151   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
152   ; CHECK-NEXT:   S_BRANCH %bb.2
153   ; CHECK-NEXT: {{  $}}
154   ; CHECK-NEXT: bb.2:
155   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
156   ; CHECK-NEXT: {{  $}}
157   ; CHECK-NEXT:   %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, %0.sub1, implicit $mode, implicit $exec
158   ; CHECK-NEXT:   S_BRANCH %bb.1
159   bb.0:
160     liveins: $vgpr0
162     undef %0.sub1:vreg_64 = COPY killed $vgpr0
164   bb.1:
165     successors: %bb.2, %bb.1
167     %0:vreg_64 = COPY killed %0
168     %0:vreg_64 = COPY %0
169     S_CBRANCH_EXECNZ %bb.1, implicit $exec
170     S_BRANCH %bb.2
172   bb.2:
173     %0.sub1:vreg_64 = nofpexcept V_MUL_F32_e32 0, killed %0.sub1, implicit $mode, implicit $exec
174     S_BRANCH %bb.1
178 # The same value number appears in multiple blocks
180 name: identity_copy_undef_subrange_null_vninfo_to_remove
181 tracksRegLiveness: true
182 body:             |
183   ; CHECK-LABEL: name: identity_copy_undef_subrange_null_vninfo_to_remove
184   ; CHECK: bb.0:
185   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
186   ; CHECK-NEXT:   liveins: $vgpr0
187   ; CHECK-NEXT: {{  $}}
188   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
189   ; CHECK-NEXT: {{  $}}
190   ; CHECK-NEXT: bb.1:
191   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
192   ; CHECK-NEXT: {{  $}}
193   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.3, implicit $exec
194   ; CHECK-NEXT: {{  $}}
195   ; CHECK-NEXT: bb.2:
196   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
197   ; CHECK-NEXT: {{  $}}
198   ; CHECK-NEXT:   S_NOP 0, implicit undef %0.sub0
199   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
200   ; CHECK-NEXT:   S_BRANCH %bb.1
201   ; CHECK-NEXT: {{  $}}
202   ; CHECK-NEXT: bb.3:
203   ; CHECK-NEXT:   S_NOP 0, implicit undef %0.sub0
204   bb.0:
205     liveins: $vgpr0
207     undef %0.sub1:vreg_64 = COPY killed $vgpr0
209   bb.1:
210     %0:vreg_64 = COPY %0
211     S_CBRANCH_EXECNZ %bb.3, implicit $exec
213   bb.2:
214     S_NOP 0, implicit %0.sub0
215     undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec
216     S_BRANCH %bb.1
218   bb.3:
219     S_NOP 0, implicit %0.sub0
224 name: undef_copy_self_loop0
225 tracksRegLiveness: true
226 body:             |
227   ; CHECK-LABEL: name: undef_copy_self_loop0
228   ; CHECK: bb.0:
229   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
230   ; CHECK-NEXT:   liveins: $vgpr0
231   ; CHECK-NEXT: {{  $}}
232   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
233   ; CHECK-NEXT: {{  $}}
234   ; CHECK-NEXT: bb.1:
235   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
236   ; CHECK-NEXT: {{  $}}
237   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
238   ; CHECK-NEXT: {{  $}}
239   ; CHECK-NEXT: bb.2:
240   ; CHECK-NEXT:   S_NOP 0, implicit undef %0.sub0
241   bb.0:
242     liveins: $vgpr0
244     undef %0.sub1:vreg_64 = COPY killed $vgpr0
246   bb.1:
247     %0:vreg_64 = COPY %0
248     S_CBRANCH_EXECNZ %bb.1, implicit $exec
250   bb.2:
251     S_NOP 0, implicit %0.sub0
256 name: undef_copy_self_loop1
257 tracksRegLiveness: true
258 body:             |
259   ; CHECK-LABEL: name: undef_copy_self_loop1
260   ; CHECK: bb.0:
261   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
262   ; CHECK-NEXT:   liveins: $vgpr0
263   ; CHECK-NEXT: {{  $}}
264   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
265   ; CHECK-NEXT: {{  $}}
266   ; CHECK-NEXT: bb.1:
267   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
268   ; CHECK-NEXT: {{  $}}
269   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
270   ; CHECK-NEXT: {{  $}}
271   ; CHECK-NEXT: bb.2:
272   ; CHECK-NEXT:   S_NOP 0, implicit %0.sub1
273   bb.0:
274     liveins: $vgpr0
276     undef %0.sub1:vreg_64 = COPY killed $vgpr0
278   bb.1:
279     %0:vreg_64 = COPY %0
280     S_CBRANCH_EXECNZ %bb.1, implicit $exec
282   bb.2:
283     S_NOP 0, implicit %0.sub1
287 # The coalescing of the %0 = %2 COPY in %bb.2 needs to prune the dead
288 # phi range across %bb.1 after it is erased.
290 name: prune_subrange_phi_value_0
291 tracksRegLiveness: true
292 body:             |
293   ; CHECK-LABEL: name: prune_subrange_phi_value_0
294   ; CHECK: bb.0:
295   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
296   ; CHECK-NEXT:   liveins: $vgpr0
297   ; CHECK-NEXT: {{  $}}
298   ; CHECK-NEXT:   undef %2.sub1:vreg_64 = COPY $vgpr0
299   ; CHECK-NEXT: {{  $}}
300   ; CHECK-NEXT: bb.1:
301   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
302   ; CHECK-NEXT: {{  $}}
303   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
304   ; CHECK-NEXT:   S_BRANCH %bb.2
305   ; CHECK-NEXT: {{  $}}
306   ; CHECK-NEXT: bb.2:
307   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
308   ; CHECK-NEXT: {{  $}}
309   ; CHECK-NEXT:   S_BRANCH %bb.1
310   bb.0:
311     liveins: $vgpr0
313     undef %0.sub1:vreg_64 = COPY killed $vgpr0
315   bb.1:
316     successors: %bb.2, %bb.1
318     %1:vreg_64 = COPY killed %0
319     %0:vreg_64 = COPY %1
320     S_CBRANCH_EXECNZ %bb.1, implicit $exec
321     S_BRANCH %bb.2
323   bb.2:
324     undef %2.sub1:vreg_64 = COPY %0.sub1
325     %0:vreg_64 = COPY killed %2
326     S_BRANCH %bb.1
331 name: prune_subrange_phi_value_0_0
332 tracksRegLiveness: true
333 body:             |
334   ; CHECK-LABEL: name: prune_subrange_phi_value_0_0
335   ; CHECK: bb.0:
336   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
337   ; CHECK-NEXT:   liveins: $vgpr0
338   ; CHECK-NEXT: {{  $}}
339   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
340   ; CHECK-NEXT: {{  $}}
341   ; CHECK-NEXT: bb.1:
342   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
343   ; CHECK-NEXT: {{  $}}
344   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
345   ; CHECK-NEXT:   S_BRANCH %bb.2
346   ; CHECK-NEXT: {{  $}}
347   ; CHECK-NEXT: bb.2:
348   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
349   ; CHECK-NEXT: {{  $}}
350   ; CHECK-NEXT:   S_BRANCH %bb.1
351   bb.0:
352     liveins: $vgpr0
354     undef %0.sub1:vreg_64 = COPY killed $vgpr0
356   bb.1:
357     successors: %bb.2, %bb.1
359     %1:vreg_64 = COPY killed %0
360     %0:vreg_64 = COPY %1
361     S_CBRANCH_EXECNZ %bb.1, implicit $exec
362     S_BRANCH %bb.2
364   bb.2:
365     undef %0.sub1:vreg_64 = COPY %0.sub1
366     S_BRANCH %bb.1
371 name: prune_subrange_phi_value_0_1
372 tracksRegLiveness: true
373 body:             |
374   ; CHECK-LABEL: name: prune_subrange_phi_value_0_1
375   ; CHECK: bb.0:
376   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
377   ; CHECK-NEXT:   liveins: $vgpr0
378   ; CHECK-NEXT: {{  $}}
379   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
380   ; CHECK-NEXT: {{  $}}
381   ; CHECK-NEXT: bb.1:
382   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
383   ; CHECK-NEXT: {{  $}}
384   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
385   ; CHECK-NEXT:   S_BRANCH %bb.2
386   ; CHECK-NEXT: {{  $}}
387   ; CHECK-NEXT: bb.2:
388   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
389   ; CHECK-NEXT: {{  $}}
390   ; CHECK-NEXT:   S_BRANCH %bb.1
391   bb.0:
392     liveins: $vgpr0
394     undef %0.sub1:vreg_64 = COPY killed $vgpr0
396   bb.1:
397     successors: %bb.2, %bb.1
399     %1:vreg_64 = COPY killed %0
400     %0:vreg_64 = COPY %1
401     S_CBRANCH_EXECNZ %bb.1, implicit $exec
402     S_BRANCH %bb.2
404   bb.2:
405     S_BRANCH %bb.1
409 # Variant of testcase that asserts since there wasn't already an
410 # incoming segment at the erased copy, and no valid end point.
412 name:            prune_subrange_phi_value_1
413 tracksRegLiveness: true
414 body:             |
415   ; CHECK-LABEL: name: prune_subrange_phi_value_1
416   ; CHECK: bb.0:
417   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
418   ; CHECK-NEXT:   liveins: $vgpr0
419   ; CHECK-NEXT: {{  $}}
420   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
421   ; CHECK-NEXT: {{  $}}
422   ; CHECK-NEXT: bb.1:
423   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
424   ; CHECK-NEXT: {{  $}}
425   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
426   ; CHECK-NEXT:   S_BRANCH %bb.2
427   ; CHECK-NEXT: {{  $}}
428   ; CHECK-NEXT: bb.2:
429   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
430   ; CHECK-NEXT: {{  $}}
431   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
432   ; CHECK-NEXT:   S_BRANCH %bb.1
433   bb.0:
434     liveins: $vgpr0
436     undef %0.sub1:vreg_64 = COPY killed $vgpr0
438   bb.1:
439     successors: %bb.2, %bb.1
441     %0:vreg_64 = COPY killed %0
442     S_CBRANCH_EXECNZ %bb.1, implicit $exec
443     S_BRANCH %bb.2
445   bb.2:
446     undef %1.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 killed %0.sub1, implicit $mode, implicit $exec
447     %0:vreg_64 = COPY killed %1
448     S_BRANCH %bb.1
453 name:            prune_subrange_phi_value_2
454 tracksRegLiveness: true
455 body:             |
456   ; CHECK-LABEL: name: prune_subrange_phi_value_2
457   ; CHECK: bb.0:
458   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
459   ; CHECK-NEXT:   liveins: $vgpr0
460   ; CHECK-NEXT: {{  $}}
461   ; CHECK-NEXT:   undef %0.sub1:vreg_64 = COPY $vgpr0
462   ; CHECK-NEXT: {{  $}}
463   ; CHECK-NEXT: bb.1:
464   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
465   ; CHECK-NEXT: {{  $}}
466   ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec
467   ; CHECK-NEXT:   S_BRANCH %bb.2
468   ; CHECK-NEXT: {{  $}}
469   ; CHECK-NEXT: bb.2:
470   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
471   ; CHECK-NEXT: {{  $}}
472   ; CHECK-NEXT:   %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
473   ; CHECK-NEXT:   S_BRANCH %bb.1
474   bb.0:
475     liveins: $vgpr0
477     undef %0.sub1:vreg_64 = COPY killed $vgpr0
479   bb.1:
480     successors: %bb.2, %bb.1
482     %0:vreg_64 = COPY killed %0
483     S_CBRANCH_EXECNZ %bb.1, implicit $exec
484     S_BRANCH %bb.2
486   bb.2:
487     %0.sub1:vreg_64 = nofpexcept V_CEIL_F32_e32 %0.sub1, implicit $mode, implicit $exec
488     S_BRANCH %bb.1