AMDGPU: Fix not estimating MBB operand sizes correctly

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278590 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matt Arsenault 2016-08-13 01:43:54 +00:00
parent b24aaff187
commit e8fc9abe31
2 changed files with 26 additions and 2 deletions

View File

@ -1515,6 +1515,24 @@ bool SIInstrInfo::isLiteralConstant(const MachineOperand &MO,
return MO.isImm() && !isInlineConstant(MO, OpSize);
}
bool SIInstrInfo::isLiteralConstantLike(const MachineOperand &MO,
unsigned OpSize) const {
switch (MO.getType()) {
case MachineOperand::MO_Register:
return false;
case MachineOperand::MO_Immediate:
return !isInlineConstant(MO, OpSize);
case MachineOperand::MO_FrameIndex:
case MachineOperand::MO_MachineBasicBlock:
case MachineOperand::MO_ExternalSymbol:
case MachineOperand::MO_GlobalAddress:
case MachineOperand::MO_MCSymbol:
return true;
default:
llvm_unreachable("unexpected operand type");
}
}
static bool compareMachineOp(const MachineOperand &Op0,
const MachineOperand &Op1) {
if (Op0.getType() != Op1.getType())
@ -3158,14 +3176,14 @@ unsigned SIInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
if (Src0Idx == -1)
return 4; // No operands.
if (isLiteralConstant(MI.getOperand(Src0Idx), getOpSize(MI, Src0Idx)))
if (isLiteralConstantLike(MI.getOperand(Src0Idx), getOpSize(MI, Src0Idx)))
return 8;
int Src1Idx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src1);
if (Src1Idx == -1)
return 4;
if (isLiteralConstant(MI.getOperand(Src1Idx), getOpSize(MI, Src1Idx)))
if (isLiteralConstantLike(MI.getOperand(Src1Idx), getOpSize(MI, Src1Idx)))
return 8;
return 4;

View File

@ -384,6 +384,12 @@ public:
bool isInlineConstant(const MachineOperand &MO, unsigned OpSize) const;
bool isLiteralConstant(const MachineOperand &MO, unsigned OpSize) const;
// Returns true if this operand could potentially require a 32-bit literal
// operand, but not necessarily. A FrameIndex for example could resolve to an
// inline immediate value that will not require an additional 4-bytes; this
// assumes that it will.
bool isLiteralConstantLike(const MachineOperand &MO, unsigned OpSize) const;
bool isImmOperandLegal(const MachineInstr &MI, unsigned OpNo,
const MachineOperand &MO) const;