LLVM 23.0.0git
MachineFunction.cpp
Go to the documentation of this file.
1//===- MachineFunction.cpp ------------------------------------------------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// Collect native machine code information for a function. This allows
10// target-specific information about the generated code to be stored with each
11// function.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/BitVector.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/Twine.h"
43#include "llvm/Config/llvm-config.h"
44#include "llvm/IR/Attributes.h"
45#include "llvm/IR/BasicBlock.h"
46#include "llvm/IR/Constant.h"
47#include "llvm/IR/DataLayout.h"
50#include "llvm/IR/Function.h"
51#include "llvm/IR/GlobalValue.h"
52#include "llvm/IR/Instruction.h"
54#include "llvm/IR/Metadata.h"
55#include "llvm/IR/Module.h"
57#include "llvm/IR/Value.h"
58#include "llvm/MC/MCContext.h"
59#include "llvm/MC/MCSymbol.h"
60#include "llvm/MC/SectionKind.h"
70#include <algorithm>
71#include <cassert>
72#include <cstddef>
73#include <cstdint>
74#include <iterator>
75#include <string>
76#include <utility>
77#include <vector>
78
80
81using namespace llvm;
82
83#define DEBUG_TYPE "codegen"
84
86 "align-all-functions",
87 cl::desc("Force the alignment of all functions in log2 format (e.g. 4 "
88 "means align on 16B boundaries)."),
90
93
94 // clang-format off
95 switch(Prop) {
96 case P::FailedISel: return "FailedISel";
97 case P::IsSSA: return "IsSSA";
98 case P::Legalized: return "Legalized";
99 case P::NoPHIs: return "NoPHIs";
100 case P::NoVRegs: return "NoVRegs";
101 case P::RegBankSelected: return "RegBankSelected";
102 case P::Selected: return "Selected";
103 case P::TracksLiveness: return "TracksLiveness";
104 case P::TiedOpsRewritten: return "TiedOpsRewritten";
105 case P::FailsVerification: return "FailsVerification";
106 case P::FailedRegAlloc: return "FailedRegAlloc";
107 case P::TracksDebugUserValues: return "TracksDebugUserValues";
108 }
109 // clang-format on
110 llvm_unreachable("Invalid machine function property");
111}
112
114 if (!F.hasFnAttribute(Attribute::SafeStack))
115 return;
116
117 auto *Existing =
118 dyn_cast_or_null<MDTuple>(F.getMetadata(LLVMContext::MD_annotation));
119
120 if (!Existing || Existing->getNumOperands() != 2)
121 return;
122
123 auto *MetadataName = "unsafe-stack-size";
124 if (auto &N = Existing->getOperand(0)) {
125 if (N.equalsStr(MetadataName)) {
126 if (auto &Op = Existing->getOperand(1)) {
127 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
128 FrameInfo.setUnsafeStackSize(Val);
129 }
130 }
131 }
132}
133
134// Pin the vtable to this file.
135void MachineFunction::Delegate::anchor() {}
136
138 const char *Separator = "";
139 for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
140 if (!Properties[I])
141 continue;
142 OS << Separator << getPropertyName(static_cast<Property>(I));
143 Separator = ", ";
144 }
145}
146
147//===----------------------------------------------------------------------===//
148// MachineFunction implementation
149//===----------------------------------------------------------------------===//
150
151// Out-of-line virtual method.
153
155 MBB->getParent()->deleteMachineBasicBlock(MBB);
156}
157
159 const Function &F) {
160 if (auto MA = F.getFnStackAlign())
161 return *MA;
162 return STI.getFrameLowering()->getStackAlign();
163}
164
166 Attribute FPAttr = F.getFnAttribute("frame-pointer");
167 if (!FPAttr.isValid())
169
170 StringRef FP = FPAttr.getValueAsString();
173 .Case("non-leaf", FramePointerKind::NonLeaf)
174 .Case("non-leaf-no-reserve", FramePointerKind::NonLeafNoReserve)
175 .Case("reserved", FramePointerKind::Reserved)
178}
179
181 const TargetSubtargetInfo &STI, MCContext &Ctx,
182 unsigned FunctionNum)
183 : F(F), Target(Target), STI(STI), Ctx(Ctx) {
184 FunctionNumber = FunctionNum;
185 init();
186}
187
188void MachineFunction::handleInsertion(MachineInstr &MI) {
189 if (TheDelegate)
190 TheDelegate->MF_HandleInsertion(MI);
191}
192
193void MachineFunction::handleRemoval(MachineInstr &MI) {
194 if (TheDelegate)
195 TheDelegate->MF_HandleRemoval(MI);
196}
197
199 const MCInstrDesc &TID) {
200 if (TheDelegate)
201 TheDelegate->MF_HandleChangeDesc(MI, TID);
202}
203
204void MachineFunction::init() {
205 // Assume the function starts in SSA form with correct liveness.
206 Properties.setIsSSA();
207 Properties.setTracksLiveness();
208 RegInfo = new (Allocator) MachineRegisterInfo(this);
209
210 MFInfo = nullptr;
211
212 // We can realign the stack if the target supports it and the user hasn't
213 // explicitly asked us not to.
214 bool CanRealignSP = STI.getFrameLowering()->isStackRealignable() &&
215 !F.hasFnAttribute("no-realign-stack");
216 bool ForceRealignSP = F.hasFnAttribute(Attribute::StackAlignment) ||
217 F.hasFnAttribute("stackrealign");
218 FrameInfo = new (Allocator) MachineFrameInfo(
219 getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
220 /*ForcedRealign=*/ForceRealignSP && CanRealignSP);
222
223 setUnsafeStackSize(F, *FrameInfo);
224
225 if (F.hasFnAttribute(Attribute::StackAlignment))
226 FrameInfo->ensureMaxAlignment(*F.getFnStackAlign());
227
229 Alignment = STI.getTargetLowering()->getMinFunctionAlignment();
230
231 // -fsanitize=function and -fsanitize=kcfi instrument indirect function calls
232 // to load a type hash before the function label. Ensure functions are aligned
233 // by a least 4 to avoid unaligned access, which is especially important for
234 // -mno-unaligned-access.
235 if (F.hasMetadata(LLVMContext::MD_func_sanitize) ||
236 F.getMetadata(LLVMContext::MD_kcfi_type))
237 Alignment = std::max(Alignment, Align(4));
238
240 Alignment = Align(1ULL << AlignAllFunctions);
241
242 JumpTableInfo = nullptr;
243
245 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
246 WinEHInfo = new (Allocator) WinEHFuncInfo();
247 }
248
249 if (!Target.isCompatibleDataLayout(getDataLayout())) {
251 formatv("Can't create a MachineFunction using a Module with a "
252 "Target-incompatible DataLayout attached\n Target "
253 "DataLayout: {0}\n Module DataLayout: {1}\n",
254 Target.createDataLayout().getStringRepresentation(),
255 getDataLayout().getStringRepresentation()));
256 }
257
258 PSVManager = std::make_unique<PseudoSourceValueManager>(getTarget());
259}
260
262 const TargetSubtargetInfo &STI) {
263 assert(!MFInfo && "MachineFunctionInfo already set");
264 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
265}
266
270
271void MachineFunction::clear() {
272 Properties.reset();
273
274 // Clear JumpTableInfo first. Otherwise, every MBB we delete would do a
275 // linear search over the jump table entries to find and erase itself.
276 if (JumpTableInfo) {
277 JumpTableInfo->~MachineJumpTableInfo();
278 Allocator.Deallocate(JumpTableInfo);
279 JumpTableInfo = nullptr;
280 }
281
282 // Don't call destructors on MachineInstr and MachineOperand. All of their
283 // memory comes from the BumpPtrAllocator which is about to be purged.
284 //
285 // Do call MachineBasicBlock destructors, it contains std::vectors.
286 for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
287 I->Insts.clearAndLeakNodesUnsafely();
288 MBBNumbering.clear();
289
290 InstructionRecycler.clear(Allocator);
291 OperandRecycler.clear(Allocator);
292 BasicBlockRecycler.clear(Allocator);
293 CodeViewAnnotations.clear();
295 if (RegInfo) {
296 RegInfo->~MachineRegisterInfo();
297 Allocator.Deallocate(RegInfo);
298 }
299 if (MFInfo) {
300 MFInfo->~MachineFunctionInfo();
301 Allocator.Deallocate(MFInfo);
302 }
303
304 FrameInfo->~MachineFrameInfo();
305 Allocator.Deallocate(FrameInfo);
306
307 ConstantPool->~MachineConstantPool();
308 Allocator.Deallocate(ConstantPool);
309
310 if (WinEHInfo) {
311 WinEHInfo->~WinEHFuncInfo();
312 Allocator.Deallocate(WinEHInfo);
313 }
314}
315
317 return F.getDataLayout();
318}
319
320/// Get the JumpTableInfo for this function.
321/// If it does not already exist, allocate one.
323getOrCreateJumpTableInfo(unsigned EntryKind) {
324 if (JumpTableInfo) return JumpTableInfo;
325
326 JumpTableInfo = new (Allocator)
328 return JumpTableInfo;
329}
330
332 return F.getDenormalMode(FPType);
333}
334
335/// Should we be emitting segmented stack stuff for the function
337 return getFunction().hasFnAttribute("split-stack");
338}
339
341 Align PrefAlignment;
342
343 if (MaybeAlign A = F.getPreferredAlignment())
344 PrefAlignment = *A;
345 else if (!F.hasOptSize())
346 PrefAlignment = STI.getTargetLowering()->getPrefFunctionAlignment();
347 else
348 PrefAlignment = Align(1);
349
350 return std::max(PrefAlignment, getAlignment());
351}
352
353[[nodiscard]] unsigned
355 FrameInstructions.push_back(Inst);
356 return FrameInstructions.size() - 1;
357}
358
359/// This discards all of the MachineBasicBlock numbers and recomputes them.
360/// This guarantees that the MBB numbers are sequential, dense, and match the
361/// ordering of the blocks within the function. If a specific MachineBasicBlock
362/// is specified, only that block and those after it are renumbered.
364 if (empty()) { MBBNumbering.clear(); return; }
366 if (MBB == nullptr)
367 MBBI = begin();
368 else
369 MBBI = MBB->getIterator();
370
371 // Figure out the block number this should have.
372 unsigned BlockNo = 0;
373 if (MBBI != begin())
374 BlockNo = std::prev(MBBI)->getNumber() + 1;
375
376 for (; MBBI != E; ++MBBI, ++BlockNo) {
377 if (MBBI->getNumber() != (int)BlockNo) {
378 // Remove use of the old number.
379 if (MBBI->getNumber() != -1) {
380 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
381 "MBB number mismatch!");
382 MBBNumbering[MBBI->getNumber()] = nullptr;
383 }
384
385 // If BlockNo is already taken, set that block's number to -1.
386 if (MBBNumbering[BlockNo])
387 MBBNumbering[BlockNo]->setNumber(-1);
388
389 MBBNumbering[BlockNo] = &*MBBI;
390 MBBI->setNumber(BlockNo);
391 }
392 }
393
394 // Okay, all the blocks are renumbered. If we have compactified the block
395 // numbering, shrink MBBNumbering now.
396 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
397 MBBNumbering.resize(BlockNo);
398}
399
402 const Align FunctionAlignment = getAlignment();
404 /// Offset - Distance from the beginning of the function to the end
405 /// of the basic block.
406 int64_t Offset = 0;
407
408 for (; MBBI != E; ++MBBI) {
409 const Align Alignment = MBBI->getAlignment();
410 int64_t BlockSize = 0;
411
412 for (auto &MI : *MBBI) {
413 BlockSize += TII.getInstSizeInBytes(MI);
414 }
415
416 int64_t OffsetBB;
417 if (Alignment <= FunctionAlignment) {
418 OffsetBB = alignTo(Offset, Alignment);
419 } else {
420 // The alignment of this MBB is larger than the function's alignment, so
421 // we can't tell whether or not it will insert nops. Assume that it will.
422 OffsetBB = alignTo(Offset, Alignment) + Alignment.value() -
423 FunctionAlignment.value();
424 }
425 Offset = OffsetBB + BlockSize;
426 }
427
428 return Offset;
429}
430
431/// This method iterates over the basic blocks and assigns their IsBeginSection
432/// and IsEndSection fields. This must be called after MBB layout is finalized
433/// and the SectionID's are assigned to MBBs.
436 auto CurrentSectionID = front().getSectionID();
437 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
438 if (MBBI->getSectionID() == CurrentSectionID)
439 continue;
440 MBBI->setIsBeginSection();
441 std::prev(MBBI)->setIsEndSection();
442 CurrentSectionID = MBBI->getSectionID();
443 }
445}
446
447/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
448MachineInstr *MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
449 DebugLoc DL,
450 bool NoImplicit) {
451 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
452 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
453}
454
455/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
456/// identical in all ways except the instruction has no parent, prev, or next.
458MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
459 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
460 MachineInstr(*this, *Orig);
461}
462
463MachineInstr &MachineFunction::cloneMachineInstrBundle(
465 const MachineInstr &Orig) {
466 MachineInstr *FirstClone = nullptr;
468 while (true) {
469 MachineInstr *Cloned = CloneMachineInstr(&*I);
470 MBB.insert(InsertBefore, Cloned);
471 if (FirstClone == nullptr) {
472 FirstClone = Cloned;
473 } else {
474 Cloned->bundleWithPred();
475 }
476
477 if (!I->isBundledWithSucc())
478 break;
479 ++I;
480 }
481 // Copy over call info to the cloned instruction if needed. If Orig is in
482 // a bundle, copyAdditionalCallInfo takes care of finding the call instruction
483 // in the bundle.
485 copyAdditionalCallInfo(&Orig, FirstClone);
486 return *FirstClone;
487}
488
489/// Delete the given MachineInstr.
490///
491/// This function also serves as the MachineInstr destructor - the real
492/// ~MachineInstr() destructor must be empty.
493void MachineFunction::deleteMachineInstr(MachineInstr *MI) {
494 // Verify that a call site info is at valid state. This assertion should
495 // be triggered during the implementation of support for the
496 // call site info of a new architecture. If the assertion is triggered,
497 // back trace will tell where to insert a call to updateCallSiteInfo().
498 assert((!MI->isCandidateForAdditionalCallInfo() ||
499 !CallSitesInfo.contains(MI)) &&
500 "Call site info was not updated!");
501 // Verify that the "called globals" info is in a valid state.
502 assert((!MI->isCandidateForAdditionalCallInfo() ||
503 !CalledGlobalsInfo.contains(MI)) &&
504 "Called globals info was not updated!");
505 // Strip it for parts. The operand array and the MI object itself are
506 // independently recyclable.
507 if (MI->Operands)
508 deallocateOperandArray(MI->CapOperands, MI->Operands);
509 // Don't call ~MachineInstr() which must be trivial anyway because
510 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
511 // destructors.
512 InstructionRecycler.Deallocate(Allocator, MI);
513}
514
515/// Allocate a new MachineBasicBlock. Use this instead of
516/// `new MachineBasicBlock'.
519 std::optional<UniqueBBID> BBID) {
521 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
522 MachineBasicBlock(*this, BB);
523 // Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
524 // allow robust mapping of profiles to basic blocks.
525 if (Target.Options.BBAddrMap ||
526 Target.getBBSectionsType() == BasicBlockSection::List)
527 MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
528 return MBB;
529}
530
531/// Delete the given MachineBasicBlock.
533 assert(MBB->getParent() == this && "MBB parent mismatch!");
534 // Clean up any references to MBB in jump tables before deleting it.
535 if (JumpTableInfo)
536 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
537 MBB->~MachineBasicBlock();
538 BasicBlockRecycler.Deallocate(Allocator, MBB);
539}
540
543 Align BaseAlignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
544 SyncScope::ID SSID, AtomicOrdering Ordering,
545 AtomicOrdering FailureOrdering) {
546 assert((!Size.hasValue() ||
547 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
548 "Unexpected an unknown size to be represented using "
549 "LocationSize::beforeOrAfter()");
550 return new (Allocator)
551 MachineMemOperand(PtrInfo, F, Size, BaseAlignment, AAInfo, Ranges, SSID,
552 Ordering, FailureOrdering);
553}
554
557 Align base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
558 SyncScope::ID SSID, AtomicOrdering Ordering,
559 AtomicOrdering FailureOrdering) {
560 return new (Allocator)
561 MachineMemOperand(PtrInfo, f, MemTy, base_alignment, AAInfo, Ranges, SSID,
562 Ordering, FailureOrdering);
563}
564
567 const MachinePointerInfo &PtrInfo,
569 assert((!Size.hasValue() ||
570 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
571 "Unexpected an unknown size to be represented using "
572 "LocationSize::beforeOrAfter()");
573 return new (Allocator)
574 MachineMemOperand(PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
575 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
577}
578
580 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
581 return new (Allocator)
582 MachineMemOperand(PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
583 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
585}
586
589 int64_t Offset, LLT Ty) {
590 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
591
592 // If there is no pointer value, the offset isn't tracked so we need to adjust
593 // the base alignment.
594 Align Alignment = PtrInfo.V.isNull()
596 : MMO->getBaseAlign();
597
598 // Do not preserve ranges, since we don't necessarily know what the high bits
599 // are anymore.
600 return new (Allocator) MachineMemOperand(
601 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
602 MMO->getAAInfo(), nullptr, MMO->getSyncScopeID(),
604}
605
608 const AAMDNodes &AAInfo) {
609 MachinePointerInfo MPI = MMO->getValue() ?
610 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
612
613 return new (Allocator) MachineMemOperand(
614 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(), AAInfo,
615 MMO->getRanges(), MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
616 MMO->getFailureOrdering());
617}
618
622 return new (Allocator) MachineMemOperand(
623 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
624 MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(),
626}
627
628MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
629 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
630 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
631 uint32_t CFIType, MDNode *MMRAs, Value *DS) {
632 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
633 PostInstrSymbol, HeapAllocMarker,
634 PCSections, CFIType, MMRAs, DS);
635}
636
638 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
639 llvm::copy(Name, Dest);
640 Dest[Name.size()] = 0;
641 return Dest;
642}
643
645 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
646 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
647 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
648 memset(Mask, 0, Size * sizeof(Mask[0]));
649 return Mask;
650}
651
653 int* AllocMask = Allocator.Allocate<int>(Mask.size());
654 copy(Mask, AllocMask);
655 return {AllocMask, Mask.size()};
656}
657
658#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
662#endif
663
667
668void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
669 OS << "# Machine code for function " << getName() << ": ";
670 getProperties().print(OS);
671 OS << '\n';
672
673 // Print Frame Information
674 FrameInfo->print(*this, OS);
675
676 // Print JumpTable Information
677 if (JumpTableInfo)
678 JumpTableInfo->print(OS);
679
680 // Print Constant Pool
681 ConstantPool->print(OS);
682
684
685 if (RegInfo && !RegInfo->livein_empty()) {
686 OS << "Function Live Ins: ";
688 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
689 OS << printReg(I->first, TRI);
690 if (I->second)
691 OS << " in " << printReg(I->second, TRI);
692 if (std::next(I) != E)
693 OS << ", ";
694 }
695 OS << '\n';
696 }
697
700 for (const auto &BB : *this) {
701 OS << '\n';
702 // If we print the whole function, print it at its most verbose level.
703 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
704 }
705
706 OS << "\n# End machine code for function " << getName() << ".\n\n";
707}
708
709/// True if this function needs frame moves for debug or exceptions.
711 // TODO: Ideally, what we'd like is to have a switch that allows emitting
712 // synchronous (precise at call-sites only) CFA into .eh_frame. However, even
713 // under this switch, we'd like .debug_frame to be precise when using -g. At
714 // this moment, there's no way to specify that some CFI directives go into
715 // .eh_frame only, while others go into .debug_frame only.
717 F.needsUnwindTableEntry() ||
718 !F.getParent()->debug_compile_units().empty();
719}
720
722 if (MDNode *Node = CB.getMetadata(llvm::LLVMContext::MD_call_target))
724
725 // Numeric callee_type ids are only for indirect calls.
726 if (!CB.isIndirectCall())
727 return;
728
729 MDNode *CalleeTypeList = CB.getMetadata(LLVMContext::MD_callee_type);
730 if (!CalleeTypeList)
731 return;
732
733 for (const MDOperand &Op : CalleeTypeList->operands()) {
734 MDNode *TypeMD = cast<MDNode>(Op);
735 MDString *TypeIdStr = cast<MDString>(TypeMD->getOperand(1));
736 // Compute numeric type id from generalized type id string
737 uint64_t TypeIdVal = MD5Hash(TypeIdStr->getString());
738 IntegerType *Int64Ty = Type::getInt64Ty(CB.getContext());
739 CalleeTypeIds.push_back(
740 ConstantInt::get(Int64Ty, TypeIdVal, /*IsSigned=*/false));
741 }
742}
743
744template <>
746 : public DefaultDOTGraphTraits {
748
749 static std::string getGraphName(const MachineFunction *F) {
750 return ("CFG for '" + F->getName() + "' function").str();
751 }
752
754 const MachineFunction *Graph) {
755 std::string OutStr;
756 {
757 raw_string_ostream OSS(OutStr);
758
759 if (isSimple()) {
760 OSS << printMBBReference(*Node);
761 if (const BasicBlock *BB = Node->getBasicBlock())
762 OSS << ": " << BB->getName();
763 } else
764 Node->print(OSS);
765 }
766
767 if (OutStr[0] == '\n')
768 OutStr.erase(OutStr.begin());
769
770 // Process string output to make it nicer...
771 for (unsigned i = 0; i != OutStr.length(); ++i)
772 if (OutStr[i] == '\n') { // Left justify
773 OutStr[i] = '\\';
774 OutStr.insert(OutStr.begin() + i + 1, 'l');
775 }
776 return OutStr;
777 }
778};
779
781{
782#ifndef NDEBUG
783 ViewGraph(this, "mf" + getName());
784#else
785 errs() << "MachineFunction::viewCFG is only available in debug builds on "
786 << "systems with Graphviz or gv!\n";
787#endif // NDEBUG
788}
789
791{
792#ifndef NDEBUG
793 ViewGraph(this, "mf" + getName(), true);
794#else
795 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
796 << "systems with Graphviz or gv!\n";
797#endif // NDEBUG
798}
799
800/// Add the specified physical register as a live-in value and
801/// create a corresponding virtual register for it.
803 const TargetRegisterClass *RC) {
805 Register VReg = MRI.getLiveInVirtReg(PReg);
806 if (VReg) {
807 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
808 (void)VRegRC;
809 // A physical register can be added several times.
810 // Between two calls, the register class of the related virtual register
811 // may have been constrained to match some operation constraints.
812 // In that case, check that the current register class includes the
813 // physical register and is a sub class of the specified RC.
814 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
815 RC->hasSubClassEq(VRegRC))) &&
816 "Register class mismatch!");
817 return VReg;
818 }
819 VReg = MRI.createVirtualRegister(RC);
820 MRI.addLiveIn(PReg, VReg);
821 return VReg;
822}
823
824/// Return the MCSymbol for the specified non-empty jump table.
825/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
826/// normal 'L' label is returned.
828 bool isLinkerPrivate) const {
829 const DataLayout &DL = getDataLayout();
830 assert(JumpTableInfo && "No jump tables");
831 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
832
833 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
834 : DL.getInternalSymbolPrefix();
835 SmallString<60> Name;
837 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
838 return Ctx.getOrCreateSymbol(Name);
839}
840
841/// Return a function-local symbol to represent the PIC base.
843 const DataLayout &DL = getDataLayout();
844 return Ctx.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
845 Twine(getFunctionNumber()) + "$pb");
846}
847
848/// \name Exception Handling
849/// \{
850
853 unsigned N = LandingPads.size();
854 for (unsigned i = 0; i < N; ++i) {
855 LandingPadInfo &LP = LandingPads[i];
856 if (LP.LandingPadBlock == LandingPad)
857 return LP;
858 }
859
860 LandingPads.push_back(LandingPadInfo(LandingPad));
861 return LandingPads[N];
862}
863
865 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
867 LP.BeginLabels.push_back(BeginLabel);
868 LP.EndLabels.push_back(EndLabel);
869}
870
872 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
874 LP.LandingPadLabel = LandingPadLabel;
875
877 LandingPad->getBasicBlock()->getFirstNonPHIIt();
878 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
879 // If there's no typeid list specified, then "cleanup" is implicit.
880 // Otherwise, id 0 is reserved for the cleanup action.
881 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
882 LP.TypeIds.push_back(0);
883
884 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
885 // correct, but we need to do it this way because of how the DWARF EH
886 // emitter processes the clauses.
887 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
888 Value *Val = LPI->getClause(I - 1);
889 if (LPI->isCatch(I - 1)) {
890 LP.TypeIds.push_back(
892 } else {
893 // Add filters in a list.
894 auto *CVal = cast<Constant>(Val);
895 SmallVector<unsigned, 4> FilterList;
896 for (const Use &U : CVal->operands())
897 FilterList.push_back(
898 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
899
900 LP.TypeIds.push_back(getFilterIDFor(FilterList));
901 }
902 }
903
904 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
905 for (unsigned I = CPI->arg_size(); I != 0; --I) {
906 auto *TypeInfo =
907 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
908 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
909 }
910
911 } else {
912 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
913 }
914
915 return LandingPadLabel;
916}
917
919 ArrayRef<unsigned> Sites) {
920 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
921}
922
924 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
925 if (TypeInfos[i] == TI) return i + 1;
926
927 TypeInfos.push_back(TI);
928 return TypeInfos.size();
929}
930
932 // If the new filter coincides with the tail of an existing filter, then
933 // re-use the existing filter. Folding filters more than this requires
934 // re-ordering filters and/or their elements - probably not worth it.
935 for (unsigned i : FilterEnds) {
936 unsigned j = TyIds.size();
937
938 while (i && j)
939 if (FilterIds[--i] != TyIds[--j])
940 goto try_next;
941
942 if (!j)
943 // The new filter coincides with range [i, end) of the existing filter.
944 return -(1 + i);
945
946try_next:;
947 }
948
949 // Add the new filter.
950 int FilterID = -(1 + FilterIds.size());
951 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
952 llvm::append_range(FilterIds, TyIds);
953 FilterEnds.push_back(FilterIds.size());
954 FilterIds.push_back(0); // terminator
955 return FilterID;
956}
957
959MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
960 assert(MI->isCandidateForAdditionalCallInfo() &&
961 "Call site info refers only to call (MI) candidates");
962
963 if (!Target.Options.EmitCallSiteInfo && !Target.Options.EmitCallGraphSection)
964 return CallSitesInfo.end();
965 return CallSitesInfo.find(MI);
966}
967
968/// Return the call machine instruction or find a call within bundle.
970 if (!MI->isBundle())
971 return MI;
972
973 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
974 getBundleEnd(MI->getIterator())))
975 if (BMI.isCandidateForAdditionalCallInfo())
976 return &BMI;
977
978 llvm_unreachable("Unexpected bundle without a call site candidate");
979}
980
982 assert(MI->shouldUpdateAdditionalCallInfo() &&
983 "Call info refers only to call (MI) candidates or "
984 "candidates inside bundles");
985
986 const MachineInstr *CallMI = getCallInstr(MI);
987
988 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
989 if (CSIt != CallSitesInfo.end())
990 CallSitesInfo.erase(CSIt);
991
992 CalledGlobalsInfo.erase(CallMI);
993}
994
996 const MachineInstr *New) {
998 "Call info refers only to call (MI) candidates or "
999 "candidates inside bundles");
1000
1001 if (!New->isCandidateForAdditionalCallInfo())
1002 return eraseAdditionalCallInfo(Old);
1003
1004 const MachineInstr *OldCallMI = getCallInstr(Old);
1005 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1006 if (CSIt != CallSitesInfo.end()) {
1007 CallSiteInfo CSInfo = CSIt->second;
1008 CallSitesInfo[New] = std::move(CSInfo);
1009 }
1010
1011 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1012 if (CGIt != CalledGlobalsInfo.end()) {
1013 CalledGlobalInfo CGInfo = CGIt->second;
1014 CalledGlobalsInfo[New] = std::move(CGInfo);
1015 }
1016}
1017
1019 const MachineInstr *New) {
1021 "Call info refers only to call (MI) candidates or "
1022 "candidates inside bundles");
1023
1024 if (!New->isCandidateForAdditionalCallInfo())
1025 return eraseAdditionalCallInfo(Old);
1026
1027 const MachineInstr *OldCallMI = getCallInstr(Old);
1028 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1029 if (CSIt != CallSitesInfo.end()) {
1030 CallSiteInfo CSInfo = std::move(CSIt->second);
1031 CallSitesInfo.erase(CSIt);
1032 CallSitesInfo[New] = std::move(CSInfo);
1033 }
1034
1035 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1036 if (CGIt != CalledGlobalsInfo.end()) {
1037 CalledGlobalInfo CGInfo = std::move(CGIt->second);
1038 CalledGlobalsInfo.erase(CGIt);
1039 CalledGlobalsInfo[New] = std::move(CGInfo);
1040 }
1041}
1042
1046
1049 unsigned Subreg) {
1050 // Catch any accidental self-loops.
1051 assert(A.first != B.first);
1052 // Don't allow any substitutions _from_ the memory operand number.
1053 assert(A.second != DebugOperandMemNumber);
1054
1055 DebugValueSubstitutions.push_back({A, B, Subreg});
1056}
1057
1059 MachineInstr &New,
1060 unsigned MaxOperand) {
1061 // If the Old instruction wasn't tracked at all, there is no work to do.
1062 unsigned OldInstrNum = Old.peekDebugInstrNum();
1063 if (!OldInstrNum)
1064 return;
1065
1066 // Iterate over all operands looking for defs to create substitutions for.
1067 // Avoid creating new instr numbers unless we create a new substitution.
1068 // While this has no functional effect, it risks confusing someone reading
1069 // MIR output.
1070 // Examine all the operands, or the first N specified by the caller.
1071 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
1072 for (unsigned int I = 0; I < MaxOperand; ++I) {
1073 const auto &OldMO = Old.getOperand(I);
1074 auto &NewMO = New.getOperand(I);
1075 (void)NewMO;
1076
1077 if (!OldMO.isReg() || !OldMO.isDef())
1078 continue;
1079 assert(NewMO.isDef());
1080
1081 unsigned NewInstrNum = New.getDebugInstrNum();
1082 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
1083 std::make_pair(NewInstrNum, I));
1084 }
1085}
1086
1091
1092 // Check whether this copy-like instruction has already been salvaged into
1093 // an operand pair.
1094 Register Dest;
1095 if (auto CopyDstSrc = TII.isCopyLikeInstr(MI)) {
1096 Dest = CopyDstSrc->Destination->getReg();
1097 } else {
1098 assert(MI.isSubregToReg());
1099 Dest = MI.getOperand(0).getReg();
1100 }
1101
1102 auto CacheIt = DbgPHICache.find(Dest);
1103 if (CacheIt != DbgPHICache.end())
1104 return CacheIt->second;
1105
1106 // Calculate the instruction number to use, or install a DBG_PHI.
1107 auto OperandPair = salvageCopySSAImpl(MI);
1108 DbgPHICache.insert({Dest, OperandPair});
1109 return OperandPair;
1110}
1111
1117
1118 // Chase the value read by a copy-like instruction back to the instruction
1119 // that ultimately _defines_ that value. This may pass:
1120 // * Through multiple intermediate copies, including subregister moves /
1121 // copies,
1122 // * Copies from physical registers that must then be traced back to the
1123 // defining instruction,
1124 // * Or, physical registers may be live-in to (only) the entry block, which
1125 // requires a DBG_PHI to be created.
1126 // We can pursue this problem in that order: trace back through copies,
1127 // optionally through a physical register, to a defining instruction. We
1128 // should never move from physreg to vreg. As we're still in SSA form, no need
1129 // to worry about partial definitions of registers.
1130
1131 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1132 // returns the register read and any subregister identifying which part is
1133 // read.
1134 auto GetRegAndSubreg =
1135 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1136 Register NewReg, OldReg;
1137 unsigned SubReg;
1138 if (Cpy.isCopy()) {
1139 OldReg = Cpy.getOperand(0).getReg();
1140 NewReg = Cpy.getOperand(1).getReg();
1141 SubReg = Cpy.getOperand(1).getSubReg();
1142 } else if (Cpy.isSubregToReg()) {
1143 OldReg = Cpy.getOperand(0).getReg();
1144 NewReg = Cpy.getOperand(1).getReg();
1145 SubReg = Cpy.getOperand(2).getImm();
1146 } else {
1147 auto CopyDetails = *TII.isCopyInstr(Cpy);
1148 const MachineOperand &Src = *CopyDetails.Source;
1149 const MachineOperand &Dest = *CopyDetails.Destination;
1150 OldReg = Dest.getReg();
1151 NewReg = Src.getReg();
1152 SubReg = Src.getSubReg();
1153 }
1154
1155 return {NewReg, SubReg};
1156 };
1157
1158 // First seek either the defining instruction, or a copy from a physreg.
1159 // During search, the current state is the current copy instruction, and which
1160 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1161 // deal with those later.
1162 auto State = GetRegAndSubreg(MI);
1163 auto CurInst = MI.getIterator();
1164 SmallVector<unsigned, 4> SubregsSeen;
1165 while (true) {
1166 // If we've found a copy from a physreg, first portion of search is over.
1167 if (!State.first.isVirtual())
1168 break;
1169
1170 // Record any subregister qualifier.
1171 if (State.second)
1172 SubregsSeen.push_back(State.second);
1173
1174 assert(MRI.hasOneDef(State.first));
1175 MachineInstr &Inst = *MRI.def_begin(State.first)->getParent();
1176 CurInst = Inst.getIterator();
1177
1178 // Any non-copy instruction is the defining instruction we're seeking.
1179 if (!Inst.isCopyLike() && !TII.isCopyLikeInstr(Inst))
1180 break;
1181 State = GetRegAndSubreg(Inst);
1182 };
1183
1184 // Helper lambda to apply additional subregister substitutions to a known
1185 // instruction/operand pair. Adds new (fake) substitutions so that we can
1186 // record the subregister. FIXME: this isn't very space efficient if multiple
1187 // values are tracked back through the same copies; cache something later.
1188 auto ApplySubregisters =
1190 for (unsigned Subreg : reverse(SubregsSeen)) {
1191 // Fetch a new instruction number, not attached to an actual instruction.
1192 unsigned NewInstrNumber = getNewDebugInstrNum();
1193 // Add a substitution from the "new" number to the known one, with a
1194 // qualifying subreg.
1195 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1196 // Return the new number; to find the underlying value, consumers need to
1197 // deal with the qualifying subreg.
1198 P = {NewInstrNumber, 0};
1199 }
1200 return P;
1201 };
1202
1203 // If we managed to find the defining instruction after COPYs, return an
1204 // instruction / operand pair after adding subregister qualifiers.
1205 if (State.first.isVirtual()) {
1206 // Virtual register def -- we can just look up where this happens.
1207 MachineInstr *Inst = MRI.def_begin(State.first)->getParent();
1208 for (auto &MO : Inst->all_defs()) {
1209 if (MO.getReg() != State.first)
1210 continue;
1211 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1212 }
1213
1214 llvm_unreachable("Vreg def with no corresponding operand?");
1215 }
1216
1217 // Our search ended in a copy from a physreg: walk back up the function
1218 // looking for whatever defines the physreg.
1219 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1220 State = GetRegAndSubreg(*CurInst);
1221 Register RegToSeek = State.first;
1222
1223 auto RMII = CurInst->getReverseIterator();
1224 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1225 for (auto &ToExamine : PrevInstrs) {
1226 for (auto &MO : ToExamine.all_defs()) {
1227 // Test for operand that defines something aliasing RegToSeek.
1228 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1229 continue;
1230
1231 return ApplySubregisters(
1232 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1233 }
1234 }
1235
1236 MachineBasicBlock &InsertBB = *CurInst->getParent();
1237
1238 // We reached the start of the block before finding a defining instruction.
1239 // There are numerous scenarios where this can happen:
1240 // * Constant physical registers,
1241 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1242 // * Arguments in the entry block,
1243 // * Exception handling landing pads.
1244 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1245 // the variable value at this position, rather than checking it makes sense.
1246
1247 // Create DBG_PHI for specified physreg.
1248 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1249 TII.get(TargetOpcode::DBG_PHI));
1250 Builder.addReg(State.first);
1251 unsigned NewNum = getNewDebugInstrNum();
1252 Builder.addImm(NewNum);
1253 return ApplySubregisters({NewNum, 0u});
1254}
1255
1257 auto *TII = getSubtarget().getInstrInfo();
1258
1259 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1260 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1261 MI.setDesc(RefII);
1262 MI.setDebugValueUndef();
1263 };
1264
1266 for (auto &MBB : *this) {
1267 for (auto &MI : MBB) {
1268 if (!MI.isDebugRef())
1269 continue;
1270
1271 bool IsValidRef = true;
1272
1273 for (MachineOperand &MO : MI.debug_operands()) {
1274 if (!MO.isReg())
1275 continue;
1276
1277 Register Reg = MO.getReg();
1278
1279 // Some vregs can be deleted as redundant in the meantime. Mark those
1280 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1281 // quickly deleted, leaving dangling references to vregs with no def.
1282 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1283 IsValidRef = false;
1284 break;
1285 }
1286
1287 assert(Reg.isVirtual());
1288 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1289
1290 // If we've found a copy-like instruction, follow it back to the
1291 // instruction that defines the source value, see salvageCopySSA docs
1292 // for why this is important.
1293 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1294 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1295 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1296 } else {
1297 // Otherwise, identify the operand number that the VReg refers to.
1298 unsigned OperandIdx = 0;
1299 for (const auto &DefMO : DefMI.operands()) {
1300 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1301 break;
1302 ++OperandIdx;
1303 }
1304 assert(OperandIdx < DefMI.getNumOperands());
1305
1306 // Morph this instr ref to point at the given instruction and operand.
1307 unsigned ID = DefMI.getDebugInstrNum();
1308 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1309 }
1310 }
1311
1312 if (!IsValidRef)
1313 MakeUndefDbgValue(MI);
1314 }
1315 }
1316}
1317
1319 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1320 // have optimized code inlined into this unoptimized code, however with
1321 // fewer and less aggressive optimizations happening, coverage and accuracy
1322 // should not suffer.
1323 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1324 return false;
1325
1326 // Don't use instr-ref if this function is marked optnone.
1327 if (F.hasFnAttribute(Attribute::OptimizeNone))
1328 return false;
1329
1330 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1331 return true;
1332
1333 return false;
1334}
1335
1337 return UseDebugInstrRef;
1338}
1339
1343
1344// Use one million as a high / reserved number.
1345const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1346
1347/// \}
1348
1349//===----------------------------------------------------------------------===//
1350// MachineJumpTableInfo implementation
1351//===----------------------------------------------------------------------===//
1352
1354 const std::vector<MachineBasicBlock *> &MBBs)
1356
1357/// Return the size of each entry in the jump table.
1359 // The size of a jump table entry is 4 bytes unless the entry is just the
1360 // address of a block, in which case it is the pointer size.
1361 switch (getEntryKind()) {
1363 return TD.getPointerSize();
1366 return 8;
1370 return 4;
1372 return 0;
1373 }
1374 llvm_unreachable("Unknown jump table encoding!");
1375}
1376
1377/// Return the alignment of each entry in the jump table.
1379 // The alignment of a jump table entry is the alignment of int32 unless the
1380 // entry is just the address of a block, in which case it is the pointer
1381 // alignment.
1382 switch (getEntryKind()) {
1384 return TD.getPointerABIAlignment(0).value();
1387 return TD.getABIIntegerTypeAlignment(64).value();
1391 return TD.getABIIntegerTypeAlignment(32).value();
1393 return 1;
1394 }
1395 llvm_unreachable("Unknown jump table encoding!");
1396}
1397
1398/// Create a new jump table entry in the jump table info.
1400 const std::vector<MachineBasicBlock*> &DestBBs) {
1401 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1402 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1403 return JumpTables.size()-1;
1404}
1405
1407 size_t JTI, MachineFunctionDataHotness Hotness) {
1408 assert(JTI < JumpTables.size() && "Invalid JTI!");
1409 // Record the largest hotness value.
1410 if (Hotness <= JumpTables[JTI].Hotness)
1411 return false;
1412
1413 JumpTables[JTI].Hotness = Hotness;
1414 return true;
1415}
1416
1417/// If Old is the target of any jump tables, update the jump tables to branch
1418/// to New instead.
1420 MachineBasicBlock *New) {
1421 assert(Old != New && "Not making a change?");
1422 bool MadeChange = false;
1423 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1424 ReplaceMBBInJumpTable(i, Old, New);
1425 return MadeChange;
1426}
1427
1428/// If MBB is present in any jump tables, remove it.
1430 bool MadeChange = false;
1431 for (MachineJumpTableEntry &JTE : JumpTables) {
1432 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1433 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1434 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1435 }
1436 return MadeChange;
1437}
1438
1439/// If Old is a target of the jump tables, update the jump table to branch to
1440/// New instead.
1442 MachineBasicBlock *Old,
1443 MachineBasicBlock *New) {
1444 assert(Old != New && "Not making a change?");
1445 bool MadeChange = false;
1446 MachineJumpTableEntry &JTE = JumpTables[Idx];
1447 for (MachineBasicBlock *&MBB : JTE.MBBs)
1448 if (MBB == Old) {
1449 MBB = New;
1450 MadeChange = true;
1451 }
1452 return MadeChange;
1453}
1454
1456 if (JumpTables.empty()) return;
1457
1458 OS << "Jump Tables:\n";
1459
1460 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1461 OS << printJumpTableEntryReference(i) << ':';
1462 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1463 OS << ' ' << printMBBReference(*MBB);
1464 OS << '\n';
1465 }
1466
1467 OS << '\n';
1468}
1469
1470#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1472#endif
1473
1475 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1476}
1477
1478//===----------------------------------------------------------------------===//
1479// MachineConstantPool implementation
1480//===----------------------------------------------------------------------===//
1481
1482void MachineConstantPoolValue::anchor() {}
1483
1485 return DL.getTypeAllocSize(Ty);
1486}
1487
1490 return Val.MachineCPVal->getSizeInBytes(DL);
1491 return DL.getTypeAllocSize(Val.ConstVal->getType());
1492}
1493
1496 return true;
1497 return Val.ConstVal->needsDynamicRelocation();
1498}
1499
1502 if (needsRelocation())
1504 switch (getSizeInBytes(*DL)) {
1505 case 4:
1507 case 8:
1509 case 16:
1511 case 32:
1513 default:
1514 return SectionKind::getReadOnly();
1515 }
1516}
1517
1519 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1520 // so keep track of which we've deleted to avoid double deletions.
1522 for (const MachineConstantPoolEntry &C : Constants)
1523 if (C.isMachineConstantPoolEntry()) {
1524 Deleted.insert(C.Val.MachineCPVal);
1525 delete C.Val.MachineCPVal;
1526 }
1527 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1528 if (Deleted.count(CPV) == 0)
1529 delete CPV;
1530 }
1531}
1532
1533/// Test whether the given two constants can be allocated the same constant pool
1534/// entry referenced by \param A.
1535static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1536 const DataLayout &DL) {
1537 // Handle the trivial case quickly.
1538 if (A == B) return true;
1539
1540 // If they have the same type but weren't the same constant, quickly
1541 // reject them.
1542 if (A->getType() == B->getType()) return false;
1543
1544 // We can't handle structs or arrays.
1545 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1546 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1547 return false;
1548
1549 // For now, only support constants with the same size.
1550 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1551 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1552 return false;
1553
1554 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1555
1556 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1557
1558 // Try constant folding a bitcast of both instructions to an integer. If we
1559 // get two identical ConstantInt's, then we are good to share them. We use
1560 // the constant folding APIs to do this so that we get the benefit of
1561 // DataLayout.
1562 if (isa<PointerType>(A->getType()))
1563 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1564 const_cast<Constant *>(A), IntTy, DL);
1565 else if (A->getType() != IntTy)
1566 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1567 IntTy, DL);
1568 if (isa<PointerType>(B->getType()))
1569 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1570 const_cast<Constant *>(B), IntTy, DL);
1571 else if (B->getType() != IntTy)
1572 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1573 IntTy, DL);
1574
1575 if (A != B)
1576 return false;
1577
1578 // Constants only safely match if A doesn't contain undef/poison.
1579 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1580 // TODO: Handle cases where A and B have the same undef/poison elements.
1581 // TODO: Merge A and B with mismatching undef/poison elements.
1582 return !ContainsUndefOrPoisonA;
1583}
1584
1585/// Create a new entry in the constant pool or return an existing one.
1586/// User must specify the log2 of the minimum required alignment for the object.
1588 Align Alignment) {
1589 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1590
1591 // Check to see if we already have this constant.
1592 //
1593 // FIXME, this could be made much more efficient for large constant pools.
1594 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1595 if (!Constants[i].isMachineConstantPoolEntry() &&
1596 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1597 if (Constants[i].getAlign() < Alignment)
1598 Constants[i].Alignment = Alignment;
1599 return i;
1600 }
1601
1602 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1603 return Constants.size()-1;
1604}
1605
1607 Align Alignment) {
1608 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1609
1610 // Check to see if we already have this constant.
1611 //
1612 // FIXME, this could be made much more efficient for large constant pools.
1613 int Idx = V->getExistingMachineCPValue(this, Alignment);
1614 if (Idx != -1) {
1615 MachineCPVsSharingEntries.insert(V);
1616 return (unsigned)Idx;
1617 }
1618
1619 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1620 return Constants.size()-1;
1621}
1622
1624 if (Constants.empty()) return;
1625
1626 OS << "Constant Pool:\n";
1627 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1628 OS << " cp#" << i << ": ";
1629 if (Constants[i].isMachineConstantPoolEntry())
1630 Constants[i].Val.MachineCPVal->print(OS);
1631 else
1632 Constants[i].Val.ConstVal->printAsOperand(OS, /*PrintType=*/false);
1633 OS << ", align=" << Constants[i].getAlign().value();
1634 OS << "\n";
1635 }
1636}
1637
1638//===----------------------------------------------------------------------===//
1639// Template specialization for MachineFunction implementation of
1640// ProfileSummaryInfo::getEntryCount().
1641//===----------------------------------------------------------------------===//
1642template <>
1643std::optional<Function::ProfileCount>
1644ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1645 const llvm::MachineFunction *F) const {
1646 return F->getFunction().getEntryCount();
1647}
1648
1649#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1651#endif
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
MachineBasicBlock & MBB
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< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:661
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static FramePointerKind getFramePointerPolicy(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 Align getFnStackAlignment(const TargetSubtargetInfo &STI, const Function &F)
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)
Register const TargetRegisterInfo * TRI
This file contains the declarations for metadata subclasses.
#define P(N)
Basic Register Allocator
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.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static const int BlockSize
Definition TarWriter.cpp:33
This file describes how to lower LLVM code to machine code.
void print(OutputBuffer &OB) const
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:105
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:261
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
unsigned size_type
Definition BitVector.h:115
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
Definition DataLayout.h:641
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
A debug info location.
Definition DebugLoc.h:123
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
iterator end()
Definition DenseMap.h:81
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:728
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:354
Context object for machine code objects.
Definition MCContext.h:83
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.
Definition MCRegister.h:41
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1442
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
A single uniqued string.
Definition Metadata.h:722
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:632
void setIsEndSection(bool V=true)
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
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.
LLVM_ABI 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.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@004270020304201266316354007027341142157160323045 Val
The constant itself.
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 ...
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 setFramePointerPolicy(FramePointerKind Kind)
LLVM_ABI void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & reset(Property P)
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.
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.
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.
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.
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, Value *DS=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
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 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.
Align getPreferredAlignment() const
Returns the preferred alignment which comes from the function attributes (optsize,...
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.
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)
CreateMachineInstr - Allocate a new MachineInstr.
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.
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
filtered_mop_range all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
LLVM_ABI bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
LLVM_ABI bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
LLVM_ABI unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
LLVM_ABI unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
LLVM_ABI void dump() const
dump - Call to stderr.
LLVM_ABI 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...
LLVM_ABI 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,...
LLVM_ABI unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
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.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
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,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
def_iterator def_begin(Register RegNo) const
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
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.
LLVM_ABI Register getLiveInVirtReg(MCRegister PReg) const
getLiveInVirtReg - If PReg is a live-in physical register, return the corresponding live-in virtual r...
const TargetRegisterInfo * getTargetRegisterInfo() const
void addLiveIn(MCRegister Reg, Register vreg=Register())
addLiveIn - Add the specified register as a live-in.
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
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&)>.
Definition Printable.h:38
Wrapper class representing virtual and physical registers.
Definition Register.h:20
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
static SectionKind getMergeableConst4()
static SectionKind getReadOnlyWithRel()
static SectionKind getMergeableConst8()
static SectionKind getMergeableConst16()
static SectionKind getReadOnly()
static SectionKind getMergeableConst32()
SlotIndexes pass.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:55
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
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 getMinFunctionAlignment() const
Return the minimum function alignment.
Primary interface to the complete machine description for the target machine.
TargetOptions Options
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 TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:314
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:709
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:318
self_iterator getIterator()
Definition ilist_node.h:123
iterator erase(iterator where)
Definition ilist.h:204
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
uint64_t MD5Hash(const FunctionId &Obj)
Definition FunctionId.h:167
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:557
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
FramePointerKind
Definition CodeGen.h:118
MaybeAlign getAlign(const CallInst &I, unsigned Index)
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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.
Definition STLExtras.h:2207
LLVM_ABI Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
MachineFunctionDataHotness
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
auto reverse(ContainerTy &&C)
Definition STLExtras.h:407
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
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...
Definition Casting.h:547
LLVM_ABI 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...
DWARFExpression::Operation Op
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)
Definition STLExtras.h:1884
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
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.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
std::string getNodeLabel(const MachineBasicBlock *Node, const MachineFunction *Graph)
static std::string getGraphName(const MachineFunction *F)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
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
MachineBasicBlock * LandingPadBlock
SmallVector< MCSymbol *, 1 > BeginLabels
std::vector< int > TypeIds
SmallVector< ConstantInt *, 4 > CalleeTypeIds
Callee type ids.
MDNode * CallTarget
'call_target' metadata for the DISubprogram.
MachineJumpTableEntry - One jump table in the jump table info.
LLVM_ABI MachineJumpTableEntry(const std::vector< MachineBasicBlock * > &M)
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
MachineFunctionDataHotness Hotness
The hotness of MJTE is inferred from the hotness of the source basic block(s) that reference it.
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
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
static void deleteNode(NodeTy *V)
Definition ilist.h:42