From: Matt Arsenault Date: Sat, 13 Aug 2016 01:43:54 +0000 (+0000) Subject: AMDGPU: Fix not estimating MBB operand sizes correctly X-Git-Tag: llvmorg-4.0.0-rc1~12518 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c1ebd82ebeafdf125cbe4511f0e8361c09c62272;p=platform%2Fupstream%2Fllvm.git AMDGPU: Fix not estimating MBB operand sizes correctly llvm-svn: 278590 --- diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp index ada0529..219dca7 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -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; diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.h b/llvm/lib/Target/AMDGPU/SIInstrInfo.h index 4503466..a08f9f7 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.h +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.h @@ -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;