1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=gfx900 -o - -verify-coalescing -run-pass=simple-register-coalescing %s | FileCheck -check-prefix=GCN %s
3
4---
5# Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed.
6
7name:            no_remat_killed_src_in_inst
8tracksRegLiveness: true
9body:             |
10  bb.0:
11    liveins: $vgpr0
12
13    ; GCN-LABEL: name: no_remat_killed_src_in_inst
14    ; GCN: liveins: $vgpr0
15    ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
16    ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec
17    ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec
18    ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]]
19    ; GCN: SI_RETURN_TO_EPILOG $vgpr0
20    %0:vgpr_32 = COPY $vgpr0
21    %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec
22    %2:vgpr_32 = V_MOV_B32_e32 killed %1, implicit $exec
23    $vgpr0 = COPY killed %2
24    SI_RETURN_TO_EPILOG killed $vgpr0
25...
26---
27# Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed
28# after the MOV but before the COPY.
29
30name:            no_remat_killed_src_after_inst
31tracksRegLiveness: true
32body:             |
33  bb.0:
34    liveins: $vgpr0
35
36    ; GCN-LABEL: name: no_remat_killed_src_after_inst
37    ; GCN: liveins: $vgpr0
38    ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
39    ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec
40    ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec
41    ; GCN: KILL [[V_ADD_U32_e32_]]
42    ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]]
43    ; GCN: SI_RETURN_TO_EPILOG $vgpr0
44    %0:vgpr_32 = COPY $vgpr0
45    %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec
46    %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec
47    KILL %1
48    $vgpr0 = COPY killed %2
49    SI_RETURN_TO_EPILOG killed $vgpr0
50...
51---
52# Even if %1 is not killed do not rematerialize V_MOV_B32 so that we do not
53# extend %1 liverange.
54
55name:            no_remat_alive_src_in_inst_unused
56tracksRegLiveness: true
57body:             |
58  bb.0:
59    liveins: $vgpr0
60
61    ; GCN-LABEL: name: no_remat_alive_src_in_inst_unused
62    ; GCN: liveins: $vgpr0
63    ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
64    ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec
65    ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec
66    ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]]
67    ; GCN: SI_RETURN_TO_EPILOG $vgpr0
68    %0:vgpr_32 = COPY $vgpr0
69    %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec
70    %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec
71    $vgpr0 = COPY killed %2
72    SI_RETURN_TO_EPILOG killed $vgpr0
73...
74---
75# Rematerialize V_MOV_B32 since %1 is available at COPY and still alive.
76
77name:            remat_alive_src_in_inst_used_and_available
78tracksRegLiveness: true
79body:             |
80  bb.0:
81    liveins: $vgpr0
82
83    ; GCN-LABEL: name: remat_alive_src_in_inst_used_and_available
84    ; GCN: liveins: $vgpr0
85    ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
86    ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec
87    ; GCN: $vgpr0 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec
88    ; GCN: SI_RETURN_TO_EPILOG $vgpr0
89    %0:vgpr_32 = COPY $vgpr0
90    %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec
91    %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec
92    $vgpr0 = COPY killed %2, implicit %1
93    SI_RETURN_TO_EPILOG killed $vgpr0
94...
95