diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp | 59 |
2 files changed, 70 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 5c1359e3161..de8147d093f 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -107,6 +107,17 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const SISubtarget &ST, setAction({G_LOAD, 1, S64}, Legal); setAction({G_STORE, 1, S64}, Legal); + for (unsigned Op : {G_EXTRACT_VECTOR_ELT, G_INSERT_VECTOR_ELT}) { + getActionDefinitionsBuilder(Op) + .legalIf([=](const LegalityQuery &Query) { + const LLT &VecTy = Query.Types[1]; + const LLT &IdxTy = Query.Types[2]; + return VecTy.getSizeInBits() % 32 == 0 && + VecTy.getSizeInBits() <= 512 && + IdxTy.getSizeInBits() == 32; + }); + } + // FIXME: Doesn't handle extract of illegal sizes. getActionDefinitionsBuilder(G_EXTRACT) .unsupportedIf([=](const LegalityQuery &Query) { diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp index 72d5d6d09fe..af75aee7410 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -50,6 +50,24 @@ AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI) } +static bool isConstant(const MachineOperand &MO, int64_t &C) { + const MachineFunction *MF = MO.getParent()->getParent()->getParent(); + const MachineRegisterInfo &MRI = MF->getRegInfo(); + const MachineInstr *Def = MRI.getVRegDef(MO.getReg()); + if (!Def) + return false; + + if (Def->getOpcode() == AMDGPU::G_CONSTANT) { + C = Def->getOperand(1).getCImm()->getSExtValue(); + return true; + } + + if (Def->getOpcode() == AMDGPU::COPY) + return isConstant(Def->getOperand(1), C); + + return false; +} + unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst, const RegisterBank &Src, unsigned Size) const { @@ -415,6 +433,47 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size); break; } + + + case AMDGPU::G_EXTRACT_VECTOR_ELT: { + unsigned IdxOp = 2; + int64_t Imm; + // XXX - Do we really need to fully handle these? The constant case should + // be legalized away before RegBankSelect? + + unsigned OutputBankID = isSALUMapping(MI) && isConstant(MI.getOperand(IdxOp), Imm) ? + AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; + + unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); + OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, MRI.getType(MI.getOperand(0).getReg()).getSizeInBits()); + OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, MRI.getType(MI.getOperand(1).getReg()).getSizeInBits()); + + // The index can be either if the source vector is VGPR. + OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, MRI.getType(MI.getOperand(2).getReg()).getSizeInBits()); + break; + } + case AMDGPU::G_INSERT_VECTOR_ELT: { + // XXX - Do we really need to fully handle these? The constant case should + // be legalized away before RegBankSelect? + + int64_t Imm; + + unsigned IdxOp = MI.getOpcode() == AMDGPU::G_EXTRACT_VECTOR_ELT ? 2 : 3; + unsigned BankID = isSALUMapping(MI) && isConstant(MI.getOperand(IdxOp), Imm) ? + AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; + + + + // TODO: Can do SGPR indexing, which would obviate the need for the + // isConstant check. + for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { + unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); + OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size); + } + + + break; + } case AMDGPU::G_INTRINSIC: { switch(MI.getOperand(1).getIntrinsicID()) { default: |