Files
clang-p2996/llvm/test/CodeGen/AMDGPU/change-scc-to-vcc.mir
Brendon Cahoon 3f7b7e7393 [AMDGPU] Update SCC defs to VCC when uses are changed to VCC
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
2021-05-14 18:05:05 -04:00

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
...