# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -march=amdgcn -mcpu=gfx900 -o - -verify-coalescing -run-pass=simple-register-coalescing %s | FileCheck -check-prefix=GCN %s --- # Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed. name: no_remat_killed_src_in_inst tracksRegLiveness: true body: | bb.0: liveins: $vgpr0 ; GCN-LABEL: name: no_remat_killed_src_in_inst ; GCN: liveins: $vgpr0 ; GCN-NEXT: {{ $}} ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 ; GCN-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec ; GCN-NEXT: $vgpr0 = COPY [[V_MOV_B32_e32_]] ; GCN-NEXT: SI_RETURN_TO_EPILOG $vgpr0 %0:vgpr_32 = COPY $vgpr0 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec %2:vgpr_32 = V_MOV_B32_e32 killed %1, implicit $exec $vgpr0 = COPY killed %2 SI_RETURN_TO_EPILOG killed $vgpr0 ... --- # Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed # after the MOV but before the COPY. name: no_remat_killed_src_after_inst tracksRegLiveness: true body: | bb.0: liveins: $vgpr0 ; GCN-LABEL: name: no_remat_killed_src_after_inst ; GCN: liveins: $vgpr0 ; GCN-NEXT: {{ $}} ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 ; GCN-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec ; GCN-NEXT: KILL [[V_ADD_U32_e32_]] ; GCN-NEXT: $vgpr0 = COPY [[V_MOV_B32_e32_]] ; GCN-NEXT: SI_RETURN_TO_EPILOG $vgpr0 %0:vgpr_32 = COPY $vgpr0 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec KILL %1 $vgpr0 = COPY killed %2 SI_RETURN_TO_EPILOG killed $vgpr0 ... --- # Even if %1 is not killed do not rematerialize V_MOV_B32 so that we do not # extend %1 liverange. name: no_remat_alive_src_in_inst_unused tracksRegLiveness: true body: | bb.0: liveins: $vgpr0 ; GCN-LABEL: name: no_remat_alive_src_in_inst_unused ; GCN: liveins: $vgpr0 ; GCN-NEXT: {{ $}} ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 ; GCN-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec ; GCN-NEXT: $vgpr0 = COPY [[V_MOV_B32_e32_]] ; GCN-NEXT: SI_RETURN_TO_EPILOG $vgpr0 %0:vgpr_32 = COPY $vgpr0 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec $vgpr0 = COPY killed %2 SI_RETURN_TO_EPILOG killed $vgpr0 ... --- # Rematerialize V_MOV_B32 since %1 is available at COPY and still alive. name: remat_alive_src_in_inst_used_and_available tracksRegLiveness: true body: | bb.0: liveins: $vgpr0 ; GCN-LABEL: name: remat_alive_src_in_inst_used_and_available ; GCN: liveins: $vgpr0 ; GCN-NEXT: {{ $}} ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 ; GCN-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec ; GCN-NEXT: $vgpr0 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec ; GCN-NEXT: SI_RETURN_TO_EPILOG $vgpr0 %0:vgpr_32 = COPY $vgpr0 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec $vgpr0 = COPY killed %2, implicit %1 SI_RETURN_TO_EPILOG killed $vgpr0 ...