mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
AMDGPU: Refactor isImmOperandLegal (#155607)
The goal is to expose more variants that can operate without preconstructed MachineInstrs or MachineOperands.
This commit is contained in:
@@ -4572,19 +4572,24 @@ static bool compareMachineOp(const MachineOperand &Op0,
|
||||
}
|
||||
}
|
||||
|
||||
bool SIInstrInfo::isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
const MachineOperand &MO) const {
|
||||
const MCOperandInfo &OpInfo = InstDesc.operands()[OpNo];
|
||||
|
||||
assert(MO.isImm() || MO.isTargetIndex() || MO.isFI() || MO.isGlobal());
|
||||
|
||||
bool SIInstrInfo::isLiteralOperandLegal(const MCInstrDesc &InstDesc,
|
||||
const MCOperandInfo &OpInfo) const {
|
||||
if (OpInfo.OperandType == MCOI::OPERAND_IMMEDIATE)
|
||||
return true;
|
||||
|
||||
if (OpInfo.RegClass < 0)
|
||||
if (!RI.opCanUseLiteralConstant(OpInfo.OperandType))
|
||||
return false;
|
||||
|
||||
if (MO.isImm() && isInlineConstant(MO, OpInfo)) {
|
||||
if (!isVOP3(InstDesc) || !AMDGPU::isSISrcOperand(OpInfo))
|
||||
return true;
|
||||
|
||||
return ST.hasVOP3Literal();
|
||||
}
|
||||
|
||||
bool SIInstrInfo::isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
int64_t ImmVal) const {
|
||||
const MCOperandInfo &OpInfo = InstDesc.operands()[OpNo];
|
||||
if (isInlineConstant(ImmVal, OpInfo.OperandType)) {
|
||||
if (isMAI(InstDesc) && ST.hasMFMAInlineLiteralBug() &&
|
||||
OpNo == (unsigned)AMDGPU::getNamedOperandIdx(InstDesc.getOpcode(),
|
||||
AMDGPU::OpName::src2))
|
||||
@@ -4592,13 +4597,18 @@ bool SIInstrInfo::isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
return RI.opCanUseInlineConstant(OpInfo.OperandType);
|
||||
}
|
||||
|
||||
if (!RI.opCanUseLiteralConstant(OpInfo.OperandType))
|
||||
return false;
|
||||
return isLiteralOperandLegal(InstDesc, OpInfo);
|
||||
}
|
||||
|
||||
if (!isVOP3(InstDesc) || !AMDGPU::isSISrcOperand(InstDesc, OpNo))
|
||||
return true;
|
||||
bool SIInstrInfo::isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
const MachineOperand &MO) const {
|
||||
if (MO.isImm())
|
||||
return isImmOperandLegal(InstDesc, OpNo, MO.getImm());
|
||||
|
||||
return ST.hasVOP3Literal();
|
||||
assert((MO.isTargetIndex() || MO.isFI() || MO.isGlobal()) &&
|
||||
"unexpected imm-like operand kind");
|
||||
const MCOperandInfo &OpInfo = InstDesc.operands()[OpNo];
|
||||
return isLiteralOperandLegal(InstDesc, OpInfo);
|
||||
}
|
||||
|
||||
bool SIInstrInfo::isLegalAV64PseudoImm(uint64_t Imm) const {
|
||||
@@ -6268,7 +6278,7 @@ bool SIInstrInfo::isOperandLegal(const MachineInstr &MI, unsigned OpIdx,
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (AMDGPU::isSISrcOperand(InstDesc, i) &&
|
||||
} else if (AMDGPU::isSISrcOperand(InstDesc.operands()[i]) &&
|
||||
!isInlineConstant(Op, InstDesc.operands()[i])) {
|
||||
// The same literal may be used multiple times.
|
||||
if (!UsedLiteral)
|
||||
|
||||
@@ -1183,6 +1183,12 @@ public:
|
||||
bool isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
const MachineOperand &MO) const;
|
||||
|
||||
bool isLiteralOperandLegal(const MCInstrDesc &InstDesc,
|
||||
const MCOperandInfo &OpInfo) const;
|
||||
|
||||
bool isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
|
||||
int64_t ImmVal) const;
|
||||
|
||||
bool isImmOperandLegal(const MachineInstr &MI, unsigned OpNo,
|
||||
const MachineOperand &MO) const {
|
||||
return isImmOperandLegal(MI.getDesc(), OpNo, MO);
|
||||
|
||||
@@ -2723,13 +2723,6 @@ bool isInlineValue(unsigned Reg) {
|
||||
#undef CASE_GFXPRE11_GFX11PLUS_TO
|
||||
#undef MAP_REG2REG
|
||||
|
||||
bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo) {
|
||||
assert(OpNo < Desc.NumOperands);
|
||||
unsigned OpType = Desc.operands()[OpNo].OperandType;
|
||||
return OpType >= AMDGPU::OPERAND_SRC_FIRST &&
|
||||
OpType <= AMDGPU::OPERAND_SRC_LAST;
|
||||
}
|
||||
|
||||
bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo) {
|
||||
assert(OpNo < Desc.NumOperands);
|
||||
unsigned OpType = Desc.operands()[OpNo].OperandType;
|
||||
|
||||
@@ -1590,7 +1590,14 @@ bool isInlineValue(unsigned Reg);
|
||||
|
||||
/// Is this an AMDGPU specific source operand? These include registers,
|
||||
/// inline constants, literals and mandatory literals (KImm).
|
||||
bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo);
|
||||
constexpr bool isSISrcOperand(const MCOperandInfo &OpInfo) {
|
||||
return OpInfo.OperandType >= AMDGPU::OPERAND_SRC_FIRST &&
|
||||
OpInfo.OperandType <= AMDGPU::OPERAND_SRC_LAST;
|
||||
}
|
||||
|
||||
constexpr bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo) {
|
||||
return isSISrcOperand(Desc.operands()[OpNo]);
|
||||
}
|
||||
|
||||
/// Is this a KImm operand?
|
||||
bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo);
|
||||
|
||||
Reference in New Issue
Block a user