80 cl::desc(
"Leave out unnecessary information when printing MIR"));
85 struct FrameIndexOperand {
90 FrameIndexOperand(
StringRef Name,
unsigned ID,
bool IsFixed)
91 : Name(Name.str()), ID(ID), IsFixed(IsFixed) {}
94 static FrameIndexOperand create(
StringRef Name,
unsigned ID) {
95 return FrameIndexOperand(Name, ID,
false);
99 static FrameIndexOperand createFixed(
unsigned ID) {
100 return FrameIndexOperand(
"", ID,
true);
154 : OS(OS), MST(MST), RegisterMaskIds(RegisterMaskIds),
155 StackObjectOperandMapping(StackObjectOperandMapping) {}
160 void printStackObjectReference(
int FrameIndex);
163 LLT TypeToPrint,
bool PrintDef =
true);
172 template <>
struct BlockScalarTraits<
Module> {
174 Mod.
print(OS,
nullptr);
193 initRegisterMaskIds(MF);
214 convertStackObjects(YamlMF, MF, MST);
220 bool IsNewlineNeeded =
false;
221 for (
const auto &MBB : MF) {
224 MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
226 IsNewlineNeeded =
true;
229 yaml::Output Out(OS);
231 Out.setWriteDefaultValues(
true);
237 assert(RegMask &&
"Can't print an empty register mask");
240 bool IsRegInRegMaskFound =
false;
243 if (RegMask[
I / 32] & (1u << (
I % 32))) {
244 if (IsRegInRegMaskFound)
247 IsRegInRegMaskFound =
true;
261 template <
typename T>
265 std::array<std::string *, 3> Outputs{{&Object.DebugVar.Value,
266 &Object.DebugExpr.Value,
267 &Object.DebugLoc.Value}};
268 std::array<const Metadata *, 3> Metas{{DebugVar.
Var,
271 for (
unsigned i = 0; i < 3; ++i) {
273 Metas[i]->printAsOperand(StrOS, MST);
297 for (std::pair<unsigned, unsigned> LI : RegInfo.
liveins()) {
308 std::vector<yaml::FlowStringValue> CalleeSavedRegisters;
312 CalleeSavedRegisters.push_back(Reg);
371 StackObjectOperandMapping.insert(
372 std::make_pair(
I, FrameIndexOperand::createFixed(ID++)));
385 Alloca->hasName() ? Alloca->getName() :
"<unnamed alloca>";
397 StackObjectOperandMapping.insert(std::make_pair(
398 I, FrameIndexOperand::create(YamlObject.
Name.
Value, ID++)));
404 if (!CSInfo.isSpilledToReg()) {
405 auto StackObjectInfo = StackObjectOperandMapping.find(CSInfo.getFrameIdx());
406 assert(StackObjectInfo != StackObjectOperandMapping.end() &&
407 "Invalid stack object index");
408 const FrameIndexOperand &StackObject = StackObjectInfo->second;
409 if (StackObject.IsFixed) {
422 auto StackObjectInfo = StackObjectOperandMapping.find(LocalObject.first);
423 assert(StackObjectInfo != StackObjectOperandMapping.end() &&
424 "Invalid stack object index");
425 const FrameIndexOperand &StackObject = StackObjectInfo->second;
426 assert(!StackObject.IsFixed &&
"Expected a locally mapped stack object");
427 YMF.
StackObjects[StackObject.ID].LocalOffset = LocalObject.second;
434 MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
441 auto StackObjectInfo = StackObjectOperandMapping.find(DebugVar.Slot);
442 assert(StackObjectInfo != StackObjectOperandMapping.end() &&
443 "Invalid stack object index");
444 const FrameIndexOperand &StackObject = StackObjectInfo->second;
445 if (StackObject.IsFixed) {
461 if (
Constant.isMachineConstantPoolEntry()) {
468 YamlConstant.
ID = ID++;
486 for (
const auto *MBB : Table.MBBs) {
492 YamlJTI.
Entries.push_back(Entry);
500 RegisterMaskIds.insert(std::make_pair(
Mask, I++));
505 bool &IsFallthrough) {
521 IsFallthrough = I == MBB.end() || !I->isBarrier();
538 return std::equal(Normalized.begin(), Normalized.end(),
Equal.begin());
543 bool GuessedFallthrough;
545 if (GuessedFallthrough) {
548 if (NextI != MF.
end()) {
562 bool HasAttributes =
false;
565 OS <<
"." << BB->getName();
567 HasAttributes =
true;
569 int Slot = MST.getLocalSlot(BB);
571 OS <<
"<ir-block badref>";
573 OS << (
Twine(
"%ir-block.") +
Twine(Slot)).str();
577 OS << (HasAttributes ?
", " :
" (");
578 OS <<
"address-taken";
579 HasAttributes =
true;
582 OS << (HasAttributes ?
", " :
" (");
584 HasAttributes =
true;
587 OS << (HasAttributes ?
", " :
" (");
589 HasAttributes =
true;
595 bool HasLineAttributes =
false;
597 bool canPredictProbs = canPredictBranchProbabilities(MBB);
605 !canPredictSuccessors(MBB)) {
606 OS.indent(2) <<
"successors: ";
617 HasLineAttributes =
true;
624 OS.indent(2) <<
"liveins: ";
626 for (
const auto &LI : MBB.
liveins()) {
631 if (!LI.LaneMask.all())
635 HasLineAttributes =
true;
638 if (HasLineAttributes)
640 bool IsInBundle =
false;
644 OS.indent(2) <<
"}\n";
647 OS.indent(IsInBundle ? 4 : 2);
656 OS.indent(2) <<
"}\n";
660 const auto *MF = MI.
getMF();
664 assert(
TRI &&
"Expected target register info");
666 assert(
TII &&
"Expected target instruction info");
678 print(MI, I,
TRI, ShouldPrintRegisterTies,
686 OS <<
"frame-setup ";
688 OS <<
"frame-destroy ";
714 bool NeedComma =
false;
718 print(MI, I,
TRI, ShouldPrintRegisterTies,
728 OS <<
" pre-instr-symbol ";
735 OS <<
" post-instr-symbol ";
743 OS <<
" debug-location ";
744 DL->printAsOperand(OS, MST);
751 bool NeedComma =
false;
755 Op->print(OS, MST, SSNs, Context, &MFI,
TII);
762 auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex);
763 assert(ObjectInfo != StackObjectOperandMapping.end() &&
764 "Invalid frame index");
765 const FrameIndexOperand &Operand = ObjectInfo->second;
772 bool ShouldPrintRegisterTies,
LLT TypeToPrint,
799 unsigned TiedOperandIdx = 0;
803 Op.
print(OS, MST, TypeToPrint, PrintDef,
false,
804 ShouldPrintRegisterTies, TiedOperandIdx, TRI, TII);
808 printStackObjectReference(Op.
getIndex());
811 auto RegMaskInfo = RegisterMaskIds.find(Op.
getRegMask());
812 if (RegMaskInfo != RegisterMaskIds.end())
822 yaml::Output Out(OS);
823 Out << const_cast<Module &>(M);
LLT getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes, const MachineRegisterInfo &MRI) const
Debugging supportDetermine the generic type to be printed (if needed) on uses and defs...
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
bool hasSuccessorProbabilities() const
Return true if any of the successors have probabilities attached to them.
StringValue VirtualRegister
A common definition of LaneBitmask for use in TableGen and CodeGen.
bool hasStackMap() const
This method may be called any time after instruction selection is complete to determine if there is a...
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
instr_iterator instr_begin()
static void printStackObjectDbgInfo(const MachineFunction::VariableDbgInfo &DebugVar, T &Object, ModuleSlotTracker &MST)
static StringRef input(StringRef Str, void *Ctxt, Module &Mod)
instr_iterator instr_end()
Atomic ordering constants.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
This class represents lattice values for constants.
bool hasVAStart() const
Returns true if the function calls the llvm.va_start intrinsic.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
static unsigned index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
A Module instance is used to store all the information related to an LLVM module. ...
bool hasStackProtectorIndex() const
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
This class prints out the machine functions using the MIR serialization format.
bool isCFIInstruction() const
const MachineFunctionProperties & getProperties() const
Get the function properties.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
void push_back(const T &Elt)
Optional< std::vector< FlowStringValue > > CalleeSavedRegisters
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
static void printTargetFlags(raw_ostream &OS, const MachineOperand &Op)
Print operand target flags.
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
int64_t getLocalFrameSize() const
Get the size of the local object blob.
Address of indexed Jump Table for switch.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
MachineBasicBlock reference.
unsigned const TargetRegisterInfo * TRI
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
Manage lifetime of a slot tracker for printing IR.
Mask of live-out registers.
print alias Alias Set Printer
VariableDbgInfoMapTy & getVariableDbgInfo()
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
Mask of preserved registers.
void guessSuccessors(const MachineBasicBlock &MBB, SmallVectorImpl< MachineBasicBlock *> &Result, bool &IsFallthrough)
Determine a possible list of successors of a basic block based on the basic block machine operand bei...
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
amdgpu Simplify well known AMD library false Value Value const Twine & Name
std::pair< int, int64_t > getLocalFrameObjectMap(int i) const
Get the local offset mapping for a for an object.
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
const HexagonInstrInfo * TII
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
Serializable representation of the fixed stack object from the MachineFrameInfo class.
unsigned getNumOperands() const
Retuns the total number of operands.
Printable printReg(unsigned Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MachineBasicBlock * getRestorePoint() const
void print(const MachineBasicBlock &MBB)
Target-dependent index+offset operand.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
Name of external global symbol.
unsigned getAlignment() const
getAlignment - Return the alignment (log2, not bytes) of the function.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isImmutableObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an immutable object.
static cl::opt< bool > SimplifyMIR("simplify-mir", cl::Hidden, cl::desc("Leave out unnecessary information when printing MIR"))
std::vector< VirtualRegisterDefinition > VirtualRegisters
Immediate >64bit operand.
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
bool HasMustTailInVarArgFunc
unsigned CVBytesOfCalleeSavedRegisters
int getObjectIndexBegin() const
Return the minimum frame object index.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
This class is a data container for one entry in a MachineConstantPool.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
Printable printRegClassOrBank(unsigned Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
bool isInsideBundle() const
Return true if MI is in a bundle (but not the first MI in a bundle).
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
const DILocalVariable * Var
MCSymbol * getPreInstrSymbol() const
Helper to extract a pre-instruction symbol if one has been added.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
unsigned getCVBytesOfCalleeSavedRegisters() const
Returns how many bytes of callee-saved registers the target pushed in the prologue.
unsigned getObjectAlignment(int ObjectIdx) const
Return the alignment of the specified stack object.
Address of a global value.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
MIRPrinter(raw_ostream &OS)
const TargetRegisterInfo * getTargetRegisterInfo() const
std::vector< FlowStringValue > Blocks
unsigned const MachineRegisterInfo * MRI
Serializable representation of stack object from the MachineFrameInfo class.
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
static void printRegMIR(unsigned Reg, yaml::StringValue &Dest, const TargetRegisterInfo *TRI)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
This is an important class for using LLVM in a threaded context.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This is an important base class in LLVM.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
This file contains the declarations for the subclasses of Constant, which represent the different fla...
MachineJumpTable JumpTableInfo
Constant pool.
bool isOperandSubregIdx(unsigned OpIdx) const
Return true if operand OpIdx is a subregister index.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
unsigned getAlignment() const
Return alignment of the basic block.
int getStackProtectorIndex() const
Return the index for the stack protector object.
static void printStackObjectReference(raw_ostream &OS, unsigned FrameIndex, bool IsFixed, StringRef Name)
Print a stack object reference.
unsigned getMaxAlignment() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
Address of a basic block.
virtual ArrayRef< const char * > getRegMaskNames() const =0
void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
void convertStackObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
unsigned MaxCallFrameSize
~0u means: not computed yet.
This class prints out the machine instructions using the MIR serialization format.
StringValue StackProtector
std::vector< MachineStackObject > StackObjects
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
bool livein_empty() const
self_iterator getIterator()
bool hasComplexRegisterTies() const
Return true when an instruction has tied register that can't be determined by the instruction's descr...
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, const TargetRegisterInfo *TRI)
Serializable representation of MachineFrameInfo.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
void printMIR(raw_ostream &OS, const Module &M)
Print LLVM IR using the MIR serialization format to the given output stream.
succ_iterator succ_begin()
void incorporateFunction(const Function &F)
Incorporate the given function.
bool hasAddressTaken() const
Test whether this block is potentially the target of an indirect branch.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
static void printSymbol(raw_ostream &OS, MCSymbol &Sym)
Print a MCSymbol as an operand.
void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
std::string & str()
Flushes the stream contents to the target string and returns the string's reference.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
MCSymbol * getPostInstrSymbol() const
Helper to extract a post-instruction symbol if one has been added.
TargetIntrinsicInfo - Interface to description of machine instruction set.
const std::vector< MachineConstantPoolEntry > & getConstants() const
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the module to an output stream with an optional AssemblyAnnotationWriter.
unsigned findTiedOperandIdx(unsigned OpIdx) const
Given the index of a tied register operand, find the operand it is tied to.
Iterator for intrusive lists based on ilist_node.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements...
unsigned getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call...
StringValue PreferredRegister
Generic predicate for ISel.
void print(raw_ostream &os, const TargetRegisterInfo *TRI=nullptr, const TargetIntrinsicInfo *IntrinsicInfo=nullptr) const
Print the MachineOperand to os.
MachineOperand class - Representation of each machine instruction operand.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Module.h This file contains the declarations for the Module class.
MachineFrameInfo FrameInfo
bool hasMustTailInVarArgFunc() const
Returns true if the function is variadic and contains a musttail call.
const Function & getFunction() const
Return the LLVM function that this machine code represents.
The access may modify the value stored in memory.
MCSymbol reference (for debug/eh info)
bool HasOpaqueSPAdjustment
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
ArrayRef< std::pair< unsigned, unsigned > > liveins() const
A wrapper around std::string which contains a source range that's being set during parsing...
unsigned succ_size() const
static void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
const AllocaInst * getObjectAllocation(int ObjectIdx) const
Return the underlying Alloca of the specified stack object if it exists.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
std::vector< MachineFunctionLiveIn > LiveIns
static void output(const Module &Mod, void *Ctxt, raw_ostream &OS)
bool isUpdatedCSRsInitialized() const
Returns true if the updated CSR list was initialized and false otherwise.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool isEHPad() const
Returns true if the block is a landing pad.
bool exposesReturnsTwice() const
exposesReturnsTwice - Returns true if the function calls setjmp or any other similar functions with a...
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
bool isAliasedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an object that might be pointed to by an LLVM IR v...
std::vector< Entry > Entries
virtual const TargetIntrinsicInfo * getIntrinsicInfo() const
If intrinsic information is available, return it. If not, return null.
bool isReturnAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
bool IsReturnAddressTaken
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
std::vector< MachineConstantPoolValue > Constants
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
int getOffsetAdjustment() const
Return the correction for frame offsets.
Abstract Stack Frame Index.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
iterator_range< livein_iterator > liveins() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void convert(yaml::MachineFunction &MF, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
This file defines passes to print out IR in various granularities.
uint8_t getStackID(int ObjectIdx) const
MachineBasicBlock * getSavePoint() const
bool memoperands_empty() const
Return true if we don't have any memory operands which described the memory access done by this instr...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool hasProperty(Property P) const
std::vector< FixedMachineStackObject > FixedStackObjects
A raw_ostream that writes to an std::string.
Module * getParent()
Get the module that this global value is contained inside of...
JTEntryKind getEntryKind() const
Floating-point immediate operand.
const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
void printStackObjectReference(int FrameIndex)
This class implements an extremely fast bulk output stream that can only output to a stream...
bool isMaxCallFrameSizeComputed() const
bool hasPatchPoint() const
This method may be called any time after instruction selection is complete to determine if there is a...
StringRef - Represent a constant reference to a string, i.e.
Address of indexed Constant in Constant Pool.
MachineJumpTableInfo::JTEntryKind Kind
unsigned getSimpleHint(unsigned VReg) const
getSimpleHint - same as getRegAllocationHint except it will only return a target independent hint...
MIPrinter(raw_ostream &OS, ModuleSlotTracker &MST, const DenseMap< const uint32_t *, unsigned > &RegisterMaskIds, const DenseMap< int, FrameIndexOperand > &StackObjectOperandMapping)
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
const MachineOperand & getOperand(unsigned i) const
int64_t getLocalFrameObjectCount() const
Return the number of objects allocated into the local object block.
const DIExpression * Expr
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects...
void print(const MachineFunction &MF)
uint32_t getNumerator() const
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
StringRef getVRegName(unsigned Reg) const
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
bool hasCalls() const
Return true if the current function has any function calls.
Metadata reference (for debug info)
bool is_contained(R &&Range, const E &Element)
Wrapper function around std::find to detect if an element exists in a container.