23#include "llvm/Config/llvm-config.h" 
   29#define DEBUG_TYPE "registerbankinfo" 
   34          "Number of partial mappings dynamically created");
 
   36          "Number of partial mappings dynamically accessed");
 
   38          "Number of value mappings dynamically created");
 
   40          "Number of value mappings dynamically accessed");
 
   42          "Number of operands mappings dynamically created");
 
   44          "Number of operands mappings dynamically accessed");
 
   46          "Number of instruction mappings dynamically created");
 
   48          "Number of instruction mappings dynamically accessed");
 
   62  for (
unsigned Idx = 0, End = 
getNumRegBanks(); Idx != End; ++Idx) {
 
   65           "RegisterBank ID should match index");
 
 
   72  for (
unsigned Idx = 0, End = 
getNumRegBanks(); Idx != End; ++Idx) {
 
   75           "ID does not match the index in the array");
 
 
   86  if (!Reg.isVirtual()) {
 
 
  107    RegRCIt->second = 
TRI.getMinimalPhysRegClassLLT(Reg, 
LLT());
 
  108  return RegRCIt->second;
 
 
  127         "The mapping of the register bank does not make sense");
 
 
  135  auto &RegClassOrBank = 
MRI.getRegClassOrRegBank(Reg);
 
  137    return MRI.constrainRegClass(Reg, &RC);
 
  141  if (RB && !RB->
covers(RC))
 
  145  MRI.setRegClass(Reg, &RC);
 
 
  156  return MI.isCopy() || 
MI.isPHI() ||
 
  157         MI.getOpcode() == TargetOpcode::REG_SEQUENCE;
 
 
  168  unsigned NumOperandsForMapping = IsCopyLike ? 1 : 
MI.getNumOperands();
 
  179  bool CompleteMapping = 
true;
 
  182  for (
unsigned OpIdx = 0, EndIdx = 
MI.getNumOperands(); 
OpIdx != EndIdx;
 
  199    const RegisterBank *CurRegBank = IsCopyLike ? AltRegBank : 
nullptr;
 
  206        CompleteMapping = 
false;
 
  219      if (!OperandsMapping[0]) {
 
  220        if (
MI.isRegSequence()) {
 
  226          OperandsMapping[0] = ValMapping;
 
  247      CompleteMapping = 
true;
 
  251    OperandsMapping[
OpIdx] = ValMapping;
 
  254  if (IsCopyLike && !CompleteMapping) {
 
  259  assert(CompleteMapping && 
"Setting an uncomplete mapping");
 
  263      NumOperandsForMapping);
 
 
  282  ++NumPartialMappingsAccessed;
 
  289  ++NumPartialMappingsCreated;
 
  291  auto &PartMapping = It->second;
 
  292  PartMapping = std::make_unique<PartialMapping>(StartIdx, 
Length, RegBank);
 
 
  304                 unsigned NumBreakDowns) {
 
  308  for (
unsigned Idx = 0; Idx != NumBreakDowns; ++Idx)
 
 
  315                                  unsigned NumBreakDowns)
 const {
 
  316  ++NumValueMappingsAccessed;
 
  323  ++NumValueMappingsCreated;
 
  325  auto &ValMapping = It->second;
 
  326  ValMapping = std::make_unique<ValueMapping>(BreakDown, NumBreakDowns);
 
 
  330template <
typename Iterator>
 
  334  ++NumOperandsMappingsAccessed;
 
  343  ++NumOperandsMappingsCreated;
 
  350  Res = std::make_unique<ValueMapping[]>(std::distance(Begin, End));
 
  352  for (Iterator It = Begin; It != End; ++It, ++Idx) {
 
 
  368    std::initializer_list<const RegisterBankInfo::ValueMapping *> OpdsMapping)
 
  376                       unsigned NumOperands) {
 
 
  381RegisterBankInfo::getInstructionMappingImpl(
 
  382    bool IsInvalid, 
unsigned ID, 
unsigned Cost,
 
  384    unsigned NumOperands)
 const {
 
  386           OperandsMapping == 
nullptr && NumOperands == 0) ||
 
  388         "Mismatch argument for invalid input");
 
  389  ++NumInstructionMappingsAccessed;
 
  397  ++NumInstructionMappingsCreated;
 
  399  auto &InstrMapping = It->second;
 
  400  InstrMapping = std::make_unique<InstructionMapping>(
 
  401      ID, 
Cost, OperandsMapping, NumOperands);
 
  402  return *InstrMapping;
 
  417  if (Mapping.isValid()) {
 
  427    assert(Mapping->verify(
MI) && 
"Mapping is invalid");
 
  429  return PossibleMappings;
 
 
  442  for (
unsigned OpIdx = 0,
 
  463           "This mapping is too complex for this function");
 
  466    if (NewRegs.
empty()) {
 
  467      LLVM_DEBUG(
dbgs() << 
" has not been repaired, nothing to be done\n");
 
  478    LLT OrigTy = 
MRI.getType(OrigReg);
 
  479    LLT NewTy = 
MRI.getType(NewReg);
 
  480    if (OrigTy != NewTy) {
 
  487          "Types with difference size cannot be handled by the default " 
  489      LLVM_DEBUG(
dbgs() << 
"\nChange type of new opd from " << NewTy << 
" to " 
  491      MRI.setType(NewReg, OrigTy);
 
 
  500  if (Reg.isPhysical()) {
 
  506    assert(RC && 
"Expecting Register class");
 
  507    return TRI.getRegSizeInBits(*RC);
 
  509  return TRI.getRegSizeInBits(Reg, 
MRI);
 
 
  515#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  529         "Register bank too small for Mask");
 
 
  547    if (Part->Length != 
First->Length || Part->RegBank != 
First->RegBank)
 
 
  555                                            TypeSize MeaningfulBitWidth)
 const {
 
  557  unsigned OrigValueBitWidth = 0;
 
  561    assert(PartMap.
verify(RBI) && 
"Partial mapping is invalid");
 
  568          OrigValueBitWidth >= MeaningfulBitWidth) &&
 
  569         "Meaningful bits not covered by the mapping");
 
  570  APInt ValueMask(OrigValueBitWidth, 0);
 
  577    ValueMask ^= PartMapMask;
 
  578    assert((ValueMask & PartMapMask) == PartMapMask &&
 
  579           "Some partial mappings overlap");
 
 
  585#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  598    OS << 
'[' << PartMap << 
']';
 
 
  609         "NumOperands must match, see constructor");
 
  611         "MI must be connected to a MachineFunction");
 
  617  for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
 
  621             "We should not care about non-reg mapping");
 
  627    LLT Ty = 
MRI.getType(Reg);
 
  631           "We must have a mapping for reg operands");
 
  639           "Value mapping is invalid");
 
 
  644#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  652  OS << 
"ID: " << 
getID() << 
" Cost: " << 
getCost() << 
" Mapping: ";
 
  658    OS << 
"{ Idx: " << 
OpIdx << 
" Map: " << ValMapping << 
'}';
 
 
  662const int RegisterBankInfo::OperandsMapper::DontKnowIdx = -1;
 
  667    : MRI(MRI), MI(MI), InstrMapping(InstrMapping) {
 
  668  unsigned NumOpds = InstrMapping.getNumOperands();
 
  669  OpToNewVRegIdx.resize(NumOpds, OperandsMapper::DontKnowIdx);
 
  670  assert(InstrMapping.verify(MI) && 
"Invalid mapping for MI");
 
 
  674RegisterBankInfo::OperandsMapper::getVRegsMem(
unsigned OpIdx) {
 
  676  unsigned NumPartialVal =
 
  678  int StartIdx = OpToNewVRegIdx[
OpIdx];
 
  680  if (StartIdx == OperandsMapper::DontKnowIdx) {
 
  684    StartIdx = NewVRegs.size();
 
  685    OpToNewVRegIdx[
OpIdx] = StartIdx;
 
  686    for (
unsigned i = 0; i < NumPartialVal; ++i)
 
  687      NewVRegs.push_back(0);
 
  690      getNewVRegsEnd(StartIdx, NumPartialVal);
 
  696RegisterBankInfo::OperandsMapper::getNewVRegsEnd(
unsigned StartIdx,
 
  697                                                 unsigned NumVal)
 const {
 
  698  return const_cast<OperandsMapper *
>(
this)->getNewVRegsEnd(StartIdx, NumVal);
 
  701RegisterBankInfo::OperandsMapper::getNewVRegsEnd(
unsigned StartIdx,
 
  703  assert((NewVRegs.size() == StartIdx + NumVal ||
 
  704          NewVRegs.size() > StartIdx + NumVal) &&
 
  705         "NewVRegs too small to contain all the partial mapping");
 
  706  return NewVRegs.size() <= StartIdx + NumVal ? NewVRegs.end()
 
  707                                              : &NewVRegs[StartIdx + NumVal];
 
  716  for (
Register &NewVReg : NewVRegsForOpIdx) {
 
  717    assert(PartMap != ValMapping.
end() && 
"Out-of-bound access");
 
  718    assert(NewVReg == 0 && 
"Register has already been created");
 
  725    MRI.setRegBank(NewVReg, *PartMap->
RegBank);
 
 
  731                                                unsigned PartialMapIdx,
 
  736         "Out-of-bound access for partial mapping");
 
  738  (void)getVRegsMem(
OpIdx);
 
  739  assert(NewVRegs[OpToNewVRegIdx[
OpIdx] + PartialMapIdx] == 0 &&
 
  740         "This value is already set");
 
  741  NewVRegs[OpToNewVRegIdx[
OpIdx] + PartialMapIdx] = NewVReg;
 
 
  746                                           bool ForDebug)
 const {
 
  749  int StartIdx = OpToNewVRegIdx[
OpIdx];
 
  751  if (StartIdx == OperandsMapper::DontKnowIdx)
 
  752    return make_range(NewVRegs.end(), NewVRegs.end());
 
  754  unsigned PartMapSize =
 
  757      getNewVRegsEnd(StartIdx, PartMapSize);
 
  762    assert((VReg || ForDebug) && 
"Some registers are uninitialized");
 
 
  767#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  775                                             bool ForDebug)
 const {
 
  780    OS << 
"Populated indices (CellNumber, IndexInNewVRegs): ";
 
  782    for (
unsigned Idx = 0; Idx != NumOpds; ++Idx) {
 
  783      if (OpToNewVRegIdx[Idx] != DontKnowIdx) {
 
  786        OS << 
'(' << Idx << 
", " << OpToNewVRegIdx[Idx] << 
')';
 
  794  OS << 
"Operand Mapping: ";
 
  799          ? 
getMI().getMF()->getSubtarget().getRegisterInfo()
 
  802  for (
unsigned Idx = 0; Idx != NumOpds; ++Idx) {
 
  803    if (OpToNewVRegIdx[Idx] == DontKnowIdx)
 
  809    bool IsFirstNewVReg = 
true;
 
  813      IsFirstNewVReg = 
false;
 
 
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
#define LLVM_LIKELY(EXPR)
static InstructionCost getCost(Instruction &Inst, TTI::TargetCostKind CostKind, TargetTransformInfo &TTI, TargetLibraryInfo &TLI)
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
MachineInstr unsigned OpIdx
static hash_code hashPartialMapping(unsigned StartIdx, unsigned Length, const RegisterBank *RegBank)
Hashing function for PartialMapping.
static bool isCopyLike(const MachineInstr &MI)
Check whether or not MI should be treated like a copy for the mappings.
static hash_code hashValueMapping(const RegisterBankInfo::PartialMapping *BreakDown, unsigned NumBreakDowns)
static hash_code hashInstructionMapping(unsigned ID, unsigned Cost, const RegisterBankInfo::ValueMapping *OperandsMapping, unsigned NumOperands)
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Class for arbitrary precision integers.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
Wrapper class representing physical registers. Should be passed by value.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Helper class that represents how the value of an instruction may be mapped and what is the related co...
unsigned getNumOperands() const
Get the number of operands.
unsigned getID() const
Get the ID.
bool verify(const MachineInstr &MI) const
Verifiy that this mapping makes sense for MI.
void dump() const
Print this on dbgs() stream.
void print(raw_ostream &OS) const
Print this on OS;.
bool isValid() const
Check whether this object is valid.
Helper class used to get/create the virtual registers that will be used to replace the MachineOperand...
const InstructionMapping & getInstrMapping() const
The final mapping of the instruction.
void setVRegs(unsigned OpIdx, unsigned PartialMapIdx, Register NewVReg)
Set the virtual register of the PartialMapIdx-th partial mapping of the OpIdx-th operand to NewVReg.
void print(raw_ostream &OS, bool ForDebug=false) const
Print this operands mapper on OS stream.
MachineInstr & getMI() const
void createVRegs(unsigned OpIdx)
Create as many new virtual registers as needed for the mapping of the OpIdx-th operand.
MachineRegisterInfo & getMRI() const
The MachineRegisterInfo we used to realize the mapping.
OperandsMapper(MachineInstr &MI, const InstructionMapping &InstrMapping, MachineRegisterInfo &MRI)
Create an OperandsMapper that will hold the information to apply InstrMapping to MI.
void dump() const
Print this operands mapper on dbgs() stream.
iterator_range< SmallVectorImpl< Register >::const_iterator > getVRegs(unsigned OpIdx, bool ForDebug=false) const
Get all the virtual registers required to map the OpIdx-th operand of the instruction.
const PartialMapping & getPartialMapping(unsigned StartIdx, unsigned Length, const RegisterBank &RegBank) const
Get the uniquely generated PartialMapping for the given arguments.
virtual InstructionMappings getInstrAlternativeMappings(const MachineInstr &MI) const
Get the alternative mappings for MI.
static const TargetRegisterClass * constrainGenericRegister(Register Reg, const TargetRegisterClass &RC, MachineRegisterInfo &MRI)
Constrain the (possibly generic) virtual register Reg to RC.
DenseMap< hash_code, std::unique_ptr< const InstructionMapping > > MapOfInstructionMappings
Keep dynamically allocated InstructionMapping in a separate map.
const RegisterBank ** RegBanks
Hold the set of supported register banks.
RegisterBankInfo()
This constructor is meaningless.
DenseMap< hash_code, std::unique_ptr< const PartialMapping > > MapOfPartialMappings
Keep dynamically allocated PartialMapping in a separate map.
virtual const InstructionMapping & getInstrMapping(const MachineInstr &MI) const
Get the mapping of the different operands of MI on the register bank.
unsigned NumRegBanks
Total number of register banks.
const InstructionMapping & getInstructionMapping(unsigned ID, unsigned Cost, const ValueMapping *OperandsMapping, unsigned NumOperands) const
Method to get a uniquely generated InstructionMapping.
static void applyDefaultMapping(const OperandsMapper &OpdMapper)
Helper method to apply something that is like the default mapping.
DenseMap< hash_code, std::unique_ptr< const ValueMapping > > MapOfValueMappings
Keep dynamically allocated ValueMapping in a separate map.
const ValueMapping & getValueMapping(unsigned StartIdx, unsigned Length, const RegisterBank &RegBank) const
The most common ValueMapping consists of a single PartialMapping.
const InstructionMapping & getInvalidInstructionMapping() const
Method to get a uniquely generated invalid InstructionMapping.
DenseMap< hash_code, std::unique_ptr< ValueMapping[]> > MapOfOperandsMappings
Keep dynamically allocated array of ValueMapping in a separate map.
const RegisterBank & getRegBank(unsigned ID)
Get the register bank identified by ID.
const unsigned * Sizes
Hold the sizes of the register banks for all HwModes.
bool cannotCopy(const RegisterBank &Dst, const RegisterBank &Src, TypeSize Size) const
unsigned getMaximumSize(unsigned RegBankID) const
Get the maximum size in bits that fits in the given register bank.
unsigned getNumRegBanks() const
Get the total number of register banks.
const RegisterBank * getRegBankFromConstraints(const MachineInstr &MI, unsigned OpIdx, const TargetInstrInfo &TII, const MachineRegisterInfo &MRI) const
Get the register bank for the OpIdx-th operand of MI form the encoding constraints,...
TypeSize getSizeInBits(Register Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI) const
Get the size in bits of Reg.
virtual const RegisterBank & getRegBankFromRegClass(const TargetRegisterClass &RC, LLT Ty) const
Get a register bank that covers RC.
InstructionMappings getInstrPossibleMappings(const MachineInstr &MI) const
Get the possible mapping for MI.
RegisterBankInfo(const RegisterBank **RegBanks, unsigned NumRegBanks, const unsigned *Sizes, unsigned HwMode)
Create a RegisterBankInfo that can accommodate up to NumRegBanks RegisterBank instances.
static const unsigned InvalidMappingID
Identifier used when the related instruction mapping instance is generated by the default constructor...
const TargetRegisterClass * getMinimalPhysRegClass(MCRegister Reg, const TargetRegisterInfo &TRI) const
Get the MinimalPhysRegClass for Reg.
const ValueMapping * getOperandsMapping(Iterator Begin, Iterator End) const
Get the uniquely generated array of ValueMapping for the elements of between Begin and End.
DenseMap< MCRegister, const TargetRegisterClass * > PhysRegMinimalRCs
Getting the minimal register class of a physreg is expensive.
static const unsigned DefaultMappingID
Identifier used when the related instruction mapping instance is generated by target independent code...
unsigned HwMode
Current HwMode for the target.
SmallVector< const InstructionMapping *, 4 > InstructionMappings
Convenient type to represent the alternatives for mapping an instruction.
bool verify(const TargetRegisterInfo &TRI) const
Check that information hold by this instance make sense for the given TRI.
const InstructionMapping & getInstrMappingImpl(const MachineInstr &MI) const
Try to get the mapping of MI.
This class implements the register bank concept.
LLVM_ABI bool verify(const RegisterBankInfo &RBI, const TargetRegisterInfo &TRI) const
Check if this register bank is valid.
LLVM_ABI bool covers(const TargetRegisterClass &RC) const
Check whether this register bank covers RC.
unsigned getID() const
Get the identifier of this register bank.
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::const_iterator const_iterator
typename SuperClass::iterator iterator
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const RegisterBankInfo * getRegBankInfo() const
If the information for the register banks is available, return it.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
An opaque object representing a hash code.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
hash_code hash_value(const FixedPointSemantics &Val)
PointerUnion< const TargetRegisterClass *, const RegisterBank * > RegClassOrRegBank
Convenient type to represent either a register class or a register bank.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
LLVM_ABI 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.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Helper struct that represents how a value is partially mapped into a register.
void print(raw_ostream &OS) const
Print this partial mapping on OS;.
unsigned StartIdx
Number of bits at which this partial mapping starts in the original value.
unsigned getHighBitIdx() const
bool verify(const RegisterBankInfo &RBI) const
Check that the Mask is compatible with the RegBank.
void dump() const
Print this partial mapping on dbgs() stream.
const RegisterBank * RegBank
Register bank where the partial value lives.
unsigned Length
Length of this mapping in bits.
Helper struct that represents how a value is mapped through different register banks.
const PartialMapping * begin() const
Iterators through the PartialMappings.
const PartialMapping * end() const
void print(raw_ostream &OS) const
Print this on OS;.
bool verify(const RegisterBankInfo &RBI, TypeSize MeaningfulBitWidth) const
Verify that this mapping makes sense for a value of MeaningfulBitWidth.
bool partsAllUniform() const
unsigned NumBreakDowns
Number of partial mapping to break down this value.
void dump() const
Print this on dbgs() stream.