summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp11
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp59
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:
OpenPOWER on IntegriCloud