forked from OSchip/llvm-project
AMDGPU: Factor switch into separate function
llvm-svn: 248742
This commit is contained in:
parent
73aa8f687a
commit
ba6aae785a
|
@ -2336,27 +2336,9 @@ void SIInstrInfo::moveToVALU(MachineInstr &TopInst) const {
|
|||
}
|
||||
|
||||
// Update the destination register class.
|
||||
|
||||
const TargetRegisterClass *NewDstRC = getOpRegClass(*Inst, 0);
|
||||
|
||||
switch (Opcode) {
|
||||
// For target instructions, getOpRegClass just returns the virtual
|
||||
// register class associated with the operand, so we need to find an
|
||||
// equivalent VGPR register class in order to move the instruction to the
|
||||
// VALU.
|
||||
case AMDGPU::COPY:
|
||||
case AMDGPU::PHI:
|
||||
case AMDGPU::REG_SEQUENCE:
|
||||
case AMDGPU::INSERT_SUBREG:
|
||||
if (RI.hasVGPRs(NewDstRC))
|
||||
continue;
|
||||
NewDstRC = RI.getEquivalentVGPRClass(NewDstRC);
|
||||
if (!NewDstRC)
|
||||
continue;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const TargetRegisterClass *NewDstRC = getDestEquivalentVGPRClass(*Inst);
|
||||
if (!NewDstRC)
|
||||
continue;
|
||||
|
||||
unsigned DstReg = Inst->getOperand(0).getReg();
|
||||
unsigned NewDstReg = MRI.createVirtualRegister(NewDstRC);
|
||||
|
@ -2622,6 +2604,30 @@ void SIInstrInfo::addUsersToMoveToVALUWorklist(
|
|||
}
|
||||
}
|
||||
|
||||
const TargetRegisterClass *SIInstrInfo::getDestEquivalentVGPRClass(
|
||||
const MachineInstr &Inst) const {
|
||||
const TargetRegisterClass *NewDstRC = getOpRegClass(Inst, 0);
|
||||
|
||||
switch (Inst.getOpcode()) {
|
||||
// For target instructions, getOpRegClass just returns the virtual register
|
||||
// class associated with the operand, so we need to find an equivalent VGPR
|
||||
// register class in order to move the instruction to the VALU.
|
||||
case AMDGPU::COPY:
|
||||
case AMDGPU::PHI:
|
||||
case AMDGPU::REG_SEQUENCE:
|
||||
case AMDGPU::INSERT_SUBREG:
|
||||
if (RI.hasVGPRs(NewDstRC))
|
||||
return nullptr;
|
||||
|
||||
NewDstRC = RI.getEquivalentVGPRClass(NewDstRC);
|
||||
if (!NewDstRC)
|
||||
return nullptr;
|
||||
return NewDstRC;
|
||||
default:
|
||||
return NewDstRC;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned SIInstrInfo::findUsedSGPR(const MachineInstr *MI,
|
||||
int OpIndices[3]) const {
|
||||
const MCInstrDesc &Desc = get(MI->getOpcode());
|
||||
|
|
|
@ -56,6 +56,9 @@ private:
|
|||
unsigned Reg, MachineRegisterInfo &MRI,
|
||||
SmallVectorImpl<MachineInstr *> &Worklist) const;
|
||||
|
||||
const TargetRegisterClass *
|
||||
getDestEquivalentVGPRClass(const MachineInstr &Inst) const;
|
||||
|
||||
bool checkInstOffsetsDoNotOverlap(MachineInstr *MIa,
|
||||
MachineInstr *MIb) const;
|
||||
|
||||
|
|
Loading…
Reference in New Issue