1//===- MachineFunction.cpp ------------------------------------------------===// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7//===----------------------------------------------------------------------===// 9// Collect native machine code information for a function. This allows 10// target-specific information about the generated code to be stored with each 13//===----------------------------------------------------------------------===// 43#include "llvm/Config/llvm-config.h" 82#define DEBUG_TYPE "codegen" 86cl::desc(
"Force the alignment of all functions in log2 format (e.g. 4 " 87"means align on 16B boundaries)."),
95case P::FailedISel:
return"FailedISel";
96case P::IsSSA:
return"IsSSA";
97case P::Legalized:
return"Legalized";
98case P::NoPHIs:
return"NoPHIs";
99case P::NoVRegs:
return"NoVRegs";
100case P::RegBankSelected:
return"RegBankSelected";
101case P::Selected:
return"Selected";
102case P::TracksLiveness:
return"TracksLiveness";
103case P::TiedOpsRewritten:
return"TiedOpsRewritten";
104case P::FailsVerification:
return"FailsVerification";
105case P::FailedRegAlloc:
return"FailedRegAlloc";
106case P::TracksDebugUserValues:
return"TracksDebugUserValues";
113if (!
F.hasFnAttribute(Attribute::SafeStack))
117 dyn_cast_or_null<MDTuple>(
F.getMetadata(LLVMContext::MD_annotation));
119if (!Existing || Existing->getNumOperands() != 2)
122auto *MetadataName =
"unsafe-stack-size";
123if (
auto &
N = Existing->getOperand(0)) {
124if (
N.equalsStr(MetadataName)) {
125if (
auto &
Op = Existing->getOperand(1)) {
126auto Val = mdconst::extract<ConstantInt>(
Op)->getZExtValue();
133// Pin the vtable to this file. 134void MachineFunction::Delegate::anchor() {}
137constchar *Separator =
"";
141 OS << Separator << getPropertyName(static_cast<Property>(
I));
146//===----------------------------------------------------------------------===// 147// MachineFunction implementation 148//===----------------------------------------------------------------------===// 150// Out-of-line virtual method. 159if (
auto MA =
F.getFnStackAlign())
168 FunctionNumber = FunctionNum;
188void MachineFunction::init() {
189// Assume the function starts in SSA form with correct liveness. 199// We can realign the stack if the target supports it and the user hasn't 200// explicitly asked us not to. 203bool ForceRealignSP = F.
hasFnAttribute(Attribute::StackAlignment) ||
207/*ForcedRealign=*/ForceRealignSP && CanRealignSP);
217// FIXME: Shouldn't use pref alignment if explicit alignment is set on F. 218// FIXME: Use Function::hasOptSize(). 220 Alignment = std::max(Alignment,
223// -fsanitize=function and -fsanitize=kcfi instrument indirect function calls 224// to load a type hash before the function label. Ensure functions are aligned 225// by a least 4 to avoid unaligned access, which is especially important for 226// -mno-unaligned-access. 229 Alignment = std::max(Alignment,
Align(4));
234 JumpTableInfo =
nullptr;
247"Can't create a MachineFunction using a Module with a " 248"Target-incompatible DataLayout attached\n");
250 PSVManager = std::make_unique<PseudoSourceValueManager>(
getTarget());
255assert(!MFInfo &&
"MachineFunctionInfo already set");
256 MFInfo =
Target.createMachineFunctionInfo(Allocator, F, &STI);
263void MachineFunction::clear() {
265// Don't call destructors on MachineInstr and MachineOperand. All of their 266// memory comes from the BumpPtrAllocator which is about to be purged. 268// Do call MachineBasicBlock destructors, it contains std::vectors. 270I->Insts.clearAndLeakNodesUnsafely();
271 MBBNumbering.clear();
273 InstructionRecycler.clear(Allocator);
274 OperandRecycler.
clear(Allocator);
275 BasicBlockRecycler.clear(Allocator);
276 CodeViewAnnotations.clear();
279 RegInfo->~MachineRegisterInfo();
287 FrameInfo->~MachineFrameInfo();
294 JumpTableInfo->~MachineJumpTableInfo();
299 WinEHInfo->~WinEHFuncInfo();
304 WasmEHInfo->~WasmEHFuncInfo();
313/// Get the JumpTableInfo for this function. 314/// If it does not already exist, allocate one. 317if (JumpTableInfo)
return JumpTableInfo;
319 JumpTableInfo =
new (Allocator)
328/// Should we be emitting segmented stack stuff for the function 335 FrameInstructions.push_back(Inst);
336return FrameInstructions.size() - 1;
339/// This discards all of the MachineBasicBlock numbers and recomputes them. 340/// This guarantees that the MBB numbers are sequential, dense, and match the 341/// ordering of the blocks within the function. If a specific MachineBasicBlock 342/// is specified, only that block and those after it are renumbered. 344if (
empty()) { MBBNumbering.clear();
return; }
351// Figure out the block number this should have. 354 BlockNo = std::prev(
MBBI)->getNumber() + 1;
356for (;
MBBI != E; ++
MBBI, ++BlockNo) {
358// Remove use of the old number. 361"MBB number mismatch!");
365// If BlockNo is already taken, set that block's number to -1. 366if (MBBNumbering[BlockNo])
367 MBBNumbering[BlockNo]->setNumber(-1);
369 MBBNumbering[BlockNo] = &*
MBBI;
374// Okay, all the blocks are renumbered. If we have compactified the block 375// numbering, shrink MBBNumbering now. 376assert(BlockNo <= MBBNumbering.size() &&
"Mismatch!");
377 MBBNumbering.resize(BlockNo);
385 /// Offset - Distance from the beginning of the function to the end 386 /// of the basic block. 398if (Alignment <= FunctionAlignment) {
401// The alignment of this MBB is larger than the function's alignment, so 402// we can't tell whether or not it will insert nops. Assume that it will. 404 FunctionAlignment.
value();
412/// This method iterates over the basic blocks and assigns their IsBeginSection 413/// and IsEndSection fields. This must be called after MBB layout is finalized 414/// and the SectionID's are assigned to MBBs. 422 std::prev(
MBBI)->setIsEndSection();
428/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'. 432returnnew (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
436/// Create a new MachineInstr which is a copy of the 'Orig' instruction, 437/// identical in all ways except the instruction has no parent, prev, or next. 440returnnew (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
452if (FirstClone ==
nullptr) {
458if (!
I->isBundledWithSucc())
462// Copy over call info to the cloned instruction if needed. If Orig is in 463// a bundle, copyAdditionalCallInfo takes care of finding the call instruction 470/// Delete the given MachineInstr. 472/// This function also serves as the MachineInstr destructor - the real 473/// ~MachineInstr() destructor must be empty. 475// Verify that a call site info is at valid state. This assertion should 476// be triggered during the implementation of support for the 477// call site info of a new architecture. If the assertion is triggered, 478// back trace will tell where to insert a call to updateCallSiteInfo(). 479assert((!
MI->isCandidateForAdditionalCallInfo() ||
481"Call site info was not updated!");
482// Verify that the "called globals" info is in a valid state. 483assert((!
MI->isCandidateForAdditionalCallInfo() ||
485"Called globals info was not updated!");
486// Strip it for parts. The operand array and the MI object itself are 487// independently recyclable. 490// Don't call ~MachineInstr() which must be trivial anyway because 491// ~MachineFunction drops whole lists of MachineInstrs wihout calling their 493 InstructionRecycler.Deallocate(Allocator,
MI);
496/// Allocate a new MachineBasicBlock. Use this instead of 497/// `new MachineBasicBlock'. 500 std::optional<UniqueBBID> BBID) {
504// Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to 505// allow robust mapping of profiles to basic blocks. 506if (
Target.Options.BBAddrMap ||
512/// Delete the given MachineBasicBlock. 515// Clean up any references to MBB in jump tables before deleting it. 518MBB->~MachineBasicBlock();
519 BasicBlockRecycler.Deallocate(Allocator,
MBB);
528Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
529"Unexpected an unknown size to be represented using " 530"LocationSize::beforeOrAfter()");
533 Ordering, FailureOrdering);
543 Ordering, FailureOrdering);
551Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
552"Unexpected an unknown size to be represented using " 553"LocationSize::beforeOrAfter()");
573// If there is no pointer value, the offset isn't tracked so we need to adjust 574// the base alignment. 579// Do not preserve ranges, since we don't necessarily know what the high bits 613return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
614 PostInstrSymbol, HeapAllocMarker,
615 PCSections, CFIType, MMRAs);
621 Dest[
Name.size()] = 0;
629 memset(Mask, 0,
Size *
sizeof(Mask[0]));
634int* AllocMask = Allocator.
Allocate<
int>(Mask.size());
635copy(Mask, AllocMask);
636return {AllocMask, Mask.size()};
639#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 650OS <<
"# Machine code for function " <<
getName() <<
": ";
654// Print Frame Information 657// Print JumpTable Information 661// Print Constant Pool 667OS <<
"Function Live Ins: ";
673if (std::next(
I) != E)
681for (
constauto &BB : *
this) {
683// If we print the whole function, print it at its most verbose level. 684 BB.print(
OS, MST, Indexes,
/*IsStandalone=*/true);
687OS <<
"\n# End machine code for function " <<
getName() <<
".\n\n";
690/// True if this function needs frame moves for debug or exceptions. 692// TODO: Ideally, what we'd like is to have a switch that allows emitting 693// synchronous (precise at call-sites only) CFA into .eh_frame. However, even 694// under this switch, we'd like .debug_frame to be precise when using -g. At 695// this moment, there's no way to specify that some CFI directives go into 696// .eh_frame only, while others go into .debug_frame only. 709return (
"CFG for '" +
F->getName() +
"' function").str();
720if (
constBasicBlock *BB = Node->getBasicBlock())
721 OSS <<
": " << BB->getName();
726if (OutStr[0] ==
'\n') OutStr.erase(OutStr.begin());
728// Process string output to make it nicer... 729for (
unsigned i = 0; i != OutStr.length(); ++i)
730if (OutStr[i] ==
'\n') {
// Left justify 732 OutStr.insert(OutStr.begin()+i+1,
'l');
738}
// end namespace llvm 745errs() <<
"MachineFunction::viewCFG is only available in debug builds on " 746 <<
"systems with Graphviz or gv!\n";
755errs() <<
"MachineFunction::viewCFGOnly is only available in debug builds on " 756 <<
"systems with Graphviz or gv!\n";
760/// Add the specified physical register as a live-in value and 761/// create a corresponding virtual register for it. 769// A physical register can be added several times. 770// Between two calls, the register class of the related virtual register 771// may have been constrained to match some operation constraints. 772// In that case, check that the current register class includes the 773// physical register and is a sub class of the specified RC. 776"Register class mismatch!");
779 VReg =
MRI.createVirtualRegister(RC);
780MRI.addLiveIn(PReg, VReg);
784/// Return the MCSymbol for the specified non-empty jump table. 785/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a 786/// normal 'L' label is returned. 788bool isLinkerPrivate)
const{
790assert(JumpTableInfo &&
"No jump tables");
791assert(JTI < JumpTableInfo->getJumpTables().
size() &&
"Invalid JTI!");
793StringRef Prefix = isLinkerPrivate ?
DL.getLinkerPrivateGlobalPrefix()
794 :
DL.getPrivateGlobalPrefix();
801/// Return a function-local symbol to represent the PIC base. 808/// \name Exception Handling 813unsignedN = LandingPads.size();
814for (
unsigned i = 0; i <
N; ++i) {
821return LandingPads[
N];
838if (
constauto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
839// If there's no typeid list specified, then "cleanup" is implicit. 840// Otherwise, id 0 is reserved for the cleanup action. 841if (LPI->isCleanup() && LPI->getNumClauses() != 0)
844// FIXME: New EH - Add the clauses in reverse order. This isn't 100% 845// correct, but we need to do it this way because of how the DWARF EH 846// emitter processes the clauses. 847for (
unsignedI = LPI->getNumClauses();
I != 0; --
I) {
848Value *Val = LPI->getClause(
I - 1);
849if (LPI->isCatch(
I - 1)) {
853// Add filters in a list. 854auto *CVal = cast<Constant>(Val);
856for (
constUse &U : CVal->operands())
858getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
864 }
elseif (
constauto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
865for (
unsignedI = CPI->arg_size();
I != 0; --
I) {
867 dyn_cast<GlobalValue>(CPI->getArgOperand(
I - 1)->stripPointerCasts());
872assert(isa<CleanupPadInst>(FirstI) &&
"Invalid landingpad!");
875return LandingPadLabel;
880 LPadToCallSiteMap[
Sym].append(Sites.
begin(), Sites.
end());
884for (
unsigned i = 0,
N = TypeInfos.size(); i !=
N; ++i)
885if (TypeInfos[i] == TI)
return i + 1;
887 TypeInfos.push_back(TI);
888return TypeInfos.size();
892// If the new filter coincides with the tail of an existing filter, then 893// re-use the existing filter. Folding filters more than this requires 894// re-ordering filters and/or their elements - probably not worth it. 895for (
unsigned i : FilterEnds) {
896unsigned j = TyIds.
size();
899if (FilterIds[--i] != TyIds[--j])
903// The new filter coincides with range [i, end) of the existing filter. 909// Add the new filter. 910int FilterID = -(1 + FilterIds.size());
911 FilterIds.reserve(FilterIds.size() + TyIds.
size() + 1);
913 FilterEnds.push_back(FilterIds.size());
914 FilterIds.push_back(0);
// terminator 920assert(
MI->isCandidateForAdditionalCallInfo() &&
921"Call site info refers only to call (MI) candidates");
923if (!
Target.Options.EmitCallSiteInfo)
924return CallSitesInfo.
end();
925return CallSitesInfo.
find(
MI);
928/// Return the call machine instruction or find a call within bundle. 935if (BMI.isCandidateForAdditionalCallInfo())
942assert(
MI->shouldUpdateAdditionalCallInfo() &&
943"Call info refers only to call (MI) candidates or " 944"candidates inside bundles");
949if (CSIt != CallSitesInfo.
end())
950 CallSitesInfo.
erase(CSIt);
953if (CGIt != CalledGlobalsInfo.
end())
954 CalledGlobalsInfo.
erase(CGIt);
960"Call info refers only to call (MI) candidates or " 961"candidates inside bundles");
963if (!New->isCandidateForAdditionalCallInfo())
968if (CSIt != CallSitesInfo.
end()) {
970 CallSitesInfo[New] = CSInfo;
974if (CGIt != CalledGlobalsInfo.
end()) {
976 CalledGlobalsInfo[New] = CGInfo;
983"Call info refers only to call (MI) candidates or " 984"candidates inside bundles");
986if (!New->isCandidateForAdditionalCallInfo())
991if (CSIt != CallSitesInfo.
end()) {
993 CallSitesInfo.
erase(CSIt);
994 CallSitesInfo[New] = CSInfo;
998if (CGIt != CalledGlobalsInfo.
end()) {
1000 CalledGlobalsInfo.
erase(CGIt);
1001 CalledGlobalsInfo[New] = CGInfo;
1012// Catch any accidental self-loops. 1014// Don't allow any substitutions _from_ the memory operand number. 1022unsigned MaxOperand) {
1023// If the Old instruction wasn't tracked at all, there is no work to do. 1028// Iterate over all operands looking for defs to create substitutions for. 1029// Avoid creating new instr numbers unless we create a new substitution. 1030// While this has no functional effect, it risks confusing someone reading 1032// Examine all the operands, or the first N specified by the caller. 1034for (
unsignedintI = 0;
I < MaxOperand; ++
I) {
1036auto &NewMO = New.getOperand(
I);
1039if (!OldMO.isReg() || !OldMO.isDef())
1043unsigned NewInstrNum = New.getDebugInstrNum();
1045 std::make_pair(NewInstrNum,
I));
1054// Check whether this copy-like instruction has already been salvaged into 1057if (
auto CopyDstSrc =
TII.isCopyLikeInstr(
MI)) {
1058 Dest = CopyDstSrc->Destination->getReg();
1061 Dest =
MI.getOperand(0).getReg();
1064auto CacheIt = DbgPHICache.find(Dest);
1065if (CacheIt != DbgPHICache.end())
1066return CacheIt->second;
1068// Calculate the instruction number to use, or install a DBG_PHI. 1069auto OperandPair = salvageCopySSAImpl(
MI);
1070 DbgPHICache.insert({Dest, OperandPair});
1080// Chase the value read by a copy-like instruction back to the instruction 1081// that ultimately _defines_ that value. This may pass: 1082// * Through multiple intermediate copies, including subregister moves / 1084// * Copies from physical registers that must then be traced back to the 1085// defining instruction, 1086// * Or, physical registers may be live-in to (only) the entry block, which 1087// requires a DBG_PHI to be created. 1088// We can pursue this problem in that order: trace back through copies, 1089// optionally through a physical register, to a defining instruction. We 1090// should never move from physreg to vreg. As we're still in SSA form, no need 1091// to worry about partial definitions of registers. 1093// Helper lambda to interpret a copy-like instruction. Takes instruction, 1094// returns the register read and any subregister identifying which part is 1096auto GetRegAndSubreg =
1097 [&](
constMachineInstr &Cpy) -> std::pair<Register, unsigned> {
1101 OldReg = Cpy.getOperand(0).getReg();
1102 NewReg = Cpy.getOperand(1).getReg();
1103SubReg = Cpy.getOperand(1).getSubReg();
1104 }
elseif (Cpy.isSubregToReg()) {
1105 OldReg = Cpy.getOperand(0).getReg();
1106 NewReg = Cpy.getOperand(2).getReg();
1107SubReg = Cpy.getOperand(3).getImm();
1109auto CopyDetails = *
TII.isCopyInstr(Cpy);
1113 NewReg = Src.getReg();
1120// First seek either the defining instruction, or a copy from a physreg. 1121// During search, the current state is the current copy instruction, and which 1122// register we've read. Accumulate qualifying subregisters into SubregsSeen; 1123// deal with those later. 1124auto State = GetRegAndSubreg(
MI);
1125auto CurInst =
MI.getIterator();
1128// If we've found a copy from a physreg, first portion of search is over. 1129if (!State.first.isVirtual())
1132// Record any subregister qualifier. 1140// Any non-copy instruction is the defining instruction we're seeking. 1143 State = GetRegAndSubreg(Inst);
1146// Helper lambda to apply additional subregister substitutions to a known 1147// instruction/operand pair. Adds new (fake) substitutions so that we can 1148// record the subregister. FIXME: this isn't very space efficient if multiple 1149// values are tracked back through the same copies; cache something later. 1150auto ApplySubregisters =
1152for (
unsigned Subreg :
reverse(SubregsSeen)) {
1153// Fetch a new instruction number, not attached to an actual instruction. 1154unsigned NewInstrNumber = getNewDebugInstrNum();
1155// Add a substitution from the "new" number to the known one, with a 1156// qualifying subreg. 1157 makeDebugValueSubstitution({NewInstrNumber, 0},
P, Subreg);
1158// Return the new number; to find the underlying value, consumers need to 1159// deal with the qualifying subreg. 1160P = {NewInstrNumber, 0};
1165// If we managed to find the defining instruction after COPYs, return an 1166// instruction / operand pair after adding subregister qualifiers. 1167if (State.first.isVirtual()) {
1168// Virtual register def -- we can just look up where this happens. 1171if (MO.getReg() != State.first)
1179// Our search ended in a copy from a physreg: walk back up the function 1180// looking for whatever defines the physreg. 1181assert(CurInst->isCopyLike() ||
TII.isCopyInstr(*CurInst));
1182 State = GetRegAndSubreg(*CurInst);
1185auto RMII = CurInst->getReverseIterator();
1186auto PrevInstrs =
make_range(RMII, CurInst->getParent()->instr_rend());
1187for (
auto &ToExamine : PrevInstrs) {
1188for (
auto &MO : ToExamine.all_defs()) {
1189// Test for operand that defines something aliasing RegToSeek. 1190if (!
TRI.regsOverlap(RegToSeek, MO.getReg()))
1193return ApplySubregisters(
1194 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1200// We reached the start of the block before finding a defining instruction. 1201// There are numerous scenarios where this can happen: 1202// * Constant physical registers, 1203// * Several intrinsics that allow LLVM-IR to read arbitary registers, 1204// * Arguments in the entry block, 1205// * Exception handling landing pads. 1206// Validating all of them is too difficult, so just insert a DBG_PHI reading 1207// the variable value at this position, rather than checking it makes sense. 1209// Create DBG_PHI for specified physreg. 1211TII.get(TargetOpcode::DBG_PHI));
1212 Builder.addReg(State.first);
1213unsigned NewNum = getNewDebugInstrNum();
1214 Builder.addImm(NewNum);
1215return ApplySubregisters({NewNum, 0u});
1224MI.setDebugValueUndef();
1228for (
auto &
MBB : *
this) {
1229for (
auto &
MI :
MBB) {
1230if (!
MI.isDebugRef())
1233bool IsValidRef =
true;
1241// Some vregs can be deleted as redundant in the meantime. Mark those 1242// as DBG_VALUE $noreg. Additionally, some normal instructions are 1243// quickly deleted, leaving dangling references to vregs with no def. 1252// If we've found a copy-like instruction, follow it back to the 1253// instruction that defines the source value, see salvageCopySSA docs 1254// for why this is important. 1257 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1259// Otherwise, identify the operand number that the VReg refers to. 1260unsigned OperandIdx = 0;
1261for (
constauto &DefMO :
DefMI.operands()) {
1262if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() ==
Reg)
1268// Morph this instr ref to point at the given instruction and operand. 1269unsignedID =
DefMI.getDebugInstrNum();
1270 MO.ChangeToDbgInstrRef(
ID, OperandIdx);
1275 MakeUndefDbgValue(
MI);
1281// Disable instr-ref at -O0: it's very slow (in compile time). We can still 1282// have optimized code inlined into this unoptimized code, however with 1283// fewer and less aggressive optimizations happening, coverage and accuracy 1284// should not suffer. 1288// Don't use instr-ref if this function is marked optnone. 1289if (
F.hasFnAttribute(Attribute::OptimizeNone))
1306// Use one million as a high / reserved number. 1311//===----------------------------------------------------------------------===// 1312// MachineJumpTableInfo implementation 1313//===----------------------------------------------------------------------===// 1316const std::vector<MachineBasicBlock *> &MBBs)
1319/// Return the size of each entry in the jump table. 1321// The size of a jump table entry is 4 bytes unless the entry is just the 1322// address of a block, in which case it is the pointer size. 1339/// Return the alignment of each entry in the jump table. 1341// The alignment of a jump table entry is the alignment of int32 unless the 1342// entry is just the address of a block, in which case it is the pointer 1360/// Create a new jump table entry in the jump table info. 1362const std::vector<MachineBasicBlock*> &DestBBs) {
1363assert(!DestBBs.empty() &&
"Cannot create an empty jump table!");
1365return JumpTables.size()-1;
1370assert(JTI < JumpTables.size() &&
"Invalid JTI!");
1371// Record the largest hotness value. 1372if (Hotness <= JumpTables[JTI].Hotness)
1375 JumpTables[JTI].Hotness = Hotness;
1379/// If Old is the target of any jump tables, update the jump tables to branch 1383assert(Old != New &&
"Not making a change?");
1384bool MadeChange =
false;
1385for (
size_t i = 0, e = JumpTables.size(); i != e; ++i)
1390/// If MBB is present in any jump tables, remove it. 1392bool MadeChange =
false;
1394auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(),
MBB);
1395 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1396 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1401/// If Old is a target of the jump tables, update the jump table to branch to 1406assert(Old != New &&
"Not making a change?");
1407bool MadeChange =
false;
1418if (JumpTables.empty())
return;
1420OS <<
"Jump Tables:\n";
1422for (
unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1433#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1441//===----------------------------------------------------------------------===// 1442// MachineConstantPool implementation 1443//===----------------------------------------------------------------------===// 1445void MachineConstantPoolValue::anchor() {}
1448returnDL.getTypeAllocSize(Ty);
1453returnVal.MachineCPVal->getSizeInBytes(
DL);
1454returnDL.getTypeAllocSize(
Val.ConstVal->getType());
1460returnVal.ConstVal->needsDynamicRelocation();
1482// A constant may be a member of both Constants and MachineCPVsSharingEntries, 1483// so keep track of which we've deleted to avoid double deletions. 1486if (
C.isMachineConstantPoolEntry()) {
1488deleteC.Val.MachineCPVal;
1496/// Test whether the given two constants can be allocated the same constant pool 1497/// entry referenced by \param A. 1500// Handle the trivial case quickly. 1501if (
A ==
B)
returntrue;
1503// If they have the same type but weren't the same constant, quickly 1505if (
A->getType() ==
B->getType())
returnfalse;
1507// We can't handle structs or arrays. 1508if (isa<StructType>(
A->getType()) || isa<ArrayType>(
A->getType()) ||
1509 isa<StructType>(
B->getType()) || isa<ArrayType>(
B->getType()))
1512// For now, only support constants with the same size. 1513uint64_t StoreSize =
DL.getTypeStoreSize(
A->getType());
1514if (StoreSize !=
DL.getTypeStoreSize(
B->getType()) || StoreSize > 128)
1517bool ContainsUndefOrPoisonA =
A->containsUndefOrPoisonElement();
1521// Try constant folding a bitcast of both instructions to an integer. If we 1522// get two identical ConstantInt's, then we are good to share them. We use 1523// the constant folding APIs to do this so that we get the benefit of 1525if (isa<PointerType>(
A->getType()))
1528elseif (
A->getType() != IntTy)
1531if (isa<PointerType>(
B->getType()))
1534elseif (
B->getType() != IntTy)
1541// Constants only safely match if A doesn't contain undef/poison. 1542// As we'll be reusing A, it doesn't matter if B contain undef/poison. 1543// TODO: Handle cases where A and B have the same undef/poison elements. 1544// TODO: Merge A and B with mismatching undef/poison elements. 1545return !ContainsUndefOrPoisonA;
1548/// Create a new entry in the constant pool or return an existing one. 1549/// User must specify the log2 of the minimum required alignment for the object. 1552if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1554// Check to see if we already have this constant. 1556// FIXME, this could be made much more efficient for large constant pools. 1557for (
unsigned i = 0, e = Constants.size(); i != e; ++i)
1558if (!Constants[i].isMachineConstantPoolEntry() &&
1560if (Constants[i].
getAlign() < Alignment)
1561 Constants[i].Alignment = Alignment;
1566return Constants.size()-1;
1571if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1573// Check to see if we already have this constant. 1575// FIXME, this could be made much more efficient for large constant pools. 1576intIdx = V->getExistingMachineCPValue(
this, Alignment);
1578 MachineCPVsSharingEntries.insert(V);
1579return (
unsigned)
Idx;
1583return Constants.size()-1;
1587if (Constants.empty())
return;
1589OS <<
"Constant Pool:\n";
1590for (
unsigned i = 0, e = Constants.size(); i != e; ++i) {
1591OS <<
" cp#" << i <<
": ";
1592if (Constants[i].isMachineConstantPoolEntry())
1593 Constants[i].Val.MachineCPVal->print(
OS);
1595 Constants[i].Val.ConstVal->printAsOperand(
OS,
/*PrintType=*/false);
1596OS <<
", align=" << Constants[i].getAlign().value();
1601//===----------------------------------------------------------------------===// 1602// Template specialization for MachineFunction implementation of 1603// ProfileSummaryInfo::getEntryCount(). 1604//===----------------------------------------------------------------------===// 1606std::optional<Function::ProfileCount>
1607ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1609returnF->getFunction().getEntryCount();
1612#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder MachineInstrBuilder & DefMI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
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 defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static Align getFnStackAlignment(const TargetSubtargetInfo *STI, const Function &F)
static cl::opt< unsigned > AlignAllFunctions("align-all-functions", cl::desc("Force the alignment of all functions in log2 format (e.g. 4 " "means align on 16B boundaries)."), cl::init(0), cl::Hidden)
static const MachineInstr * getCallInstr(const MachineInstr *MI)
Return the call machine instruction or find a call within bundle.
static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, const DataLayout &DL)
Test whether the given two constants can be allocated the same constant pool entry referenced by.
void setUnsafeStackSize(const Function &F, MachineFrameInfo &FrameInfo)
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
unsigned const TargetRegisterInfo * TRI
This file contains the declarations for metadata subclasses.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isSimple(Instruction *I)
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
This file defines the SmallVector class.
static const int BlockSize
This file describes how to lower LLVM code to machine code.
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
LLVM Basic Block Representation.
InstListType::const_iterator getFirstNonPHIIt() const
Iterator returning form of getFirstNonPHI.
InstListType::const_iterator const_iterator
LLVM_ATTRIBUTE_RETURNS_NONNULL void * Allocate(size_t Size, Align Alignment)
Allocate space at the specified alignment.
void Deallocate(const void *Ptr, size_t Size, size_t)
This is an important base class in LLVM.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Implements a dense probed hash-table based set.
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
bool hasMetadata() const
Return true if this value has any metadata attached to it.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Module * getParent()
Get the module that this global value is contained inside of...
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Context object for machine code objects.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Describe properties that are true of each instruction in the target description file.
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.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
void setBBID(const UniqueBBID &V)
Sets the fixed BBID of this basic block.
void setIsEndSection(bool V=true)
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
Align getAlignment() const
Return alignment of the basic block.
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
union llvm::MachineConstantPoolEntry::@204 Val
The constant itself.
unsigned getSizeInBytes(const DataLayout &DL) const
SectionKind getSectionKind(const DataLayout *DL) const
Abstract base class for all machine specific constantpool value subclasses.
virtual unsigned getSizeInBytes(const DataLayout &DL) const
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
void dump() const
dump - Call print(cerr) to be called from the debugger.
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
void setUnsafeStackSize(uint64_t Size)
void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & set(Property P)
MachineFunctionProperties & reset(Property P)
virtual void MF_HandleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
Callback before changing MCInstrDesc.
virtual void MF_HandleRemoval(MachineInstr &MI)=0
Callback before a removal. This should not modify the MI directly.
virtual void MF_HandleInsertion(MachineInstr &MI)=0
Callback after an insertion. This should not modify the MI directly.
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
std::pair< unsigned, unsigned > DebugInstrOperandPair
Pair of instruction number and operand number.
unsigned addFrameInst(const MCCFIInstruction &Inst)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
SmallVector< DebugSubstitution, 8 > DebugValueSubstitutions
Debug value substitutions: a collection of DebugSubstitution objects, recording changes in where a va...
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, unsigned MaxOperand=UINT_MAX)
Create substitutions for any tracked values in Old, to point at New.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineInstr & cloneMachineInstrBundle(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig)
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, bool NoImplicit=false)
CreateMachineInstr - Allocate a new MachineInstr.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFunction(Function &F, const TargetMachine &Target, const TargetSubtargetInfo &STI, MCContext &Ctx, unsigned FunctionNum)
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
void deleteMachineInstr(MachineInstr *MI)
DeleteMachineInstr - Delete the given MachineInstr.
void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI)
Initialize the target specific MachineFunctionInfo.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
LandingPadInfo & getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad)
Find or create an LandingPadInfo for the specified MachineBasicBlock.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
unsigned DebugInstrNumberingCount
A count of how many instructions in the function have had numbers assigned to them.
void deleteMachineBasicBlock(MachineBasicBlock *MBB)
DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
Align getAlignment() const
getAlignment - Return the alignment of the function.
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
Function & getFunction()
Return the LLVM function that this machine code represents.
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
BasicBlockListType::iterator iterator
void setDebugInstrNumberingCount(unsigned Num)
Set value of DebugInstrNumberingCount field.
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
void viewCFG() const
viewCFG - This function is meant for use from the debugger.
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineBasicBlock & front() const
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
int64_t estimateFunctionSizeInBytes()
Return an estimate of the function's code size, taking into account block and function alignment.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void copyAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Copy the call site info from Old to \ New.
VariableDbgInfoMapTy VariableDbgInfos
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
DebugInstrOperandPair salvageCopySSA(MachineInstr &MI, DenseMap< Register, DebugInstrOperandPair > &DbgPHICache)
Find the underlying defining instruction / operand for a COPY instruction while in SSA form.
Representation of each machine instruction.
void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
iterator_range< filtered_mop_iterator > all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
void dump() const
dump - Call to stderr.
bool ReplaceMBBInJumpTable(unsigned Idx, MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTable - If Old is a target of the jump tables, update the jump table to branch to New...
bool updateJumpTableEntryHotness(size_t JTI, MachineFunctionDataHotness Hotness)
JTEntryKind
JTEntryKind - This enum indicates how each entry of the jump table is represented and emitted.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
JTEntryKind getEntryKind() const
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
const PseudoSourceValue * getPseudoValue() const
const MDNode * getRanges() const
Return the range tag for the memory reference.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
Flags
Flags values. These may be or'd together.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool livein_empty() const
def_instr_iterator def_instr_begin(Register RegNo) const
std::vector< std::pair< MCRegister, Register > >::const_iterator livein_iterator
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
livein_iterator livein_end() const
livein_iterator livein_begin() const
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
iterator_range< debug_compile_units_iterator > debug_compile_units() const
Return an iterator for all DICompileUnits listed in this Module's llvm.dbg.cu named metadata node and...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Simple wrapper around std::function<void(raw_ostream&)>.
Wrapper class representing virtual and physical registers.
SectionKind - This is a simple POD value that classifies the properties of a section.
static SectionKind getMergeableConst4()
static SectionKind getReadOnlyWithRel()
static SectionKind getMergeableConst8()
static SectionKind getMergeableConst16()
static SectionKind getReadOnly()
static SectionKind getMergeableConst32()
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Align getPrefFunctionAlignment() const
Return the preferred function alignment.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
Primary interface to the complete machine description for the target machine.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
bool hasSubClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
StringRef getName() const
Return a constant reference to the value's name.
self_iterator getIterator()
iterator erase(iterator where)
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
#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.
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
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.
MaybeAlign getAlign(const Function &F, unsigned Index)
Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
MachineFunctionDataHotness
auto reverse(ContainerTy &&C)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
AtomicOrdering
Atomic ordering for LLVM's memory model.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
OutputIt copy(R &&Range, OutputIt Out)
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
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.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
std::string getNodeLabel(const MachineBasicBlock *Node, const MachineFunction *Graph)
DOTGraphTraits(bool isSimple=false)
static std::string getGraphName(const MachineFunction *F)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
DefaultDOTGraphTraits - This class provides the default implementations of all of the DOTGraphTraits ...
Represent subnormal handling kind for floating point instruction inputs and outputs.
This structure is used to retain landing pad info for the current function.
SmallVector< MCSymbol *, 1 > EndLabels
MCSymbol * LandingPadLabel
MachineBasicBlock * LandingPadBlock
SmallVector< MCSymbol *, 1 > BeginLabels
std::vector< int > TypeIds
virtual ~MachineFunctionInfo()
MachineJumpTableEntry - One jump table in the jump table info.
MachineJumpTableEntry(const std::vector< MachineBasicBlock * > &M)
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
This class contains a discriminated union of information about pointers in memory operands,...
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static void deleteNode(NodeTy *V)