LLVM API Documentation

Public Types | Public Member Functions
llvm::R600InstrInfo Class Reference

#include <R600InstrInfo.h>

Inheritance diagram for llvm::R600InstrInfo:
Inheritance graph
[legend]
Collaboration diagram for llvm::R600InstrInfo:
Collaboration graph
[legend]

List of all members.

Public Types

enum  BankSwizzle {
  ALU_VEC_012_SCL_210 = 0, ALU_VEC_021_SCL_122, ALU_VEC_120_SCL_212, ALU_VEC_102_SCL_221,
  ALU_VEC_201, ALU_VEC_210
}

Public Member Functions

 R600InstrInfo (const AMDGPUSubtarget &st)
const R600RegisterInfogetRegisterInfo () const override
void copyPhysReg (MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const override
bool isLegalToSplitMBBAt (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const override
bool isTrig (const MachineInstr &MI) const
bool isPlaceHolderOpcode (unsigned opcode) const
bool isReductionOp (unsigned opcode) const
bool isCubeOp (unsigned opcode) const
bool isALUInstr (unsigned Opcode) const
bool hasInstrModifiers (unsigned Opcode) const
bool isLDSInstr (unsigned Opcode) const
bool isLDSNoRetInstr (unsigned Opcode) const
bool isLDSRetInstr (unsigned Opcode) const
bool canBeConsideredALU (const MachineInstr *MI) const
bool isTransOnly (unsigned Opcode) const
bool isTransOnly (const MachineInstr *MI) const
bool isVectorOnly (unsigned Opcode) const
bool isVectorOnly (const MachineInstr *MI) const
bool isExport (unsigned Opcode) const
bool usesVertexCache (unsigned Opcode) const
bool usesVertexCache (const MachineInstr *MI) const
bool usesTextureCache (unsigned Opcode) const
bool usesTextureCache (const MachineInstr *MI) const
bool mustBeLastInClause (unsigned Opcode) const
bool usesAddressRegister (MachineInstr *MI) const
bool definesAddressRegister (MachineInstr *MI) const
bool readsLDSSrcReg (const MachineInstr *MI) const
int getSrcIdx (unsigned Opcode, unsigned SrcNum) const
int getSelIdx (unsigned Opcode, unsigned SrcIdx) const
SmallVector< std::pair
< MachineOperand *, int64_t >, 3 > 
getSrcs (MachineInstr *MI) const
unsigned isLegalUpTo (const std::vector< std::vector< std::pair< int, unsigned > > > &IGSrcs, const std::vector< R600InstrInfo::BankSwizzle > &Swz, const std::vector< std::pair< int, unsigned > > &TransSrcs, R600InstrInfo::BankSwizzle TransSwz) const
bool FindSwizzleForVectorSlot (const std::vector< std::vector< std::pair< int, unsigned > > > &IGSrcs, std::vector< R600InstrInfo::BankSwizzle > &SwzCandidate, const std::vector< std::pair< int, unsigned > > &TransSrcs, R600InstrInfo::BankSwizzle TransSwz) const
bool fitsReadPortLimitations (const std::vector< MachineInstr * > &MIs, const DenseMap< unsigned, unsigned > &PV, std::vector< BankSwizzle > &BS, bool isLastAluTrans) const
bool fitsConstReadLimitations (const std::vector< MachineInstr * > &) const
bool fitsConstReadLimitations (const std::vector< unsigned > &) const
 Same but using const index set instead of MI set.
bool isVector (const MachineInstr &MI) const
 Vector instructions are instructions that must fill all instruction slots within an instruction group.
bool isMov (unsigned Opcode) const override
DFAPacketizerCreateTargetScheduleState (const TargetMachine *TM, const ScheduleDAG *DAG) const override
bool ReverseBranchCondition (SmallVectorImpl< MachineOperand > &Cond) const override
bool AnalyzeBranch (MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
unsigned InsertBranch (MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const override
unsigned RemoveBranch (MachineBasicBlock &MBB) const override
bool isPredicated (const MachineInstr *MI) const override
bool isPredicable (MachineInstr *MI) const override
bool isProfitableToDupForIfCvt (MachineBasicBlock &MBB, unsigned NumCyles, const BranchProbability &Probability) const override
bool isProfitableToIfCvt (MachineBasicBlock &MBB, unsigned NumCyles, unsigned ExtraPredCycles, const BranchProbability &Probability) const override
bool isProfitableToIfCvt (MachineBasicBlock &TMBB, unsigned NumTCycles, unsigned ExtraTCycles, MachineBasicBlock &FMBB, unsigned NumFCycles, unsigned ExtraFCycles, const BranchProbability &Probability) const override
bool DefinesPredicate (MachineInstr *MI, std::vector< MachineOperand > &Pred) const override
bool SubsumesPredicate (const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const override
bool isProfitableToUnpredicate (MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const override
bool PredicateInstruction (MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const override
unsigned int getPredicationCost (const MachineInstr *) const override
unsigned int getInstrLatency (const InstrItineraryData *ItinData, const MachineInstr *MI, unsigned *PredCost=nullptr) const override
int getInstrLatency (const InstrItineraryData *ItinData, SDNode *Node) const override
bool expandPostRAPseudo (MachineBasicBlock::iterator MI) const override
void reserveIndirectRegisters (BitVector &Reserved, const MachineFunction &MF) const
 Reserve the registers that may be accesed using indirect addressing.
unsigned calculateIndirectAddress (unsigned RegIndex, unsigned Channel) const override
 Calculate the "Indirect Address" for the given RegIndex and Channel.
const TargetRegisterClassgetIndirectAddrRegClass () const override
MachineInstrBuilder buildIndirectWrite (MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const override
 Build instruction(s) for an indirect register write.
MachineInstrBuilder buildIndirectRead (MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned ValueReg, unsigned Address, unsigned OffsetReg) const override
 Build instruction(s) for an indirect register read.
unsigned getMaxAlusPerClause () const
MachineInstrBuilder buildDefaultInstruction (MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned Opcode, unsigned DstReg, unsigned Src0Reg, unsigned Src1Reg=0) const
MachineInstrbuildSlotOfVectorInstruction (MachineBasicBlock &MBB, MachineInstr *MI, unsigned Slot, unsigned DstReg) const
MachineInstrbuildMovImm (MachineBasicBlock &BB, MachineBasicBlock::iterator I, unsigned DstReg, uint64_t Imm) const
MachineInstrbuildMovInstr (MachineBasicBlock *MBB, MachineBasicBlock::iterator I, unsigned DstReg, unsigned SrcReg) const override
 Build a MOV instruction.
int getOperandIdx (const MachineInstr &MI, unsigned Op) const
 Get the index of Op in the MachineInstr.
int getOperandIdx (unsigned Opcode, unsigned Op) const
 Get the index of Op for the given Opcode.
void setImmOperand (MachineInstr *MI, unsigned Op, int64_t Imm) const
 Helper function for setting instruction flag values.
bool hasFlagOperand (const MachineInstr &MI) const
void addFlag (MachineInstr *MI, unsigned Operand, unsigned Flag) const
 Add one of the MO_FLAG* flags to the specified Operand.
bool isFlagSet (const MachineInstr &MI, unsigned Operand, unsigned Flag) const
 Determine if the specified Flag is set on this Operand.
MachineOperandgetFlagOp (MachineInstr *MI, unsigned SrcIdx=0, unsigned Flag=0) const
void clearFlag (MachineInstr *MI, unsigned Operand, unsigned Flag) const
 Clear the specified flag on the instruction.

Detailed Description

Definition at line 32 of file R600InstrInfo.h.


Member Enumeration Documentation

Enumerator:
ALU_VEC_012_SCL_210 
ALU_VEC_021_SCL_122 
ALU_VEC_120_SCL_212 
ALU_VEC_102_SCL_221 
ALU_VEC_201 
ALU_VEC_210 

Definition at line 52 of file R600InstrInfo.h.


Constructor & Destructor Documentation

Definition at line 31 of file R600InstrInfo.cpp.


Member Function Documentation

void R600InstrInfo::addFlag ( MachineInstr MI,
unsigned  Operand,
unsigned  Flag 
) const
bool R600InstrInfo::AnalyzeBranch ( MachineBasicBlock MBB,
MachineBasicBlock *&  TBB,
MachineBasicBlock *&  FBB,
SmallVectorImpl< MachineOperand > &  Cond,
bool  AllowModify 
) const [override]

buildDefaultInstruction - This function returns a MachineInstr with all the instruction modifiers initialized to their default values. You can use this function to avoid manually specifying each instruction modifier operand when building a new instruction.

Returns:
a MachineInstr with all the instruction modifiers initialized to their default values.

Definition at line 1186 of file R600InstrInfo.cpp.

References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), and llvm::MachineBasicBlock::findDebugLoc().

Referenced by buildMovImm(), buildMovInstr(), buildSlotOfVectorInstruction(), copyPhysReg(), and llvm::R600TargetLowering::EmitInstrWithCustomInserter().

MachineInstrBuilder R600InstrInfo::buildIndirectRead ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  I,
unsigned  ValueReg,
unsigned  Address,
unsigned  OffsetReg 
) const [override, virtual]

Build instruction(s) for an indirect register read.

Returns:
The instruction that performs the indirect register read

Implements llvm::AMDGPUInstrInfo.

Definition at line 1148 of file R600InstrInfo.cpp.

MachineInstrBuilder R600InstrInfo::buildIndirectWrite ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  I,
unsigned  ValueReg,
unsigned  Address,
unsigned  OffsetReg 
) const [override, virtual]

Build instruction(s) for an indirect register write.

Returns:
The instruction that performs the indirect register write

Implements llvm::AMDGPUInstrInfo.

Definition at line 1116 of file R600InstrInfo.cpp.

MachineInstr * R600InstrInfo::buildMovInstr ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  I,
unsigned  DstReg,
unsigned  SrcReg 
) const [override, virtual]

Build a MOV instruction.

Implements llvm::AMDGPUInstrInfo.

Definition at line 1323 of file R600InstrInfo.cpp.

References buildDefaultInstruction().

unsigned R600InstrInfo::calculateIndirectAddress ( unsigned  RegIndex,
unsigned  Channel 
) const [override, virtual]

Calculate the "Indirect Address" for the given RegIndex and Channel.

We model indirect addressing using a virtual address space that can be accesed with loads and stores. The "Indirect Address" is the memory address in this virtual address space that maps to the given RegIndex and Channel.

Implements llvm::AMDGPUInstrInfo.

Definition at line 1105 of file R600InstrInfo.cpp.

Returns:
true if this Opcode represents an ALU instruction or an instruction that will be lowered in ExpandSpecialInstrs Pass.

Definition at line 163 of file R600InstrInfo.cpp.

References llvm::TargetOpcode::COPY, llvm::MachineInstr::getOpcode(), isALUInstr(), isCubeOp(), and isVector().

void R600InstrInfo::clearFlag ( MachineInstr MI,
unsigned  Operand,
unsigned  Flag 
) const

Clear the specified flag on the instruction.

Definition at line 1429 of file R600InstrInfo.cpp.

References getFlagOp(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOpcode(), HAS_NATIVE_OPERANDS, NUM_MO_FLAGS, and llvm::MachineOperand::setImm().

Referenced by addFlag(), and RemoveBranch().

void R600InstrInfo::copyPhysReg ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MI,
DebugLoc  DL,
unsigned  DestReg,
unsigned  SrcReg,
bool  KillSrc 
) const [override]
bool R600InstrInfo::DefinesPredicate ( MachineInstr MI,
std::vector< MachineOperand > &  Pred 
) const [override]

Reimplemented from llvm::AMDGPUInstrInfo.

Definition at line 1001 of file R600InstrInfo.cpp.

References llvm::MachineInstr::getOpcode(), and isPredicateSetter().

bool R600InstrInfo::FindSwizzleForVectorSlot ( const std::vector< std::vector< std::pair< int, unsigned > > > &  IGSrcs,
std::vector< R600InstrInfo::BankSwizzle > &  SwzCandidate,
const std::vector< std::pair< int, unsigned > > &  TransSrcs,
R600InstrInfo::BankSwizzle  TransSwz 
) const

Enumerate all possible Swizzle sequence to find one that can meet all read port requirements.

Definition at line 515 of file R600InstrInfo.cpp.

References isLegalUpTo(), and NextPossibleSolution().

Referenced by fitsReadPortLimitations().

An instruction group can only access 2 channel pair (either [XY] or [ZW]) from KCache bank on R700+. This function check if MI set in input meet this limitations

Definition at line 626 of file R600InstrInfo.cpp.

References contains(), llvm::R600RegisterInfo::getHWRegChan(), llvm::MachineInstr::getOpcode(), getSrcs(), llvm::SmallSet< T, N, C >::insert(), isALUInstr(), llvm::SmallSet< T, N, C >::size(), and llvm::SmallVectorTemplateCommon< T >::size().

Referenced by FoldOperand().

bool R600InstrInfo::fitsConstReadLimitations ( const std::vector< unsigned > &  Consts) const

Same but using const index set instead of MI set.

Definition at line 601 of file R600InstrInfo.cpp.

bool R600InstrInfo::fitsReadPortLimitations ( const std::vector< MachineInstr * > &  MIs,
const DenseMap< unsigned, unsigned > &  PV,
std::vector< BankSwizzle > &  BS,
bool  isLastAluTrans 
) const

Given the order VEC_012 < VEC_021 < VEC_120 < VEC_102 < VEC_201 < VEC_210 returns true and the first (in lexical order) BankSwizzle affectation starting from the one already provided in the Instruction Group MIs that fits Read Port limitations in BS if available. Otherwise returns false and undefined content in BS. isLastAluTrans should be set if the last Alu of MIs will be executed on Trans ALU. In this case, ValidTSwizzle returns the BankSwizzle value to apply to the last instruction. PV holds GPR to PV registers in the Instruction Group MIs.

Definition at line 552 of file R600InstrInfo.cpp.

References ALU_VEC_012_SCL_210, ALU_VEC_021_SCL_122, ALU_VEC_102_SCL_221, ALU_VEC_120_SCL_212, FindSwizzleForVectorSlot(), getOperandIdx(), and isConstCompatible().

MachineOperand & R600InstrInfo::getFlagOp ( MachineInstr MI,
unsigned  SrcIdx = 0,
unsigned  Flag = 0 
) const
Parameters:
SrcIdxThe register source to set the flag on (e.g src0, src1, src2)
FlagThe flag being set.
Returns:
the operand containing the flags for this instruction.

Definition at line 1353 of file R600InstrInfo.cpp.

References GET_FLAG_OPERAND_IDX, llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), getOperandIdx(), HAS_NATIVE_OPERANDS, llvm::MachineOperand::isImm(), MO_FLAG_ABS, MO_FLAG_CLAMP, MO_FLAG_LAST, MO_FLAG_MASK, MO_FLAG_NEG, MO_FLAG_NOT_LAST, R600_InstFlag::OP3, and llvm::LibFunc::write.

Referenced by addFlag(), and clearFlag().

Returns:
The register class to be used for loading and storing values from an "Indirect Address" .

Implements llvm::AMDGPUInstrInfo.

Definition at line 1112 of file R600InstrInfo.cpp.

unsigned int R600InstrInfo::getInstrLatency ( const InstrItineraryData ItinData,
const MachineInstr MI,
unsigned PredCost = nullptr 
) const [override]

Definition at line 1053 of file R600InstrInfo.cpp.

int llvm::R600InstrInfo::getInstrLatency ( const InstrItineraryData ItinData,
SDNode Node 
) const [inline, override]

Definition at line 206 of file R600InstrInfo.h.

Definition at line 1182 of file R600InstrInfo.cpp.

Referenced by llvm::R600SchedStrategy::initialize().

int R600InstrInfo::getOperandIdx ( unsigned  Opcode,
unsigned  Op 
) const

Get the index of Op for the given Opcode.

Returns:
-1 if the Instruction does not contain the specified Op.

Definition at line 1333 of file R600InstrInfo.cpp.

References llvm::AMDGPU::getNamedOperandIdx().

Definition at line 1049 of file R600InstrInfo.cpp.

const R600RegisterInfo & R600InstrInfo::getRegisterInfo ( ) const [override, virtual]

Implements llvm::AMDGPUInstrInfo.

Definition at line 36 of file R600InstrInfo.cpp.

Referenced by llvm::R600TargetLowering::LowerOperation().

int R600InstrInfo::getSelIdx ( unsigned  Opcode,
unsigned  SrcIdx 
) const
Returns:
The operand Index for the Sel operand given an index to one of the instruction's src operands.

Definition at line 272 of file R600InstrInfo.cpp.

References getOperandIdx(), and SRC_SEL_ROWS.

Referenced by FoldOperand().

int R600InstrInfo::getSrcIdx ( unsigned  Opcode,
unsigned  SrcNum 
) const
Returns:
The operand index for the given source number. Legal values for SrcNum are 0, 1, and 2.

Definition at line 260 of file R600InstrInfo.cpp.

References getOperandIdx().

SmallVector< std::pair< MachineOperand *, int64_t >, 3 > R600InstrInfo::getSrcs ( MachineInstr MI) const
Returns:
a pair for each src of an ALU instructions. The first member of a pair is the register id. If register is ALU_CONST, second member is SEL. If register is ALU_LITERAL, second member is IMM. Otherwise, second member value is undefined.

Definition at line 297 of file R600InstrInfo.cpp.

References llvm::MachineOperand::getImm(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), getOperandIdx(), llvm::MachineOperand::getReg(), and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

Referenced by fitsConstReadLimitations().

Returns:
true if this instruction has an operand for storing target flags.

Definition at line 1349 of file R600InstrInfo.cpp.

References GET_FLAG_OPERAND_IDX, and llvm::MachineInstr::getOpcode().

Definition at line 139 of file R600InstrInfo.cpp.

References R600_InstFlag::OP1, R600_InstFlag::OP2, and R600_InstFlag::OP3.

Returns:
true if this Opcode represents an ALU instruction.

Definition at line 133 of file R600InstrInfo.cpp.

References R600_InstFlag::ALU_INST.

Referenced by canBeConsideredALU(), fitsConstReadLimitations(), and readsLDSSrcReg().

Definition at line 122 of file R600InstrInfo.cpp.

Referenced by canBeConsideredALU().

Definition at line 199 of file R600InstrInfo.cpp.

References R600_InstFlag::IS_EXPORT.

bool llvm::R600InstrInfo::isFlagSet ( const MachineInstr MI,
unsigned  Operand,
unsigned  Flag 
) const

Determine if the specified Flag is set on this Operand.

Definition at line 155 of file R600InstrInfo.cpp.

References getOperandIdx(), and isLDSInstr().

Returns:
true if MBBI can be moved into a new basic.

Definition at line 84 of file R600InstrInfo.cpp.

References I, llvm::R600RegisterInfo::isPhysRegLiveAcrossClauses(), and llvm::TargetRegisterInfo::isVirtualRegister().

unsigned R600InstrInfo::isLegalUpTo ( const std::vector< std::vector< std::pair< int, unsigned > > > &  IGSrcs,
const std::vector< R600InstrInfo::BankSwizzle > &  Swz,
const std::vector< std::pair< int, unsigned > > &  TransSrcs,
R600InstrInfo::BankSwizzle  TransSwz 
) const

returns how many MIs (whose inputs are represented by IGSrcs) can be packed in the same Instruction Group while meeting read port limitations given a Swz swizzle sequence.

Definition at line 446 of file R600InstrInfo.cpp.

References ALU_VEC_012_SCL_210, ALU_VEC_021_SCL_122, GET_REG_INDEX, getTransSwizzle(), llvm::LibFunc::memset, and Swizzle().

Referenced by FindSwizzleForVectorSlot().

bool R600InstrInfo::isMov ( unsigned  Opcode) const [override, virtual]

Implements llvm::AMDGPUInstrInfo.

Definition at line 95 of file R600InstrInfo.cpp.

Definition at line 110 of file R600InstrInfo.cpp.

References llvm::NVPTXISD::RETURN.

bool R600InstrInfo::isPredicable ( MachineInstr MI) const [override]
bool R600InstrInfo::isPredicated ( const MachineInstr MI) const [override]
bool R600InstrInfo::isProfitableToDupForIfCvt ( MachineBasicBlock MBB,
unsigned  NumCyles,
const BranchProbability Probability 
) const [override]

Definition at line 952 of file R600InstrInfo.cpp.

bool R600InstrInfo::isProfitableToIfCvt ( MachineBasicBlock MBB,
unsigned  NumCyles,
unsigned  ExtraPredCycles,
const BranchProbability Probability 
) const [override]

Definition at line 933 of file R600InstrInfo.cpp.

bool R600InstrInfo::isProfitableToIfCvt ( MachineBasicBlock TMBB,
unsigned  NumTCycles,
unsigned  ExtraTCycles,
MachineBasicBlock FMBB,
unsigned  NumFCycles,
unsigned  ExtraFCycles,
const BranchProbability Probability 
) const [override]

Definition at line 941 of file R600InstrInfo.cpp.

Definition at line 960 of file R600InstrInfo.cpp.

Definition at line 118 of file R600InstrInfo.cpp.

Definition at line 181 of file R600InstrInfo.cpp.

References llvm::AMDGPUSubtarget::hasCaymanISA(), and llvm::AMDGPUInstrInfo::ST.

Referenced by isTransOnly().

Definition at line 187 of file R600InstrInfo.cpp.

References llvm::MachineInstr::getOpcode(), and isTransOnly().

Definition at line 40 of file R600InstrInfo.cpp.

References llvm::MachineInstr::getOpcode(), and R600_InstFlag::TRIG.

Vector instructions are instructions that must fill all instruction slots within an instruction group.

Definition at line 44 of file R600InstrInfo.cpp.

References llvm::MachineInstr::getOpcode(), and R600_InstFlag::VECTOR.

Referenced by canBeConsideredALU(), and isPredicable().

Definition at line 191 of file R600InstrInfo.cpp.

Referenced by isVectorOnly().

Definition at line 195 of file R600InstrInfo.cpp.

References llvm::MachineInstr::getOpcode(), and isVectorOnly().

Definition at line 226 of file R600InstrInfo.cpp.

void R600InstrInfo::setImmOperand ( MachineInstr MI,
unsigned  Op,
int64_t  Imm 
) const

Reimplemented from llvm::AMDGPUInstrInfo.

Definition at line 1008 of file R600InstrInfo.cpp.


The documentation for this class was generated from the following files: