14 #ifndef LLVM_TARGET_TARGETINSTRINFO_H
15 #define LLVM_TARGET_TARGETINSTRINFO_H
24 class InstrItineraryData;
27 class MachineMemOperand;
28 class MachineRegisterInfo;
33 class ScheduleHazardRecognizer;
36 class TargetRegisterClass;
37 class TargetRegisterInfo;
38 class BranchProbability;
40 template<
class T>
class SmallVectorImpl;
52 : CallFrameSetupOpcode(CFSetupOpcode),
53 CallFrameDestroyOpcode(CFDestroyOpcode) {
73 isReallyTriviallyReMaterializableGeneric(MI, AA)));
94 bool isReallyTriviallyReMaterializableGeneric(
const MachineInstr *
MI,
114 unsigned &SrcReg,
unsigned &DstReg,
115 unsigned &SubIdx)
const {
180 int &SrcFrameIndex)
const {
198 unsigned &Size,
unsigned &Offset,
208 unsigned DestReg,
unsigned SubIdx,
245 bool NewMI =
false)
const;
251 unsigned &SrcOpIdx2)
const;
290 bool AllowModify =
false)
const {
339 unsigned ExtraPredCycles,
352 unsigned NumTCycles,
unsigned ExtraTCycles,
354 unsigned NumFCycles,
unsigned ExtraFCycles,
406 unsigned TrueReg,
unsigned FalseReg,
408 int &TrueCycles,
int &FalseCycles)
const {
432 unsigned TrueReg,
unsigned FalseReg)
const {
456 unsigned &TrueOp,
unsigned &FalseOp,
457 bool &Optimizable)
const {
458 assert(MI && MI->
getDesc().
isSelect() &&
"MI must be a select instruction");
476 bool PreferFalse =
false)
const {
491 unsigned DestReg,
unsigned SrcReg,
492 bool KillSrc)
const {
507 "TargetInstrInfo::storeRegToStackSlot!");
520 "TargetInstrInfo::loadRegFromStackSlot!");
582 unsigned Reg,
bool UnfoldLoad,
bool UnfoldStore,
599 bool UnfoldLoad,
bool UnfoldStore,
600 unsigned *LoadRegIndex = 0)
const {
610 int64_t &Offset1, int64_t &Offset2)
const {
623 int64_t Offset1, int64_t Offset2,
624 unsigned NumLoads)
const {
630 unsigned &BaseReg,
unsigned &Offset,
639 unsigned NumLoads)
const {
698 std::vector<MachineOperand> &Pred)
const {
757 unsigned &SrcReg,
unsigned &SrcReg2,
758 int &Mask,
int &
Value)
const {
766 unsigned SrcReg,
unsigned SrcReg2,
781 unsigned &FoldAsLoadDefReg,
813 SDNode *DefNode,
unsigned DefIdx,
814 SDNode *UseNode,
unsigned UseIdx)
const;
827 unsigned UseIdx)
const;
841 unsigned *PredCost = 0)
const;
903 virtual std::pair<uint16_t, uint16_t>
905 return std::make_pair(0, 0);
1010 int CallFrameSetupOpcode, CallFrameDestroyOpcode;
virtual MachineInstr * duplicate(MachineInstr *Orig, MachineFunction &MF) const
virtual ScheduleHazardRecognizer * CreateTargetMIHazardRecognizer(const InstrItineraryData *, const ScheduleDAG *DAG) const
virtual bool getLdStBaseRegImmOfs(MachineInstr *LdSt, unsigned &BaseReg, unsigned &Offset, const TargetRegisterInfo *TRI) const
Get the base register and byte offset of a load/store instr.
virtual MachineInstr * optimizeSelect(MachineInstr *MI, bool PreferFalse=false) const
virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, const BranchProbability &Probability) const
virtual bool hasStoreToStackSlot(const MachineInstr *MI, const MachineMemOperand *&MMO, int &FrameIndex) const
virtual void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DstReg, const SmallVectorImpl< MachineOperand > &Cond, unsigned TrueReg, unsigned FalseReg) const
virtual bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, unsigned &SrcReg2, int &Mask, int &Value) const
unsigned computeOperandLatency(const InstrItineraryData *ItinData, const MachineInstr *DefMI, unsigned DefIdx, const MachineInstr *UseMI, unsigned UseIdx) const
virtual void breakPartialRegDependency(MachineBasicBlock::iterator MI, unsigned OpNum, const TargetRegisterInfo *TRI) const
virtual bool hasLoadFromStackSlot(const MachineInstr *MI, const MachineMemOperand *&MMO, int &FrameIndex) const
bool usePreRAHazardRecognizer() const
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
virtual ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *, const ScheduleDAG *DAG) const
virtual unsigned getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore, unsigned *LoadRegIndex=0) const
const MCInstrDesc & getDesc() const
virtual bool isSchedulingBoundary(const MachineInstr *MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
int getCallFrameSetupOpcode() const
virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const
virtual void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, const TargetRegisterInfo &TRI) const
bool isRematerializable() const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops, MachineInstr *LoadMI) const
MachineInstr * foldMemoryOperand(MachineBasicBlock::iterator MI, const SmallVectorImpl< unsigned > &Ops, int FrameIndex) const
virtual bool DefinesPredicate(MachineInstr *MI, std::vector< MachineOperand > &Pred) const
virtual unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
virtual bool hasHighOperandLatency(const InstrItineraryData *ItinData, const MachineRegisterInfo *MRI, const MachineInstr *DefMI, unsigned DefIdx, const MachineInstr *UseMI, unsigned UseIdx) const
virtual unsigned getPredicationCost(const MachineInstr *MI) const
virtual unsigned isStoreToStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
#define llvm_unreachable(msg)
virtual bool SubsumesPredicate(const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const
virtual unsigned getPartialRegUpdateClearance(const MachineInstr *MI, unsigned OpNum, const TargetRegisterInfo *TRI) const
bool isPredicable() const
Return true if this instruction has a predicate operand that controls execution. It may be set to 'al...
virtual bool analyzeSelect(const MachineInstr *MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const
virtual MachineInstr * commuteInstruction(MachineInstr *MI, bool NewMI=false) const
virtual void getNoopForMachoTarget(MCInst &NopInst) const
getNoopForMachoTarget - Return the noop instruction to use for a noop.
virtual bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, unsigned &Size, unsigned &Offset, const TargetMachine *TM) const
virtual bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
virtual bool enableClusterLoads() const
virtual DFAPacketizer * CreateTargetScheduleState(const TargetMachine *, const ScheduleDAG *) const
Create machine specific model for scheduling.
bundle_iterator< MachineInstr, instr_iterator > iterator
virtual bool hasLowDefLatency(const InstrItineraryData *ItinData, const MachineInstr *DefMI, unsigned DefIdx) const
virtual bool isStackSlotCopy(const MachineInstr *MI, int &DestFrameIndex, int &SrcFrameIndex) const
virtual bool produceSameValue(const MachineInstr *MI0, const MachineInstr *MI1, const MachineRegisterInfo *MRI=0) const
virtual MachineInstr * optimizeLoadInstr(MachineInstr *MI, const MachineRegisterInfo *MRI, unsigned &FoldAsLoadDefReg, MachineInstr *&DefMI) const
virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
virtual unsigned getUndefRegClearance(const MachineInstr *MI, unsigned &OpNum, const TargetRegisterInfo *TRI) const
Return the minimum clearance before an instruction that reads an unused register. ...
virtual unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
virtual bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI, unsigned Reg, bool UnfoldLoad, bool UnfoldStore, SmallVectorImpl< MachineInstr * > &NewMIs) const
virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumTCycles, unsigned ExtraTCycles, MachineBasicBlock &FMBB, unsigned NumFCycles, unsigned ExtraFCycles, const BranchProbability &Probability) const
virtual bool shouldClusterLoads(MachineInstr *FirstLdSt, MachineInstr *SecondLdSt, unsigned NumLoads) const
TargetInstrInfo(int CFSetupOpcode=-1, int CFDestroyOpcode=-1)
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
virtual void setExecutionDomain(MachineInstr *MI, unsigned Domain) const
bool isZeroCost(unsigned Opcode) const
virtual bool PredicateInstruction(MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const
virtual bool isReallyTriviallyReMaterializable(const MachineInstr *MI, AliasAnalysis *AA) const
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
virtual bool findCommutedOpIndices(MachineInstr *MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const
virtual ~TargetInstrInfo()
virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, const MachineInstr *MI) const
virtual MachineInstr * convertToThreeAddress(MachineFunction::iterator &MFI, MachineBasicBlock::iterator &MBBI, LiveVariables *LV) const
virtual bool verifyInstruction(const MachineInstr *MI, StringRef &ErrInfo) const
verifyInstruction - Perform target specific instruction verification.
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const
virtual bool isPredicable(MachineInstr *MI) const
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
#define LLVM_DELETED_FUNCTION
unsigned defaultDefLatency(const MCSchedModel *SchedModel, const MachineInstr *DefMI) const
Return the default expected latency for a def based on it's opcode.
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
virtual unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr *MI, unsigned *PredCost=0) const
virtual ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetMachine *TM, const ScheduleDAG *DAG) const
virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
virtual bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N, SmallVectorImpl< SDNode * > &NewNodes) const
virtual unsigned getInlineAsmLength(const char *Str, const MCAsmInfo &MAI) const
virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI, unsigned Reg, MachineRegisterInfo *MRI) const
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, const BranchProbability &Probability) const
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
IMPLICIT_DEF - This is the MachineInstr-level equivalent of undef.
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops, int FrameIndex) const
virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, int Mask, int Value, const MachineRegisterInfo *MRI) const
virtual bool canFoldMemoryOperand(const MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops) const
virtual int getOperandLatency(const InstrItineraryData *ItinData, SDNode *DefNode, unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const
virtual bool canInsertSelect(const MachineBasicBlock &MBB, const SmallVectorImpl< MachineOperand > &Cond, unsigned TrueReg, unsigned FalseReg, int &CondCycles, int &TrueCycles, int &FalseCycles) const
bool isSelect() const
Return true if this is a select instruction.
bool isTriviallyReMaterializable(const MachineInstr *MI, AliasAnalysis *AA=0) const
LLVM Value Representation.
int computeDefOperandLatency(const InstrItineraryData *ItinData, const MachineInstr *DefMI) const
virtual std::pair< uint16_t, uint16_t > getExecutionDomain(const MachineInstr *MI) const
virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const
BasicBlockListType::iterator iterator
virtual bool isPredicated(const MachineInstr *MI) const
virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const
const TargetRegisterClass * getRegClass(const MCInstrDesc &TID, unsigned OpNum, const TargetRegisterInfo *TRI, const MachineFunction &MF) const
const MCRegisterInfo & MRI
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
int getCallFrameDestroyOpcode() const
virtual bool shouldScheduleAdjacent(MachineInstr *First, MachineInstr *Second) const
Can this target fuse the given instructions if they are scheduled adjacent.
virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const
virtual bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg, unsigned &SubIdx) const
virtual bool isHighLatencyDef(int opc) const