AMDGPU: Simplify VOP3 operand legalization.
This was checking for a variety of situations that should never happen. This saves a tiny bit of compile time. We should not be selecting instructions with invalid operands in the first place. Most of the time for registers copys are inserted to the correct operand register class. For VOP3, since all operand types are supported and literal constants never are, we just need to verify the constant bus requirements (all immediates should be legal inline ones). The only possibly tricky case to maybe worry about is if when legalizing operands in moveToVALU with s_add_i32 and similar instructions. If the original s_add_i32 had a literal constant and we need to replace it with v_add_i32_e64 we would have an unsupported literal operand. However, I don't think we should worry about that because SIFoldOperands should handle folding literal constant operands into the SALU instructions based on the uses. At SIFoldOperands time, the legality and profitability of operand types is a bit different. llvm-svn: 250951
This commit is contained in:
parent
446c714a76
commit
6005fcbe12
|
@ -2144,7 +2144,12 @@ void SITargetLowering::AdjustInstrPostInstrSelection(MachineInstr *MI,
|
|||
static_cast<const SIInstrInfo *>(Subtarget->getInstrInfo());
|
||||
|
||||
MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
|
||||
TII->legalizeOperands(MI);
|
||||
|
||||
if (TII->isVOP3(MI->getOpcode())) {
|
||||
// Make sure constant bus requirements are respected.
|
||||
TII->legalizeOperandsVOP3(MRI, MI);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TII->isMIMG(*MI)) {
|
||||
unsigned VReg = MI->getOperand(0).getReg();
|
||||
|
|
|
@ -1718,18 +1718,58 @@ bool SIInstrInfo::isOperandLegal(const MachineInstr *MI, unsigned OpIdx,
|
|||
return isImmOperandLegal(MI, OpIdx, *MO);
|
||||
}
|
||||
|
||||
// Legalize VOP3 operands. Because all operand types are supported for any
|
||||
// operand, and since literal constants are not allowed and should never be
|
||||
// seen, we only need to worry about inserting copies if we use multiple SGPR
|
||||
// operands.
|
||||
void SIInstrInfo::legalizeOperandsVOP3(
|
||||
MachineRegisterInfo &MRI,
|
||||
MachineInstr *MI) const {
|
||||
unsigned Opc = MI->getOpcode();
|
||||
|
||||
int VOP3Idx[3] = {
|
||||
AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src0),
|
||||
AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src1),
|
||||
AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src2)
|
||||
};
|
||||
|
||||
// Find the one SGPR operand we are allowed to use.
|
||||
unsigned SGPRReg = findUsedSGPR(MI, VOP3Idx);
|
||||
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
int Idx = VOP3Idx[i];
|
||||
if (Idx == -1)
|
||||
break;
|
||||
MachineOperand &MO = MI->getOperand(Idx);
|
||||
|
||||
// We should never see a VOP3 instruction with an illegal immediate operand.
|
||||
if (!MO.isReg())
|
||||
continue;
|
||||
|
||||
if (!RI.isSGPRClass(MRI.getRegClass(MO.getReg())))
|
||||
continue; // VGPRs are legal
|
||||
|
||||
if (SGPRReg == AMDGPU::NoRegister || SGPRReg == MO.getReg()) {
|
||||
SGPRReg = MO.getReg();
|
||||
// We can use one SGPR in each VOP3 instruction.
|
||||
continue;
|
||||
}
|
||||
|
||||
// If we make it this far, then the operand is not legal and we must
|
||||
// legalize it.
|
||||
legalizeOpWithMove(MI, Idx);
|
||||
}
|
||||
}
|
||||
|
||||
void SIInstrInfo::legalizeOperands(MachineInstr *MI) const {
|
||||
MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
|
||||
|
||||
int Src0Idx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
|
||||
AMDGPU::OpName::src0);
|
||||
int Src1Idx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
|
||||
AMDGPU::OpName::src1);
|
||||
int Src2Idx = AMDGPU::getNamedOperandIdx(MI->getOpcode(),
|
||||
AMDGPU::OpName::src2);
|
||||
unsigned Opc = MI->getOpcode();
|
||||
|
||||
// Legalize VOP2
|
||||
if (isVOP2(*MI) && Src1Idx != -1) {
|
||||
if (isVOP2(*MI)) {
|
||||
int Src0Idx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src0);
|
||||
int Src1Idx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src1);
|
||||
|
||||
// Legalize src0
|
||||
if (!isOperandLegal(MI, Src0Idx))
|
||||
legalizeOpWithMove(MI, Src0Idx);
|
||||
|
@ -1752,41 +1792,9 @@ void SIInstrInfo::legalizeOperands(MachineInstr *MI) const {
|
|||
return;
|
||||
}
|
||||
|
||||
// XXX - Do any VOP3 instructions read VCC?
|
||||
// Legalize VOP3
|
||||
if (isVOP3(*MI)) {
|
||||
int VOP3Idx[3] = { Src0Idx, Src1Idx, Src2Idx };
|
||||
|
||||
// Find the one SGPR operand we are allowed to use.
|
||||
unsigned SGPRReg = findUsedSGPR(MI, VOP3Idx);
|
||||
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
int Idx = VOP3Idx[i];
|
||||
if (Idx == -1)
|
||||
break;
|
||||
MachineOperand &MO = MI->getOperand(Idx);
|
||||
|
||||
if (MO.isReg()) {
|
||||
if (!RI.isSGPRClass(MRI.getRegClass(MO.getReg())))
|
||||
continue; // VGPRs are legal
|
||||
|
||||
assert(MO.getReg() != AMDGPU::SCC && "SCC operand to VOP3 instruction");
|
||||
|
||||
if (SGPRReg == AMDGPU::NoRegister || SGPRReg == MO.getReg()) {
|
||||
SGPRReg = MO.getReg();
|
||||
// We can use one SGPR in each VOP3 instruction.
|
||||
continue;
|
||||
}
|
||||
} else if (!isLiteralConstant(MO, getOpSize(MI->getOpcode(), Idx))) {
|
||||
// If it is not a register and not a literal constant, then it must be
|
||||
// an inline constant which is always legal.
|
||||
continue;
|
||||
}
|
||||
// If we make it this far, then the operand is not legal and we must
|
||||
// legalize it.
|
||||
legalizeOpWithMove(MI, Idx);
|
||||
}
|
||||
|
||||
legalizeOperandsVOP3(MRI, MI);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -378,6 +378,9 @@ public:
|
|||
bool isOperandLegal(const MachineInstr *MI, unsigned OpIdx,
|
||||
const MachineOperand *MO = nullptr) const;
|
||||
|
||||
/// \brief Fix operands in \p MI to satisfy constant bus requirements.
|
||||
void legalizeOperandsVOP3(MachineRegisterInfo &MRI, MachineInstr *MI) const;
|
||||
|
||||
/// \brief Legalize all operands in this instruction. This function may
|
||||
/// create new instruction and insert them before \p MI.
|
||||
void legalizeOperands(MachineInstr *MI) const;
|
||||
|
|
Loading…
Reference in New Issue