29#include "llvm/Config/llvm-config.h"
42#define DEBUG_TYPE "target-reg-info"
48 cl::desc(
"A threshold of live range size which may cause "
49 "high compile time cost in global splitting."),
58 : InfoDesc(
ID), SubRegIndexNames(SRINames), SubRegIdxRanges(SubIdxRanges),
59 SubRegIndexLaneMasks(SRILaneMasks), RegClassBegin(RCB), RegClassEnd(RCE),
60 CoveringLanes(SRICoveringLanes), RCInfos(RCIs), RCVTLists(RCVTLists),
70 if (
MI &&
TII->isTriviallyReMaterializable(*
MI) &&
86 for (
unsigned Reg : RegisterSet.set_bits()) {
90 if (!RegisterSet[SR] && !
is_contained(Exceptions, Reg)) {
92 <<
" of reserved register " <<
printReg(Reg,
this)
93 <<
" is not reserved.\n";
114 else if (Reg.isVirtual()) {
115 StringRef Name = MRI ? MRI->getVRegName(Reg) :
"";
119 OS <<
'%' << Register::virtReg2Index(Reg);
122 OS <<
'$' <<
"physreg" << Reg.id();
123 else if (Reg < TRI->getNumRegs()) {
125 printLowerCase(
TRI->getName(Reg),
OS);
131 OS <<
':' <<
TRI->getSubRegIndexName(SubIdx);
133 OS <<
":sub(" << SubIdx <<
')';
142 OS <<
"Unit~" << Unit;
147 if (Unit >=
TRI->getNumRegUnits()) {
148 OS <<
"BadUnit~" << Unit;
154 assert(Roots.isValid() &&
"Unit has no roots.");
155 OS <<
TRI->getName(*Roots);
156 for (++Roots; Roots.isValid(); ++Roots)
157 OS <<
'~' <<
TRI->getName(*Roots);
180 assert((RegInfo.def_empty(Reg) || RegInfo.getType(Reg).isValid()) &&
181 "Generic registers must have a valid type");
204template <
typename TypeT>
208 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
210 "reg must be a physical register");
212 bool IsDefault = [&]() {
213 if constexpr (std::is_same_v<TypeT, MVT>)
214 return Ty == MVT::Other;
216 return !Ty.isValid();
223 if ((IsDefault ||
TRI->isTypeLegalForClass(*RC, Ty)) && RC->contains(Reg) &&
228 if constexpr (std::is_same_v<TypeT, MVT>)
229 assert(BestRC &&
"Couldn't find the register class");
233template <
typename TypeT>
237 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
240 "Reg1/Reg2 must be a physical register");
242 bool IsDefault = [&]() {
243 if constexpr (std::is_same_v<TypeT, MVT>)
244 return Ty == MVT::Other;
246 return !Ty.isValid();
253 if ((IsDefault ||
TRI->isTypeLegalForClass(*RC, Ty)) &&
254 RC->contains(Reg1, Reg2) && (!BestRC || BestRC->
hasSubClass(RC)))
258 if constexpr (std::is_same_v<TypeT, MVT>)
259 assert(BestRC &&
"Couldn't find the register class");
265 return ::getMinimalPhysRegClass(
this, Reg, VT);
270 return ::getCommonMinimalPhysRegClass(
this, Reg1, Reg2, VT);
275 return ::getMinimalPhysRegClass(
this, Reg, Ty);
280 return ::getCommonMinimalPhysRegClass(
this, Reg1, Reg2, Ty);
303 if (
C->isAllocatable())
319 for (
unsigned I = 0, E =
TRI->getNumRegClasses();
I < E;
I += 32)
320 if (
unsigned Common = *
A++ & *
B++)
342 unsigned Idx)
const {
343 assert(
A &&
B &&
"Missing register class");
348 if (RCI.getSubReg() ==
Idx)
358 unsigned &PreA,
unsigned &PreB)
const {
359 assert(RCA && SubA && RCB && SubB &&
"Invalid arguments");
374 unsigned *BestPreA = &PreA;
375 unsigned *BestPreB = &PreB;
397 if (FinalA != FinalB)
406 *BestPreA = IA.getSubReg();
407 *BestPreB = IB.getSubReg();
423 unsigned SrcSubReg) {
429 unsigned SrcIdx, DefIdx;
430 if (SrcSubReg && DefSubReg) {
431 return TRI.getCommonSuperRegClass(SrcRC, SrcSubReg, DefRC, DefSubReg,
432 SrcIdx, DefIdx) !=
nullptr;
444 return TRI.getMatchingSuperRegClass(SrcRC, DefRC, SrcSubReg) !=
nullptr;
447 return TRI.getCommonSubClass(DefRC, SrcRC) !=
nullptr;
453 unsigned SrcSubReg)
const {
464 const std::pair<unsigned, SmallVector<Register, 4>> *Hints_MRI =
465 MRI.getRegAllocationHints(VirtReg);
472 bool Skip = (Hints_MRI->first != 0);
473 for (
auto Reg : Hints_MRI->second) {
486 if (!HintedRegs.
insert(Phys).second)
491 if (
MRI.isReserved(Phys))
509 const uint32_t *callerPreservedRegs =
511 if (callerPreservedRegs) {
513 "Expected physical register");
514 return (callerPreservedRegs[PhysReg / 32] >> PhysReg % 32) & 1;
530 for (
unsigned I = 0;
I <
N; ++
I)
531 if ((mask0[
I] & mask1[
I]) != mask0[
I])
540 if (Reg.isPhysical()) {
545 assert(RC &&
"Unable to deduce the register class");
548 LLT Ty =
MRI.getType(Reg);
553 RC =
MRI.getRegClass(Reg);
554 assert(RC &&
"Unable to deduce the register class");
562 unsigned BestIdx = 0;
563 unsigned BestCover = 0;
571 if (SubRegMask == LaneMask) {
577 if ((SubRegMask & ~LaneMask).any())
582 if (PopCount > BestCover) {
583 BestCover = PopCount;
596 LaneBitmask LanesLeft = LaneMask & ~getSubRegIndexLaneMask(BestIdx);
597 while (LanesLeft.
any()) {
598 unsigned BestIdx = 0;
599 int BestCover = std::numeric_limits<int>::min();
600 for (
unsigned Idx : PossibleIndexes) {
603 if (SubRegMask == LanesLeft) {
611 if ((SubRegMask & ~LanesLeft).any())
615 const int Cover = (SubRegMask & LanesLeft).getNumLanes();
616 if (Cover > BestCover) {
627 LanesLeft &= ~getSubRegIndexLaneMask(BestIdx);
635 "This is not a subregister index");
641 "This is not a subregister index");
650 if (!
MI->isCopyLike())
655 CopySrcReg =
MI->getOperand(1).getReg();
657 assert(
MI->isSubregToReg() &&
"Bad opcode for lookThruCopyLike");
658 CopySrcReg =
MI->getOperand(2).getReg();
673 if (!
MI->isCopyLike())
674 return MRI->hasOneNonDBGUse(SrcReg) ? SrcReg :
Register();
678 CopySrcReg =
MI->getOperand(1).getReg();
680 assert(
MI->isSubregToReg() &&
"Bad opcode for lookThruCopyLike");
681 CopySrcReg =
MI->getOperand(2).getReg();
686 if (!CopySrcReg.
isVirtual() || !
MRI->hasOneNonDBGUse(CopySrcReg))
695 assert(!
Offset.getScalable() &&
"Scalable offsets are not handled");
701 unsigned PrependFlags,
706 "Unsupported prepend flag");
709 OffsetExpr.
push_back(dwarf::DW_OP_deref);
712 OffsetExpr.
push_back(dwarf::DW_OP_deref);
718#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
unsigned const MachineRegisterInfo * MRI
This file contains the simple types necessary to represent the attributes associated with functions a...
This file implements the BitVector class.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file contains constants used for implementing Dwarf debug support.
const HexagonInstrInfo * TII
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallSet class.
static const TargetRegisterClass * getMinimalPhysRegClass(const TargetRegisterInfo *TRI, MCRegister Reg, TypeT Ty)
static void getAllocatableSetForRC(const MachineFunction &MF, const TargetRegisterClass *RC, BitVector &R)
getAllocatableSetForRC - Toggle the bits that represent allocatable registers for the specific regist...
static const TargetRegisterClass * firstCommonClass(const uint32_t *A, const uint32_t *B, const TargetRegisterInfo *TRI)
static const TargetRegisterClass * getCommonMinimalPhysRegClass(const TargetRegisterInfo *TRI, MCRegister Reg1, MCRegister Reg2, TypeT Ty)
static cl::opt< unsigned > HugeSizeForSplit("huge-size-for-split", cl::Hidden, cl::desc("A threshold of live range size which may cause " "high compile time cost in global splitting."), cl::init(5000))
static bool shareSameRegisterFile(const TargetRegisterInfo &TRI, const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg)
Check if the registers defined by the pair (RegisterClass, SubReg) share the same register file.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class encapuslates the logic to iterate over bitmask returned by the various RegClass related AP...
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
static void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
constexpr bool isValid() const
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
LiveInterval - This class represents the liveness of a register, or stack slot.
MCRegUnitRootIterator enumerates the root registers of a register unit.
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target.
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
iterator_range< MCSuperRegIterator > superregs_inclusive(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, including Reg.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
bool shouldRealignStack() const
Return true if stack realignment is forced by function attributes or if the stack alignment.
bool isStackRealignable() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
const RegisterBank * getRegBankOrNull(Register Reg) const
Return the register bank of Reg, or null if Reg has not been assigned a register bank or has been ass...
const TargetRegisterClass * getRegClassOrNull(Register Reg) const
Return the register class of Reg, or null if Reg has not been assigned a register class yet.
Simple wrapper around std::function<void(raw_ostream&)>.
const char * getName() const
Get a user friendly name of this register bank.
Wrapper class representing virtual and physical registers.
static constexpr bool isStackSlot(unsigned Reg)
isStackSlot - Sometimes it is useful to be able to store a non-negative frame index in a variable tha...
static int stackSlot2Index(Register Reg)
Compute the frame index from a register value representing a stack slot.
static unsigned virtReg2Index(Register Reg)
Convert a virtual register number to a 0-based index.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackOffset holds a fixed and a scalable offset in bytes.
StringRef - Represent a constant reference to a string, i.e.
std::string lower() const
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
TargetInstrInfo - Interface to description of machine instruction set.
bool isAllocatable() const
Return true if this register class may be used to create virtual registers.
bool hasSubClass(const TargetRegisterClass *RC) const
Return true if the specified TargetRegisterClass is a proper sub-class of this TargetRegisterClass.
const uint32_t * getSubClassMask() const
Returns a bit vector of subclasses, including this one.
ArrayRef< MCPhysReg > getRawAllocationOrder(const MachineFunction &MF) const
Returns the preferred order for allocating registers from this register class in MF.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
const TargetRegisterClass *const * regclass_iterator
const TargetRegisterClass * getMinimalPhysRegClass(MCRegister Reg, MVT VT=MVT::Other) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
iterator_range< regclass_iterator > regclasses() const
virtual bool shouldRegionSplitForVirtReg(const MachineFunction &MF, const LiveInterval &VirtReg) const
Region split has a high compile time cost especially for large live range.
virtual bool canRealignStack(const MachineFunction &MF) const
True if the stack can be realigned for the target.
virtual const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const
Returns the largest legal sub-class of RC that supports the sub-register index Idx.
const TargetRegisterClass * getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
unsigned composeSubRegIndices(unsigned a, unsigned b) const
Return the subregister index you get from composing two subregister indices.
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B) const
Find the largest common subclass of A and B.
const TargetRegisterClass * getMinimalPhysRegClassLLT(MCRegister Reg, LLT Ty=LLT()) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
void markSuperRegs(BitVector &RegisterSet, MCRegister Reg) const
Mark a register and all its aliases as reserved in the given set.
bool regmaskSubsetEqual(const uint32_t *mask0, const uint32_t *mask1) const
Return true if all bits that are set in mask mask0 are also set in mask1.
TypeSize getRegSizeInBits(const TargetRegisterClass &RC) const
Return the size in bits of a register from class RC.
virtual const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const
Return a mask of call-preserved registers for the given calling convention on the current function.
virtual Register lookThruSingleUseCopyChain(Register SrcReg, const MachineRegisterInfo *MRI) const
Find the original SrcReg unless it is the target of a copy-like operation, in which case we chain bac...
virtual ~TargetRegisterInfo()
virtual bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const
LaneBitmask getSubRegIndexLaneMask(unsigned SubIdx) const
Return a bitmask representing the parts of a register that are covered by SubIdx.
bool checkAllSuperRegsMarked(const BitVector &RegisterSet, ArrayRef< MCPhysReg > Exceptions=ArrayRef< MCPhysReg >()) const
Returns true if for every register in the set all super registers are part of the set as well.
const TargetRegisterClass * getAllocatableClass(const TargetRegisterClass *RC) const
Return the maximal subclass of the given register class that is allocatable or NULL.
virtual Register lookThruCopyLike(Register SrcReg, const MachineRegisterInfo *MRI) const
Returns the original SrcReg unless it is the target of a copy-like operation, in which case we chain ...
const TargetRegisterClass * getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA, const TargetRegisterClass *RCB, unsigned SubB, unsigned &PreA, unsigned &PreB) const
Find a common super-register class if it exists.
unsigned getSubRegIdxSize(unsigned Idx) const
Get the size of the bit range covered by a sub-register index.
static void dumpReg(Register Reg, unsigned SubRegIndex=0, const TargetRegisterInfo *TRI=nullptr)
Debugging helper: dump register in human readable form to dbgs() stream.
virtual bool shouldRealignStack(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
TargetRegisterInfo(const TargetRegisterInfoDesc *ID, regclass_iterator RCB, regclass_iterator RCE, const char *const *SRINames, const SubRegCoveredBits *SubIdxRanges, const LaneBitmask *SRILaneMasks, LaneBitmask CoveringLanes, const RegClassInfo *const RCIs, const MVT::SimpleValueType *const RCVTLists, unsigned Mode=0)
DIExpression * prependOffsetExpression(const DIExpression *Expr, unsigned PrependFlags, const StackOffset &Offset) const
Prepends a DWARF expression for Offset to DIExpression Expr.
const TargetRegisterClass * getCommonMinimalPhysRegClass(MCRegister Reg1, MCRegister Reg2, MVT VT=MVT::Other) const
Returns the common Register Class of two physical registers of the given type, picking the most sub r...
virtual bool isCalleeSavedPhysReg(MCRegister PhysReg, const MachineFunction &MF) const
This is a wrapper around getCallPreservedMask().
unsigned getSubRegIdxOffset(unsigned Idx) const
Get the offset of the bit range covered by a sub-register index.
bool getCoveringSubRegIndexes(const MachineRegisterInfo &MRI, const TargetRegisterClass *RC, LaneBitmask LaneMask, SmallVectorImpl< unsigned > &Indexes) const
Try to find one or more subregister indexes to cover LaneMask.
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
Return a subclass of the specified register class A so that each register in it has a sub-register of...
virtual void getOffsetOpcodes(const StackOffset &Offset, SmallVectorImpl< uint64_t > &Ops) const
Gets the DWARF expression opcodes for Offset.
BitVector getAllocatableSet(const MachineFunction &MF, const TargetRegisterClass *RC=nullptr) const
Returns a bitset indexed by register number indicating if a register is allocatable or not.
virtual bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=nullptr, const LiveRegMatrix *Matrix=nullptr) const
Get a list of 'hint' registers that the register allocator should try first when allocating a physica...
const TargetRegisterClass * getCommonMinimalPhysRegClassLLT(MCRegister Reg1, MCRegister Reg2, LLT Ty=LLT()) const
Returns the common Register Class of two physical registers of the given type, picking the most sub r...
virtual const TargetInstrInfo * getInstrInfo() const
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Printable printVRegOrUnit(unsigned VRegOrUnit, const TargetRegisterInfo *TRI)
Create Printable object to print virtual registers and physical registers on a raw_ostream.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
constexpr bool any() const
unsigned getNumLanes() const
Extra information, not in MCRegisterDesc, about registers.
SubRegCoveredBits - Emitted by tablegen: bit range covered by a subreg index, -1 in any being invalid...