Skip to content

Commit

Permalink
[AMDGPU] Add new pseudos for indirect addressing with VGPR Indexing
Browse files Browse the repository at this point in the history
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
  • Loading branch information
kerbowa committed Dec 8, 2020
1 parent 98bca0a commit 4aa842a
Show file tree
Hide file tree
Showing 13 changed files with 641 additions and 417 deletions.
46 changes: 23 additions & 23 deletions llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp
Expand Up @@ -2656,14 +2656,12 @@ bool AMDGPUInstructionSelector::selectG_EXTRACT_VECTOR_ELT(
return true;
}

BuildMI(*BB, MI, DL, TII.get(AMDGPU::S_SET_GPR_IDX_ON))
.addReg(IdxReg)
.addImm(AMDGPU::VGPRIndexMode::SRC0_ENABLE);
BuildMI(*BB, MI, DL, TII.get(AMDGPU::V_MOV_B32_e32), DstReg)
.addReg(SrcReg, 0, SubReg)
.addReg(SrcReg, RegState::Implicit)
.addReg(AMDGPU::M0, RegState::Implicit);
BuildMI(*BB, MI, DL, TII.get(AMDGPU::S_SET_GPR_IDX_OFF));
const MCInstrDesc &GPRIDXDesc =
TII.getIndirectGPRIDXPseudo(TRI.getRegSizeInBits(*SrcRC), true);
BuildMI(*BB, MI, DL, GPRIDXDesc, DstReg)
.addReg(SrcReg)
.addReg(IdxReg)
.addImm(SubReg);

MI.eraseFromParent();
return true;
Expand Down Expand Up @@ -2717,25 +2715,27 @@ bool AMDGPUInstructionSelector::selectG_INSERT_VECTOR_ELT(
MachineBasicBlock *BB = MI.getParent();
const DebugLoc &DL = MI.getDebugLoc();

if (IndexMode) {
BuildMI(*BB, MI, DL, TII.get(AMDGPU::S_SET_GPR_IDX_ON))
.addReg(IdxReg)
.addImm(AMDGPU::VGPRIndexMode::DST_ENABLE);
} else {
if (!IndexMode) {
BuildMI(*BB, &MI, DL, TII.get(AMDGPU::COPY), AMDGPU::M0)
.addReg(IdxReg);
}

const MCInstrDesc &RegWriteOp
= TII.getIndirectRegWritePseudo(VecSize, ValSize,
VecRB->getID() == AMDGPU::SGPRRegBankID);
BuildMI(*BB, MI, DL, RegWriteOp, DstReg)
.addReg(VecReg)
.addReg(ValReg)
.addImm(SubReg);
const MCInstrDesc &RegWriteOp = TII.getIndirectRegWriteMovRelPseudo(
VecSize, ValSize, VecRB->getID() == AMDGPU::SGPRRegBankID);
BuildMI(*BB, MI, DL, RegWriteOp, DstReg)
.addReg(VecReg)
.addReg(ValReg)
.addImm(SubReg);
MI.eraseFromParent();
return true;
}

if (IndexMode)
BuildMI(*BB, MI, DL, TII.get(AMDGPU::S_SET_GPR_IDX_OFF));
const MCInstrDesc &GPRIDXDesc =
TII.getIndirectGPRIDXPseudo(TRI.getRegSizeInBits(*VecRC), false);
BuildMI(*BB, MI, DL, GPRIDXDesc, DstReg)
.addReg(VecReg)
.addReg(ValReg)
.addReg(IdxReg)
.addImm(SubReg);

MI.eraseFromParent();
return true;
Expand Down

0 comments on commit 4aa842a

Please sign in to comment.