The FixSGPRCopies pass converts instructions to VALU when removing illegal VGPR to SGPR copies. Instructions that use SCC are changed to use VCC instead. When that happens, the pass must also change instructions that define SCC to define VCC. The pass was not changing the SCC definition when an ADDC is converted due to a input that is a VGPR to SGPR copy. But, the initial ADD insruction, which define SCC, is not converted. This causes a compilation failure due to a use of an undefined physical register. This patch adds code that inserts the SCC definition in the MoveToVALU worklist when a SCC use is converted to a VCC use. Differential Revision: https://reviews.llvm.org/D102111
75 lines
3.7 KiB
YAML
75 lines
3.7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -march=amdgcn -mcpu=gfx1030 -run-pass=si-fix-sgpr-copies -verify-machineinstrs -o - %s | FileCheck --check-prefix=GCN %s
|
|
|
|
# Test that the Fix SGPR Copy pass changes scc definitions to vcc if the
|
|
# instruction that uses the scc is changed to use vcc.
|
|
|
|
---
|
|
name: change_scc_def
|
|
body: |
|
|
bb.0:
|
|
; GCN-LABEL: name: change_scc_def
|
|
; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 681
|
|
; GCN: [[DEF:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF1:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF2:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF3:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[S_MOV_B32_1:%[0-9]+]]:sreg_32 = S_MOV_B32 1
|
|
; GCN: [[S_MOV_B32_2:%[0-9]+]]:sreg_32 = S_MOV_B32 0
|
|
; GCN: [[V_MUL_HI_U32_U24_e64_:%[0-9]+]]:vgpr_32 = V_MUL_HI_U32_U24_e64 [[S_MOV_B32_1]], [[S_MOV_B32_]], implicit $exec
|
|
; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[DEF1]]
|
|
; GCN: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 killed [[DEF]], [[COPY]], implicit-def $vcc_lo, implicit $exec
|
|
; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY killed [[DEF3]]
|
|
; GCN: [[V_ADDC_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADDC_U32_e32 killed [[DEF2]], [[COPY1]], implicit-def $vcc_lo, implicit $vcc_lo, implicit $exec
|
|
; GCN: [[DEF4:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[S_MOV_B32_2]]
|
|
; GCN: [[V_ADDC_U32_e32_1:%[0-9]+]]:vgpr_32 = V_ADDC_U32_e32 [[V_MUL_HI_U32_U24_e64_]], [[COPY2]], implicit-def $vcc_lo, implicit $vcc_lo, implicit $exec
|
|
%0:sreg_32 = S_MOV_B32 681
|
|
%1:sreg_32 = IMPLICIT_DEF
|
|
%2:sreg_32 = IMPLICIT_DEF
|
|
%3:sreg_32 = IMPLICIT_DEF
|
|
%4:sreg_32 = IMPLICIT_DEF
|
|
%5:sreg_32 = S_MOV_B32 1
|
|
%6:sreg_32 = S_MOV_B32 0
|
|
%7:vgpr_32 = V_MUL_HI_U32_U24_e64 %5, %0, implicit $exec
|
|
%8:sreg_32 = S_ADD_U32 killed %1, killed %2, implicit-def $scc
|
|
%9:sreg_32 = S_ADDC_U32 killed %3, killed %4, implicit-def $scc, implicit $scc
|
|
%10:sreg_32 = COPY %7
|
|
%11:sreg_32 = S_ADDC_U32 killed %10, %6, implicit-def dead $scc, implicit $scc
|
|
|
|
...
|
|
|
|
# This case successfully converted scc definitions to vcc because the input
|
|
# to the first add is a vgpr. This test checks that it still works correctly.
|
|
---
|
|
name: test-working-scc-def
|
|
body: |
|
|
bb.0:
|
|
; GCN-LABEL: name: test-working-scc-def
|
|
; GCN: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF2:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF3:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF4:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF5:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[DEF6:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 killed [[DEF2]], [[DEF]], implicit-def $vcc_lo, implicit $exec
|
|
; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed [[DEF4]]
|
|
; GCN: [[V_ADDC_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADDC_U32_e32 killed [[DEF3]], [[COPY]], implicit-def $vcc_lo, implicit $vcc_lo, implicit $exec
|
|
; GCN: [[DEF7:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
|
|
; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[DEF5]]
|
|
; GCN: [[V_ADDC_U32_e32_1:%[0-9]+]]:vgpr_32 = V_ADDC_U32_e32 killed [[V_ADDC_U32_e32_1]], [[COPY1]], implicit-def $vcc_lo, implicit $vcc_lo, implicit $exec
|
|
%0:vgpr_32 = IMPLICIT_DEF
|
|
%1:vgpr_32 = IMPLICIT_DEF
|
|
%2:sreg_32 = IMPLICIT_DEF
|
|
%3:sreg_32 = IMPLICIT_DEF
|
|
%4:sreg_32 = IMPLICIT_DEF
|
|
%5:sreg_32 = IMPLICIT_DEF
|
|
%6:sreg_32 = COPY %0
|
|
%7:sreg_32 = S_ADD_U32 killed %6, killed %2, implicit-def $scc
|
|
%8:sreg_32 = S_ADDC_U32 killed %3, killed %4, implicit-def $scc, implicit $scc
|
|
%9:sreg_32 = COPY %1
|
|
%10:sreg_32 = S_ADDC_U32 killed %10, %5, implicit-def dead $scc, implicit $scc
|
|
|
|
...
|