mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
c65fb146ba
It is possible for copies or spills to be inserted in the middle of indirect addressing sequences which use VGPR indexing. Spills to accvgprs could be effected by the indexing mode. Add new pseudo instructions that are expanded after register allocation to avoid the problematic spill or copy placement. Differential Revision: https://reviews.llvm.org/D91048
103 lines
5.5 KiB
YAML
103 lines
5.5 KiB
YAML
# RUN: llc -march=amdgcn -mcpu=gfx900 -start-before=twoaddressinstruction %s -o - | FileCheck %s -check-prefix=GCN
|
||
|
||
# Wait to sxpand SI_INDIRECT sequences that use VGPR indexing until after
|
||
# register allocation. We don’t want to reschedule the mode switching or to
|
||
# have any instructions inserted within the sequence. The Two-Address
|
||
# instruction pass could insert bad copies here if it is expanded too early.
|
||
|
||
---
|
||
# GCN-LABEL: expand_si_indirect
|
||
# GCN: s_set_gpr_idx_on
|
||
# GCN-NEXT: v_mov_b32_e32
|
||
# GCN-NEXT: s_set_gpr_idx_off
|
||
|
||
# GCN: s_set_gpr_idx_on
|
||
# GCN-NEXT: v_mov_b32_e32
|
||
# GCN-NOT: v_mov_b32_e32
|
||
# GCN-NEXT: s_set_gpr_idx_off
|
||
|
||
name: expand_si_indirect
|
||
tracksRegLiveness: true
|
||
body: |
|
||
bb.0.entry:
|
||
liveins: $sgpr0_sgpr1
|
||
|
||
%0:sgpr_64 = COPY killed $sgpr0_sgpr1
|
||
%1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
||
%2:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0(p4), 36, 0, 0
|
||
%3:sreg_32_xm0_xexec = S_LOAD_DWORD_IMM killed %0(p4), 44, 0, 0
|
||
%4:sreg_32 = S_ADD_I32 %3, 1, implicit-def dead $scc
|
||
%5:vgpr_32 = V_MOV_B32_e32 1065353216, implicit $exec
|
||
%6:vgpr_32 = V_MOV_B32_e32 1073741824, implicit $exec
|
||
%7:vgpr_32 = V_MOV_B32_e32 1077936128, implicit $exec
|
||
%8:vgpr_32 = V_MOV_B32_e32 1082130432, implicit $exec
|
||
%9:vgpr_32 = V_MOV_B32_e32 1084227584, implicit $exec
|
||
%10:vgpr_32 = V_MOV_B32_e32 1086324736, implicit $exec
|
||
%11:vgpr_32 = V_MOV_B32_e32 1088421888, implicit $exec
|
||
%12:vgpr_32 = V_MOV_B32_e32 1090519040, implicit $exec
|
||
%13:vgpr_32 = V_MOV_B32_e32 1091567616, implicit $exec
|
||
%14:vgpr_32 = V_MOV_B32_e32 1092616192, implicit $exec
|
||
%15:vgpr_32 = V_MOV_B32_e32 1093664768, implicit $exec
|
||
%16:vgpr_32 = V_MOV_B32_e32 1094713344, implicit $exec
|
||
%17:vgpr_32 = V_MOV_B32_e32 1095761920, implicit $exec
|
||
%18:vgpr_32 = V_MOV_B32_e32 1096810496, implicit $exec
|
||
%19:vgpr_32 = V_MOV_B32_e32 1097859072, implicit $exec
|
||
%20:vgpr_32 = V_MOV_B32_e32 1098907648, implicit $exec
|
||
%21:vreg_512 = REG_SEQUENCE killed %5, %subreg.sub0, killed %6, %subreg.sub1, killed %7, %subreg.sub2, killed %8, %subreg.sub3, killed %9, %subreg.sub4, killed %10, %subreg.sub5, killed %11, %subreg.sub6, killed %12, %subreg.sub7, killed %13, %subreg.sub8, killed %14, %subreg.sub9, killed %15, %subreg.sub10, killed %16, %subreg.sub11, killed %17, %subreg.sub12, killed %18, %subreg.sub13, killed %19, %subreg.sub14, killed %20, %subreg.sub15
|
||
%22:vgpr_32 = V_MOV_B32_e32 1099431936, implicit $exec
|
||
%23:vreg_512 = V_INDIRECT_REG_WRITE_GPR_IDX_B32_V16 killed %21, %22, killed %4, 3, implicit-def $m0, implicit $m0, implicit $exec
|
||
%24:sreg_32 = S_ADD_I32 killed %3, 2, implicit-def dead $scc
|
||
%25:vreg_512 = V_INDIRECT_REG_WRITE_GPR_IDX_B32_V16 %23, killed %22, killed %24, 3, implicit-def $m0, implicit $m0, implicit $exec
|
||
%26:vgpr_32 = COPY %23.sub15
|
||
%27:vgpr_32 = COPY %23.sub14
|
||
%28:vgpr_32 = COPY %23.sub13
|
||
%29:vgpr_32 = COPY %23.sub12
|
||
%30:vreg_128 = REG_SEQUENCE killed %29, %subreg.sub0, killed %28, %subreg.sub1, killed %27, %subreg.sub2, killed %26, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %30, %2, 48, 0, 0, 0, implicit $exec
|
||
%31:vgpr_32 = COPY %23.sub11
|
||
%32:vgpr_32 = COPY %23.sub10
|
||
%33:vgpr_32 = COPY %23.sub9
|
||
%34:vgpr_32 = COPY %23.sub8
|
||
%35:vreg_128 = REG_SEQUENCE killed %34, %subreg.sub0, killed %33, %subreg.sub1, killed %32, %subreg.sub2, killed %31, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %35, %2, 32, 0, 0, 0, implicit $exec
|
||
%36:vgpr_32 = COPY %23.sub7
|
||
%37:vgpr_32 = COPY %23.sub6
|
||
%38:vgpr_32 = COPY %23.sub5
|
||
%39:vgpr_32 = COPY %23.sub4
|
||
%40:vreg_128 = REG_SEQUENCE killed %39, %subreg.sub0, killed %38, %subreg.sub1, killed %37, %subreg.sub2, killed %36, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %40, %2, 16, 0, 0, 0, implicit $exec
|
||
%41:vgpr_32 = COPY %23.sub3
|
||
%42:vgpr_32 = COPY %23.sub2
|
||
%43:vgpr_32 = COPY %23.sub1
|
||
%44:vgpr_32 = COPY killed %23.sub0
|
||
%45:vreg_128 = REG_SEQUENCE killed %44, %subreg.sub0, killed %43, %subreg.sub1, killed %42, %subreg.sub2, killed %41, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %45, %2, 0, 0, 0, 0, implicit $exec
|
||
%46:vgpr_32 = COPY %25.sub15
|
||
%47:vgpr_32 = COPY %25.sub14
|
||
%48:vgpr_32 = COPY %25.sub13
|
||
%49:vgpr_32 = COPY %25.sub12
|
||
%50:vreg_128 = REG_SEQUENCE killed %49, %subreg.sub0, killed %48, %subreg.sub1, killed %47, %subreg.sub2, killed %46, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %50, %2, 112, 0, 0, 0, implicit $exec
|
||
%51:vgpr_32 = COPY %25.sub11
|
||
%52:vgpr_32 = COPY %25.sub10
|
||
%53:vgpr_32 = COPY %25.sub9
|
||
%54:vgpr_32 = COPY %25.sub8
|
||
%55:vreg_128 = REG_SEQUENCE killed %54, %subreg.sub0, killed %53, %subreg.sub1, killed %52, %subreg.sub2, killed %51, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %55, %2, 96, 0, 0, 0, implicit $exec
|
||
%56:vgpr_32 = COPY %25.sub7
|
||
%57:vgpr_32 = COPY %25.sub6
|
||
%58:vgpr_32 = COPY %25.sub5
|
||
%59:vgpr_32 = COPY %25.sub4
|
||
%60:vreg_128 = REG_SEQUENCE killed %59, %subreg.sub0, killed %58, %subreg.sub1, killed %57, %subreg.sub2, killed %56, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR %1, killed %60, %2, 80, 0, 0, 0, implicit $exec
|
||
%61:vgpr_32 = COPY %25.sub3
|
||
%62:vgpr_32 = COPY %25.sub2
|
||
%63:vgpr_32 = COPY %25.sub1
|
||
%64:vgpr_32 = COPY killed %25.sub0
|
||
%65:vreg_128 = REG_SEQUENCE killed %64, %subreg.sub0, killed %63, %subreg.sub1, killed %62, %subreg.sub2, killed %61, %subreg.sub3
|
||
GLOBAL_STORE_DWORDX4_SADDR killed %1, killed %65, killed %2, 64, 0, 0, 0, implicit $exec
|
||
S_ENDPGM 0
|
||
|
||
...
|
||
|