12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- #ifndef LLVM_CODEGEN_TARGETINSTRINFO_H
- #define LLVM_CODEGEN_TARGETINSTRINFO_H
- #include "llvm/ADT/ArrayRef.h"
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ADT/DenseMapInfo.h"
- #include "llvm/ADT/Uniformity.h"
- #include "llvm/CodeGen/MIRFormatter.h"
- #include "llvm/CodeGen/MachineBasicBlock.h"
- #include "llvm/CodeGen/MachineFunction.h"
- #include "llvm/CodeGen/MachineInstr.h"
- #include "llvm/CodeGen/MachineInstrBuilder.h"
- #include "llvm/CodeGen/MachineOperand.h"
- #include "llvm/CodeGen/MachineOutliner.h"
- #include "llvm/CodeGen/RegisterClassInfo.h"
- #include "llvm/CodeGen/VirtRegMap.h"
- #include "llvm/MC/MCInstrInfo.h"
- #include "llvm/Support/BranchProbability.h"
- #include "llvm/Support/ErrorHandling.h"
- #include <cassert>
- #include <cstddef>
- #include <cstdint>
- #include <utility>
- #include <vector>
- namespace llvm {
- class DFAPacketizer;
- class InstrItineraryData;
- class LiveIntervals;
- class LiveVariables;
- class MachineLoop;
- class MachineMemOperand;
- class MachineRegisterInfo;
- class MCAsmInfo;
- class MCInst;
- struct MCSchedModel;
- class Module;
- class ScheduleDAG;
- class ScheduleDAGMI;
- class ScheduleHazardRecognizer;
- class SDNode;
- class SelectionDAG;
- class SMSchedule;
- class SwingSchedulerDAG;
- class RegScavenger;
- class TargetRegisterClass;
- class TargetRegisterInfo;
- class TargetSchedModel;
- class TargetSubtargetInfo;
- enum class MachineCombinerPattern;
- template <class T> class SmallVectorImpl;
- using ParamLoadedValue = std::pair<MachineOperand, DIExpression*>;
- struct DestSourcePair {
- const MachineOperand *Destination;
- const MachineOperand *Source;
- DestSourcePair(const MachineOperand &Dest, const MachineOperand &Src)
- : Destination(&Dest), Source(&Src) {}
- };
- struct RegImmPair {
- Register Reg;
- int64_t Imm;
- RegImmPair(Register Reg, int64_t Imm) : Reg(Reg), Imm(Imm) {}
- };
- struct ExtAddrMode {
- Register BaseReg;
- Register ScaledReg;
- int64_t Scale;
- int64_t Displacement;
- };
- class TargetInstrInfo : public MCInstrInfo {
- public:
- TargetInstrInfo(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u,
- unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u)
- : CallFrameSetupOpcode(CFSetupOpcode),
- CallFrameDestroyOpcode(CFDestroyOpcode), CatchRetOpcode(CatchRetOpcode),
- ReturnOpcode(ReturnOpcode) {}
- TargetInstrInfo(const TargetInstrInfo &) = delete;
- TargetInstrInfo &operator=(const TargetInstrInfo &) = delete;
- virtual ~TargetInstrInfo();
- static bool isGenericOpcode(unsigned Opc) {
- return Opc <= TargetOpcode::GENERIC_OP_END;
- }
- static bool isGenericAtomicRMWOpcode(unsigned Opc) {
- return Opc >= TargetOpcode::GENERIC_ATOMICRMW_OP_START &&
- Opc <= TargetOpcode::GENERIC_ATOMICRMW_OP_END;
- }
-
-
- virtual
- const TargetRegisterClass *getRegClass(const MCInstrDesc &MCID, unsigned OpNum,
- const TargetRegisterInfo *TRI,
- const MachineFunction &MF) const;
-
-
-
-
-
- bool isTriviallyReMaterializable(const MachineInstr &MI) const {
- return MI.getOpcode() == TargetOpcode::IMPLICIT_DEF ||
- (MI.getDesc().isRematerializable() &&
- (isReallyTriviallyReMaterializable(MI) ||
- isReallyTriviallyReMaterializableGeneric(MI)));
- }
-
-
- virtual bool isIgnorableUse(const MachineOperand &MO) const {
- return false;
- }
- protected:
-
-
-
-
-
-
-
- virtual bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual MachineInstr *commuteInstructionImpl(MachineInstr &MI, bool NewMI,
- unsigned OpIdx1,
- unsigned OpIdx2) const;
-
-
-
-
-
-
-
-
-
-
- static bool fixCommutedOpIndices(unsigned &ResultIdx1, unsigned &ResultIdx2,
- unsigned CommutableOpIdx1,
- unsigned CommutableOpIdx2);
- private:
-
-
-
-
- bool isReallyTriviallyReMaterializableGeneric(const MachineInstr &MI) const;
- public:
-
-
-
-
-
- unsigned getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
- unsigned getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
-
- bool isFrameInstr(const MachineInstr &I) const {
- return I.getOpcode() == getCallFrameSetupOpcode() ||
- I.getOpcode() == getCallFrameDestroyOpcode();
- }
-
- bool isFrameSetup(const MachineInstr &I) const {
- return I.getOpcode() == getCallFrameSetupOpcode();
- }
-
-
-
-
-
-
-
-
- int64_t getFrameSize(const MachineInstr &I) const {
- assert(isFrameInstr(I) && "Not a frame instruction");
- assert(I.getOperand(0).getImm() >= 0);
- return I.getOperand(0).getImm();
- }
-
-
-
- int64_t getFrameTotalSize(const MachineInstr &I) const {
- if (isFrameSetup(I)) {
- assert(I.getOperand(1).getImm() >= 0 &&
- "Frame size must not be negative");
- return getFrameSize(I) + I.getOperand(1).getImm();
- }
- return getFrameSize(I);
- }
- unsigned getCatchReturnOpcode() const { return CatchRetOpcode; }
- unsigned getReturnOpcode() const { return ReturnOpcode; }
-
-
-
-
- virtual int getSPAdjust(const MachineInstr &MI) const;
-
-
-
-
-
- virtual bool isCoalescableExtInstr(const MachineInstr &MI, Register &SrcReg,
- Register &DstReg, unsigned &SubIdx) const {
- return false;
- }
-
-
-
-
-
- virtual unsigned isLoadFromStackSlot(const MachineInstr &MI,
- int &FrameIndex) const {
- return 0;
- }
-
-
-
-
- virtual unsigned isLoadFromStackSlot(const MachineInstr &MI,
- int &FrameIndex,
- unsigned &MemBytes) const {
- MemBytes = 0;
- return isLoadFromStackSlot(MI, FrameIndex);
- }
-
-
- virtual unsigned isLoadFromStackSlotPostFE(const MachineInstr &MI,
- int &FrameIndex) const {
- return 0;
- }
-
-
-
-
-
-
- virtual bool hasLoadFromStackSlot(
- const MachineInstr &MI,
- SmallVectorImpl<const MachineMemOperand *> &Accesses) const;
-
-
-
-
-
- virtual unsigned isStoreToStackSlot(const MachineInstr &MI,
- int &FrameIndex) const {
- return 0;
- }
-
-
-
-
- virtual unsigned isStoreToStackSlot(const MachineInstr &MI,
- int &FrameIndex,
- unsigned &MemBytes) const {
- MemBytes = 0;
- return isStoreToStackSlot(MI, FrameIndex);
- }
-
-
- virtual unsigned isStoreToStackSlotPostFE(const MachineInstr &MI,
- int &FrameIndex) const {
- return 0;
- }
-
-
-
-
-
-
- virtual bool hasStoreToStackSlot(
- const MachineInstr &MI,
- SmallVectorImpl<const MachineMemOperand *> &Accesses) const;
-
-
-
- virtual bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex,
- int &SrcFrameIndex) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx,
- unsigned &Size, unsigned &Offset,
- const MachineFunction &MF) const;
-
-
- bool isUnspillableTerminator(const MachineInstr *MI) const {
- return MI->isTerminator() && isUnspillableTerminatorImpl(MI);
- }
-
-
- virtual unsigned getInstSizeInBytes(const MachineInstr &MI) const {
- return ~0U;
- }
-
-
-
-
- virtual bool isAsCheapAsAMove(const MachineInstr &MI) const {
- return MI.isAsCheapAsAMove();
- }
-
-
-
-
-
- virtual bool shouldSink(const MachineInstr &MI) const { return true; }
-
-
-
-
-
-
- virtual bool shouldHoist(const MachineInstr &MI,
- const MachineLoop *FromLoop) const {
- return true;
- }
-
-
-
-
-
- virtual void reMaterialize(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI, Register DestReg,
- unsigned SubIdx, const MachineInstr &Orig,
- const TargetRegisterInfo &TRI) const;
-
-
-
-
-
- virtual MachineInstr &duplicate(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator InsertBefore,
- const MachineInstr &Orig) const;
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual MachineInstr *convertToThreeAddress(MachineInstr &MI,
- LiveVariables *LV,
- LiveIntervals *LIS) const {
- return nullptr;
- }
-
-
-
-
- static const unsigned CommuteAnyOperandIndex = ~0U;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MachineInstr *
- commuteInstruction(MachineInstr &MI, bool NewMI = false,
- unsigned OpIdx1 = CommuteAnyOperandIndex,
- unsigned OpIdx2 = CommuteAnyOperandIndex) const;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool findCommutedOpIndices(const MachineInstr &MI,
- unsigned &SrcOpIdx1,
- unsigned &SrcOpIdx2) const;
-
-
-
- virtual bool hasCommutePreference(MachineInstr &MI, bool &Commute) const {
- return false;
- }
-
-
- struct RegSubRegPair {
- Register Reg;
- unsigned SubReg;
- RegSubRegPair(Register Reg = Register(), unsigned SubReg = 0)
- : Reg(Reg), SubReg(SubReg) {}
- bool operator==(const RegSubRegPair& P) const {
- return Reg == P.Reg && SubReg == P.SubReg;
- }
- bool operator!=(const RegSubRegPair& P) const {
- return !(*this == P);
- }
- };
-
-
-
- struct RegSubRegPairAndIdx : RegSubRegPair {
- unsigned SubIdx;
- RegSubRegPairAndIdx(Register Reg = Register(), unsigned SubReg = 0,
- unsigned SubIdx = 0)
- : RegSubRegPair(Reg, SubReg), SubIdx(SubIdx) {}
- };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool
- getRegSequenceInputs(const MachineInstr &MI, unsigned DefIdx,
- SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool getExtractSubregInputs(const MachineInstr &MI, unsigned DefIdx,
- RegSubRegPairAndIdx &InputReg) const;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool getInsertSubregInputs(const MachineInstr &MI, unsigned DefIdx,
- RegSubRegPair &BaseReg,
- RegSubRegPairAndIdx &InsertedReg) const;
-
-
-
-
-
- virtual bool produceSameValue(const MachineInstr &MI0,
- const MachineInstr &MI1,
- const MachineRegisterInfo *MRI = nullptr) const;
-
-
- virtual bool isBranchOffsetInRange(unsigned BranchOpc,
- int64_t BrOffset) const {
- llvm_unreachable("target did not implement");
- }
-
- virtual MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const {
- llvm_unreachable("target did not implement");
- }
-
-
-
-
- virtual void insertIndirectBranch(MachineBasicBlock &MBB,
- MachineBasicBlock &NewDestBB,
- MachineBasicBlock &RestoreBB,
- const DebugLoc &DL, int64_t BrOffset = 0,
- RegScavenger *RS = nullptr) const {
- llvm_unreachable("target did not implement");
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
- MachineBasicBlock *&FBB,
- SmallVectorImpl<MachineOperand> &Cond,
- bool AllowModify = false) const {
- return true;
- }
-
-
-
-
-
-
- struct MachineBranchPredicate {
- enum ComparePredicate {
- PRED_EQ,
- PRED_NE,
- PRED_INVALID
- };
- ComparePredicate Predicate = PRED_INVALID;
- MachineOperand LHS = MachineOperand::CreateImm(0);
- MachineOperand RHS = MachineOperand::CreateImm(0);
- MachineBasicBlock *TrueDest = nullptr;
- MachineBasicBlock *FalseDest = nullptr;
- MachineInstr *ConditionDef = nullptr;
-
-
-
- bool SingleUseCondition = false;
- explicit MachineBranchPredicate() = default;
- };
-
-
-
-
-
-
-
- virtual bool analyzeBranchPredicate(MachineBasicBlock &MBB,
- MachineBranchPredicate &MBP,
- bool AllowModify = false) const {
- return true;
- }
-
-
-
-
-
- virtual unsigned removeBranch(MachineBasicBlock &MBB,
- int *BytesRemoved = nullptr) const {
- llvm_unreachable("Target didn't implement TargetInstrInfo::removeBranch!");
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
- MachineBasicBlock *FBB,
- ArrayRef<MachineOperand> Cond,
- const DebugLoc &DL,
- int *BytesAdded = nullptr) const {
- llvm_unreachable("Target didn't implement TargetInstrInfo::insertBranch!");
- }
- unsigned insertUnconditionalBranch(MachineBasicBlock &MBB,
- MachineBasicBlock *DestBB,
- const DebugLoc &DL,
- int *BytesAdded = nullptr) const {
- return insertBranch(MBB, DestBB, nullptr, ArrayRef<MachineOperand>(), DL,
- BytesAdded);
- }
-
-
-
- class PipelinerLoopInfo {
- public:
- virtual ~PipelinerLoopInfo();
-
-
-
- virtual bool shouldIgnoreForPipelining(const MachineInstr *MI) const = 0;
-
-
-
- virtual bool shouldUseSchedule(SwingSchedulerDAG &SSD, SMSchedule &SMS) {
- return true;
- }
-
-
-
-
-
-
-
-
-
-
-
- virtual std::optional<bool>
- createTripCountGreaterCondition(int TC, MachineBasicBlock &MBB,
- SmallVectorImpl<MachineOperand> &Cond) = 0;
-
-
- virtual void adjustTripCount(int TripCountAdjust) = 0;
-
- virtual void setPreheader(MachineBasicBlock *NewPreheader) = 0;
-
-
-
-
-
- virtual void disposed() = 0;
- };
-
-
- virtual std::unique_ptr<PipelinerLoopInfo>
- analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const {
- return nullptr;
- }
-
-
-
- virtual bool analyzeLoop(MachineLoop &L, MachineInstr *&IndVarInst,
- MachineInstr *&CmpInst) const {
- return true;
- }
-
-
-
-
- virtual unsigned reduceLoopCount(MachineBasicBlock &MBB,
- MachineBasicBlock &PreHeader,
- MachineInstr *IndVar, MachineInstr &Cmp,
- SmallVectorImpl<MachineOperand> &Cond,
- SmallVectorImpl<MachineInstr *> &PrevInsts,
- unsigned Iter, unsigned MaxIter) const {
- llvm_unreachable("Target didn't implement ReduceLoopCount");
- }
-
-
- virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
- MachineBasicBlock *NewDest) const;
-
-
-
- virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MBBI) const {
- return true;
- }
-
-
-
-
-
- virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles,
- unsigned ExtraPredCycles,
- BranchProbability Probability) const {
- return false;
- }
-
-
-
-
-
-
- virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumTCycles,
- unsigned ExtraTCycles,
- MachineBasicBlock &FMBB, unsigned NumFCycles,
- unsigned ExtraFCycles,
- BranchProbability Probability) const {
- return false;
- }
-
-
-
-
-
-
- virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
- unsigned NumCycles,
- BranchProbability Probability) const {
- return false;
- }
-
-
- virtual unsigned extraSizeToPredicateInstructions(const MachineFunction &MF,
- unsigned NumInsts) const {
- return 0;
- }
-
-
- virtual unsigned predictBranchSizeForIfCvt(MachineInstr &MI) const {
- return getInstSizeInBytes(MI);
- }
-
-
-
-
-
-
-
-
-
-
-
- virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB,
- MachineBasicBlock &FMBB) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool canInsertSelect(const MachineBasicBlock &MBB,
- ArrayRef<MachineOperand> Cond, Register DstReg,
- Register TrueReg, Register FalseReg,
- int &CondCycles, int &TrueCycles,
- int &FalseCycles) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual void insertSelect(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator I, const DebugLoc &DL,
- Register DstReg, ArrayRef<MachineOperand> Cond,
- Register TrueReg, Register FalseReg) const {
- llvm_unreachable("Target didn't implement TargetInstrInfo::insertSelect!");
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool analyzeSelect(const MachineInstr &MI,
- SmallVectorImpl<MachineOperand> &Cond,
- unsigned &TrueOp, unsigned &FalseOp,
- bool &Optimizable) const {
- assert(MI.getDesc().isSelect() && "MI must be a select instruction");
- return true;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual MachineInstr *optimizeSelect(MachineInstr &MI,
- SmallPtrSetImpl<MachineInstr *> &NewMIs,
- bool PreferFalse = false) const {
-
- llvm_unreachable("Target must implement TargetInstrInfo::optimizeSelect!");
- }
-
-
-
-
-
-
-
-
- virtual void copyPhysReg(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI, const DebugLoc &DL,
- MCRegister DestReg, MCRegister SrcReg,
- bool KillSrc) const {
- llvm_unreachable("Target didn't implement TargetInstrInfo::copyPhysReg!");
- }
-
-
-
-
-
-
-
-
-
- virtual bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const {
- return false;
- }
- protected:
-
-
-
-
- virtual std::optional<DestSourcePair>
- isCopyInstrImpl(const MachineInstr &MI) const {
- return std::nullopt;
- }
-
-
-
-
-
-
-
- virtual bool isUnspillableTerminatorImpl(const MachineInstr *MI) const {
- return false;
- }
- public:
-
-
-
-
-
-
- std::optional<DestSourcePair> isCopyInstr(const MachineInstr &MI) const {
- if (MI.isCopy()) {
- return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
- }
- return isCopyInstrImpl(MI);
- }
-
-
-
-
- virtual std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
- Register Reg) const {
- return std::nullopt;
- }
-
-
-
- virtual bool getConstValDefinedInReg(const MachineInstr &MI,
- const Register Reg,
- int64_t &ImmVal) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
- virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI,
- Register SrcReg, bool isKill, int FrameIndex,
- const TargetRegisterClass *RC,
- const TargetRegisterInfo *TRI,
- Register VReg) const {
- llvm_unreachable("Target didn't implement "
- "TargetInstrInfo::storeRegToStackSlot!");
- }
-
-
-
-
-
-
-
-
- virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI,
- Register DestReg, int FrameIndex,
- const TargetRegisterClass *RC,
- const TargetRegisterInfo *TRI,
- Register VReg) const {
- llvm_unreachable("Target didn't implement "
- "TargetInstrInfo::loadRegFromStackSlot!");
- }
-
-
-
-
-
-
- virtual bool expandPostRAPseudo(MachineInstr &MI) const { return false; }
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool isSubregFoldable() const { return false; }
-
-
-
-
-
-
-
- virtual std::pair<unsigned, unsigned>
- getPatchpointUnfoldableRange(const MachineInstr &MI) const;
-
-
-
-
-
-
-
-
- MachineInstr *foldMemoryOperand(MachineInstr &MI, ArrayRef<unsigned> Ops,
- int FI,
- LiveIntervals *LIS = nullptr,
- VirtRegMap *VRM = nullptr) const;
-
-
- MachineInstr *foldMemoryOperand(MachineInstr &MI, ArrayRef<unsigned> Ops,
- MachineInstr &LoadMI,
- LiveIntervals *LIS = nullptr) const;
-
-
-
-
-
-
-
- virtual bool
- getMachineCombinerPatterns(MachineInstr &Root,
- SmallVectorImpl<MachineCombinerPattern> &Patterns,
- bool DoRegPressureReduce) const;
-
-
- virtual bool
- shouldReduceRegisterPressure(const MachineBasicBlock *MBB,
- const RegisterClassInfo *RegClassInfo) const {
- return false;
- }
-
- virtual void
- finalizeInsInstrs(MachineInstr &Root, MachineCombinerPattern &P,
- SmallVectorImpl<MachineInstr *> &InsInstrs) const {}
-
-
-
- virtual bool isThroughputPattern(MachineCombinerPattern Pattern) const;
-
-
-
-
-
- bool isReassociationCandidate(const MachineInstr &Inst, bool &Commuted) const;
-
-
- virtual bool isAssociativeAndCommutative(const MachineInstr &Inst,
- bool Invert = false) const {
- return false;
- }
-
-
- virtual std::optional<unsigned> getInverseOpcode(unsigned Opcode) const {
- return std::nullopt;
- }
-
- bool areOpcodesEqualOrInverse(unsigned Opcode1, unsigned Opcode2) const;
-
- virtual bool hasReassociableOperands(const MachineInstr &Inst,
- const MachineBasicBlock *MBB) const;
-
- virtual bool hasReassociableSibling(const MachineInstr &Inst,
- bool &Commuted) const;
-
-
-
-
-
-
-
-
-
-
- virtual void genAlternativeCodeSequence(
- MachineInstr &Root, MachineCombinerPattern Pattern,
- SmallVectorImpl<MachineInstr *> &InsInstrs,
- SmallVectorImpl<MachineInstr *> &DelInstrs,
- DenseMap<unsigned, unsigned> &InstIdxForVirtReg) const;
-
-
- void reassociateOps(MachineInstr &Root, MachineInstr &Prev,
- MachineCombinerPattern Pattern,
- SmallVectorImpl<MachineInstr *> &InsInstrs,
- SmallVectorImpl<MachineInstr *> &DelInstrs,
- DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) const;
-
-
-
-
- std::pair<unsigned, unsigned>
- getReassociationOpcodes(MachineCombinerPattern Pattern,
- const MachineInstr &Root,
- const MachineInstr &Prev) const;
-
- virtual int getExtendResourceLenLimit() const { return 0; }
-
-
- virtual void setSpecialOperandAttr(MachineInstr &OldMI1, MachineInstr &OldMI2,
- MachineInstr &NewMI1,
- MachineInstr &NewMI2) const {}
-
- virtual bool useMachineCombiner() const { return false; }
-
-
- virtual bool canCopyGluedNodeDuringSchedule(SDNode *N) const { return false; }
- protected:
-
-
-
-
-
- virtual MachineInstr *
- foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI,
- ArrayRef<unsigned> Ops,
- MachineBasicBlock::iterator InsertPt, int FrameIndex,
- LiveIntervals *LIS = nullptr,
- VirtRegMap *VRM = nullptr) const {
- return nullptr;
- }
-
-
-
-
-
- virtual MachineInstr *foldMemoryOperandImpl(
- MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops,
- MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI,
- LiveIntervals *LIS = nullptr) const {
- return nullptr;
- }
-
-
-
-
-
-
-
-
- virtual bool getRegSequenceLikeInputs(
- const MachineInstr &MI, unsigned DefIdx,
- SmallVectorImpl<RegSubRegPairAndIdx> &InputRegs) const {
- return false;
- }
-
-
-
-
-
-
-
-
- virtual bool getExtractSubregLikeInputs(const MachineInstr &MI,
- unsigned DefIdx,
- RegSubRegPairAndIdx &InputReg) const {
- return false;
- }
-
-
-
-
-
-
-
-
- virtual bool
- getInsertSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx,
- RegSubRegPair &BaseReg,
- RegSubRegPairAndIdx &InsertedReg) const {
- return false;
- }
- public:
-
-
-
- virtual bool
- unfoldMemoryOperand(MachineFunction &MF, MachineInstr &MI, unsigned Reg,
- bool UnfoldLoad, bool UnfoldStore,
- SmallVectorImpl<MachineInstr *> &NewMIs) const {
- return false;
- }
- virtual bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
- SmallVectorImpl<SDNode *> &NewNodes) const {
- return false;
- }
-
-
-
-
-
-
- virtual unsigned
- getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore,
- unsigned *LoadRegIndex = nullptr) const {
- return 0;
- }
-
-
-
-
- virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2,
- int64_t &Offset1,
- int64_t &Offset2) const {
- return false;
- }
-
-
-
-
-
-
-
-
- virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,
- int64_t Offset1, int64_t Offset2,
- unsigned NumLoads) const {
- return false;
- }
-
-
-
- bool getMemOperandWithOffset(const MachineInstr &MI,
- const MachineOperand *&BaseOp, int64_t &Offset,
- bool &OffsetIsScalable,
- const TargetRegisterInfo *TRI) const;
-
-
-
-
-
-
-
- virtual bool getMemOperandsWithOffsetWidth(
- const MachineInstr &MI, SmallVectorImpl<const MachineOperand *> &BaseOps,
- int64_t &Offset, bool &OffsetIsScalable, unsigned &Width,
- const TargetRegisterInfo *TRI) const {
- return false;
- }
-
-
-
- virtual bool getBaseAndOffsetPosition(const MachineInstr &MI,
- unsigned &BasePos,
- unsigned &OffsetPos) const {
- return false;
- }
-
-
-
-
- virtual std::optional<ExtAddrMode>
- getAddrModeFromMemoryOp(const MachineInstr &MemI,
- const TargetRegisterInfo *TRI) const {
- return std::nullopt;
- }
-
-
-
-
-
- virtual bool preservesZeroValueInReg(const MachineInstr *MI,
- const Register NullValueReg,
- const TargetRegisterInfo *TRI) const {
- return false;
- }
-
- virtual bool getIncrementValue(const MachineInstr &MI, int &Value) const {
- return false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool shouldClusterMemOps(ArrayRef<const MachineOperand *> BaseOps1,
- ArrayRef<const MachineOperand *> BaseOps2,
- unsigned NumLoads, unsigned NumBytes) const {
- llvm_unreachable("target did not implement shouldClusterMemOps()");
- }
-
-
- virtual bool
- reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
- return true;
- }
-
- virtual void insertNoop(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI) const;
-
- virtual void insertNoops(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator MI,
- unsigned Quantity) const;
-
- virtual MCInst getNop() const;
-
- virtual bool isPostIncrement(const MachineInstr &MI) const { return false; }
-
- virtual bool isPredicated(const MachineInstr &MI) const { return false; }
-
-
- virtual bool canPredicatePredicatedInstr(const MachineInstr &MI) const {
- assert(isPredicated(MI) && "Instruction is not predicated");
- return false;
- }
-
- virtual std::string
- createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op,
- unsigned OpIdx, const TargetRegisterInfo *TRI) const;
-
-
- bool isUnpredicatedTerminator(const MachineInstr &MI) const;
-
- virtual bool isUnconditionalTailCall(const MachineInstr &MI) const {
- return false;
- }
-
- virtual bool canMakeTailCallConditional(SmallVectorImpl<MachineOperand> &Cond,
- const MachineInstr &TailCall) const {
- return false;
- }
-
- virtual void replaceBranchWithTailCall(MachineBasicBlock &MBB,
- SmallVectorImpl<MachineOperand> &Cond,
- const MachineInstr &TailCall) const {
- llvm_unreachable("Target didn't implement replaceBranchWithTailCall!");
- }
-
-
- virtual bool PredicateInstruction(MachineInstr &MI,
- ArrayRef<MachineOperand> Pred) const;
-
-
- virtual bool SubsumesPredicate(ArrayRef<MachineOperand> Pred1,
- ArrayRef<MachineOperand> Pred2) const {
- return false;
- }
-
-
-
-
-
-
-
- virtual bool ClobbersPredicate(MachineInstr &MI,
- std::vector<MachineOperand> &Pred,
- bool SkipDead) const {
- return false;
- }
-
-
-
- virtual bool isPredicable(const MachineInstr &MI) const {
- return MI.getDesc().isPredicable();
- }
-
-
- virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const {
- return true;
- }
-
-
- virtual bool isSchedulingBoundary(const MachineInstr &MI,
- const MachineBasicBlock *MBB,
- const MachineFunction &MF) const;
-
-
- virtual unsigned getInlineAsmLength(
- const char *Str, const MCAsmInfo &MAI,
- const TargetSubtargetInfo *STI = nullptr) const;
-
-
- virtual ScheduleHazardRecognizer *
- CreateTargetHazardRecognizer(const TargetSubtargetInfo *STI,
- const ScheduleDAG *DAG) const;
-
-
- virtual ScheduleHazardRecognizer *
- CreateTargetMIHazardRecognizer(const InstrItineraryData *,
- const ScheduleDAGMI *DAG) const;
-
-
- virtual ScheduleHazardRecognizer *
- CreateTargetPostRAHazardRecognizer(const InstrItineraryData *,
- const ScheduleDAG *DAG) const;
-
-
- virtual ScheduleHazardRecognizer *
- CreateTargetPostRAHazardRecognizer(const MachineFunction &MF) const {
- return nullptr;
- }
-
-
- bool usePreRAHazardRecognizer() const;
-
-
-
-
- virtual bool analyzeCompare(const MachineInstr &MI, Register &SrcReg,
- Register &SrcReg2, int64_t &Mask,
- int64_t &Value) const {
- return false;
- }
-
-
-
- virtual bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
- Register SrcReg2, int64_t Mask,
- int64_t Value,
- const MachineRegisterInfo *MRI) const {
- return false;
- }
- virtual bool optimizeCondBranch(MachineInstr &MI) const { return false; }
-
-
-
-
-
-
-
- virtual MachineInstr *optimizeLoadInstr(MachineInstr &MI,
- const MachineRegisterInfo *MRI,
- Register &FoldAsLoadDefReg,
- MachineInstr *&DefMI) const {
- return nullptr;
- }
-
-
-
-
-
-
- virtual bool FoldImmediate(MachineInstr &UseMI, MachineInstr &DefMI,
- Register Reg, MachineRegisterInfo *MRI) const {
- return false;
- }
-
-
-
-
- virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData,
- const MachineInstr &MI) const;
-
-
-
-
- bool isZeroCost(unsigned Opcode) const {
- return Opcode <= TargetOpcode::COPY;
- }
- virtual int getOperandLatency(const InstrItineraryData *ItinData,
- SDNode *DefNode, unsigned DefIdx,
- SDNode *UseNode, unsigned UseIdx) const;
-
-
-
-
-
-
-
-
- virtual int getOperandLatency(const InstrItineraryData *ItinData,
- const MachineInstr &DefMI, unsigned DefIdx,
- const MachineInstr &UseMI,
- unsigned UseIdx) const;
-
-
-
- virtual unsigned getInstrLatency(const InstrItineraryData *ItinData,
- const MachineInstr &MI,
- unsigned *PredCost = nullptr) const;
- virtual unsigned getPredicationCost(const MachineInstr &MI) const;
- virtual int getInstrLatency(const InstrItineraryData *ItinData,
- SDNode *Node) const;
-
- unsigned defaultDefLatency(const MCSchedModel &SchedModel,
- const MachineInstr &DefMI) const;
-
- virtual bool isHighLatencyDef(int opc) const { return false; }
-
-
-
-
-
- virtual bool hasHighOperandLatency(const TargetSchedModel &SchedModel,
- const MachineRegisterInfo *MRI,
- const MachineInstr &DefMI, unsigned DefIdx,
- const MachineInstr &UseMI,
- unsigned UseIdx) const {
- return false;
- }
-
-
- virtual bool hasLowDefLatency(const TargetSchedModel &SchedModel,
- const MachineInstr &DefMI,
- unsigned DefIdx) const;
-
- virtual bool verifyInstruction(const MachineInstr &MI,
- StringRef &ErrInfo) const {
- return true;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual std::pair<uint16_t, uint16_t>
- getExecutionDomain(const MachineInstr &MI) const {
- return std::make_pair(0, 0);
- }
-
-
-
-
- virtual void setExecutionDomain(MachineInstr &MI, unsigned Domain) const {}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual unsigned
- getPartialRegUpdateClearance(const MachineInstr &MI, unsigned OpNum,
- const TargetRegisterInfo *TRI) const {
-
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual unsigned getUndefRegClearance(const MachineInstr &MI, unsigned OpNum,
- const TargetRegisterInfo *TRI) const {
-
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual void breakPartialRegDependency(MachineInstr &MI, unsigned OpNum,
- const TargetRegisterInfo *TRI) const {}
-
- virtual DFAPacketizer *
- CreateTargetScheduleState(const TargetSubtargetInfo &) const {
- return nullptr;
- }
-
-
-
-
-
-
-
-
-
-
-
- virtual bool
- areMemAccessesTriviallyDisjoint(const MachineInstr &MIa,
- const MachineInstr &MIb) const {
- assert(MIa.mayLoadOrStore() &&
- "MIa must load from or modify a memory location");
- assert(MIb.mayLoadOrStore() &&
- "MIb must load from or modify a memory location");
- return false;
- }
-
-
- virtual unsigned getMachineCSELookAheadLimit() const {
-
-
- return 5;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual unsigned getMemOperandAACheckLimit() const { return 16; }
-
-
-
-
-
- virtual ArrayRef<std::pair<int, const char *>>
- getSerializableTargetIndices() const {
- return std::nullopt;
- }
-
-
- virtual std::pair<unsigned, unsigned>
- decomposeMachineOperandsTargetFlags(unsigned ) const {
- return std::make_pair(0u, 0u);
- }
-
-
-
-
-
- virtual ArrayRef<std::pair<unsigned, const char *>>
- getSerializableDirectMachineOperandTargetFlags() const {
- return std::nullopt;
- }
-
-
-
-
-
- virtual ArrayRef<std::pair<unsigned, const char *>>
- getSerializableBitmaskMachineOperandTargetFlags() const {
- return std::nullopt;
- }
-
-
-
-
-
- virtual ArrayRef<std::pair<MachineMemOperand::Flags, const char *>>
- getSerializableMachineMemOperandTargetFlags() const {
- return std::nullopt;
- }
-
-
-
- virtual bool isTailCall(const MachineInstr &Inst) const {
- return Inst.isReturn() && Inst.isCall();
- }
-
-
-
- virtual bool isBasicBlockPrologue(const MachineInstr &MI) const {
- return false;
- }
-
-
-
- virtual MachineInstr *createPHIDestinationCopy(
- MachineBasicBlock &MBB, MachineBasicBlock::iterator InsPt,
- const DebugLoc &DL, Register Src, Register Dst) const {
- return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst)
- .addReg(Src);
- }
-
-
-
- virtual MachineInstr *createPHISourceCopy(MachineBasicBlock &MBB,
- MachineBasicBlock::iterator InsPt,
- const DebugLoc &DL, Register Src,
- unsigned SrcSubReg,
- Register Dst) const {
- return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst)
- .addReg(Src, 0, SrcSubReg);
- }
-
-
- virtual outliner::OutlinedFunction getOutliningCandidateInfo(
- std::vector<outliner::Candidate> &RepeatedSequenceLocs) const {
- llvm_unreachable(
- "Target didn't implement TargetInstrInfo::getOutliningCandidateInfo!");
- }
-
-
-
- virtual void mergeOutliningCandidateAttributes(
- Function &F, std::vector<outliner::Candidate> &Candidates) const;
-
- virtual outliner::InstrType
- getOutliningType(MachineBasicBlock::iterator &MIT, unsigned Flags) const {
- llvm_unreachable(
- "Target didn't implement TargetInstrInfo::getOutliningType!");
- }
-
-
- virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,
- unsigned &Flags) const;
-
- virtual void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF,
- const outliner::OutlinedFunction &OF) const {
- llvm_unreachable(
- "Target didn't implement TargetInstrInfo::buildOutlinedFrame!");
- }
-
-
-
- virtual MachineBasicBlock::iterator
- insertOutlinedCall(Module &M, MachineBasicBlock &MBB,
- MachineBasicBlock::iterator &It, MachineFunction &MF,
- outliner::Candidate &C) const {
- llvm_unreachable(
- "Target didn't implement TargetInstrInfo::insertOutlinedCall!");
- }
-
-
-
-
- virtual bool isFunctionSafeToOutlineFrom(MachineFunction &MF,
- bool OutlineFromLinkOnceODRs) const {
- llvm_unreachable("Target didn't implement "
- "TargetInstrInfo::isFunctionSafeToOutlineFrom!");
- }
-
- virtual bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const {
- return false;
- }
-
-
-
- virtual std::optional<ParamLoadedValue>
- describeLoadedValue(const MachineInstr &MI, Register Reg) const;
-
-
-
- virtual bool isExtendLikelyToBeFolded(MachineInstr &ExtMI,
- MachineRegisterInfo &MRI) const {
- return false;
- }
-
-
- virtual const MIRFormatter *getMIRFormatter() const {
- if (!Formatter.get())
- Formatter = std::make_unique<MIRFormatter>();
- return Formatter.get();
- }
-
-
-
- virtual unsigned getTailDuplicateSize(CodeGenOpt::Level OptLevel) const {
- return OptLevel >= CodeGenOpt::Aggressive ? 4 : 2;
- }
-
- virtual const MachineOperand &getCalleeOperand(const MachineInstr &MI) const {
- return MI.getOperand(0);
- }
-
- virtual InstructionUniformity
- getInstructionUniformity(const MachineInstr &MI) const {
- return InstructionUniformity::Default;
- }
-
-
-
-
- virtual bool isExplicitTargetIndexDef(const MachineInstr &MI, int &Index,
- int64_t &Offset) const {
- return false;
- }
- private:
- mutable std::unique_ptr<MIRFormatter> Formatter;
- unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode;
- unsigned CatchRetOpcode;
- unsigned ReturnOpcode;
- };
- template <> struct DenseMapInfo<TargetInstrInfo::RegSubRegPair> {
- using RegInfo = DenseMapInfo<unsigned>;
- static inline TargetInstrInfo::RegSubRegPair getEmptyKey() {
- return TargetInstrInfo::RegSubRegPair(RegInfo::getEmptyKey(),
- RegInfo::getEmptyKey());
- }
- static inline TargetInstrInfo::RegSubRegPair getTombstoneKey() {
- return TargetInstrInfo::RegSubRegPair(RegInfo::getTombstoneKey(),
- RegInfo::getTombstoneKey());
- }
-
-
- static unsigned getHashValue(const TargetInstrInfo::RegSubRegPair &Val) {
- std::pair<unsigned, unsigned> PairVal = std::make_pair(Val.Reg, Val.SubReg);
- return DenseMapInfo<std::pair<unsigned, unsigned>>::getHashValue(PairVal);
- }
- static bool isEqual(const TargetInstrInfo::RegSubRegPair &LHS,
- const TargetInstrInfo::RegSubRegPair &RHS) {
- return RegInfo::isEqual(LHS.Reg, RHS.Reg) &&
- RegInfo::isEqual(LHS.SubReg, RHS.SubReg);
- }
- };
- }
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|