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
360 MCRegister ToReg) {
361 const MCRegisterInfo *MCRI = Ctx.getRegisterInfo();
362 unsigned DwarfFromReg = MCRI->getDwarfRegNum(FromReg, false);
363 unsigned DwarfToReg = MCRI->getDwarfRegNum(ToReg, false);
364
365 for (MCCFIInstruction &Inst : FrameInstructions)
366 Inst.replaceRegister(DwarfFromReg, DwarfToReg);
367}
368
369/// This discards all of the MachineBasicBlock numbers and recomputes them.
370/// This guarantees that the MBB numbers are sequential, dense, and match the
371/// ordering of the blocks within the function. If a specific MachineBasicBlock
372/// is specified, only that block and those after it are renumbered.
374 if (empty()) { MBBNumbering.clear(); return; }
376 if (MBB == nullptr)
377 MBBI = begin();
378 else
379 MBBI = MBB->getIterator();
380
381 // Figure out the block number this should have.
382 unsigned BlockNo = 0;
383 if (MBBI != begin())
384 BlockNo = std::prev(MBBI)->getNumber() + 1;
385
386 for (; MBBI != E; ++MBBI, ++BlockNo) {
387 if (MBBI->getNumber() != (int)BlockNo) {
388 // Remove use of the old number.
389 if (MBBI->getNumber() != -1) {
390 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
391 "MBB number mismatch!");
392 MBBNumbering[MBBI->getNumber()] = nullptr;
393 }
394
395 // If BlockNo is already taken, set that block's number to -1.
396 if (MBBNumbering[BlockNo])
397 MBBNumbering[BlockNo]->setNumber(-1);
398
399 MBBNumbering[BlockNo] = &*MBBI;
400 MBBI->setNumber(BlockNo);
401 }
402 }
403
404 // Okay, all the blocks are renumbered. If we have compactified the block
405 // numbering, shrink MBBNumbering now.
406 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
407 MBBNumbering.resize(BlockNo);
408}
409
412 const Align FunctionAlignment = getAlignment();
414 /// Offset - Distance from the beginning of the function to the end
415 /// of the basic block.
416 int64_t Offset = 0;
417
418 for (; MBBI != E; ++MBBI) {
419 const Align Alignment = MBBI->getAlignment();
420 int64_t BlockSize = 0;
421
422 for (auto &MI : *MBBI) {
423 BlockSize += TII.getInstSizeInBytes(MI);
424 }
425
426 int64_t OffsetBB;
427 if (Alignment <= FunctionAlignment) {
428 OffsetBB = alignTo(Offset, Alignment);
429 } else {
430 // The alignment of this MBB is larger than the function's alignment, so
431 // we can't tell whether or not it will insert nops. Assume that it will.
432 OffsetBB = alignTo(Offset, Alignment) + Alignment.value() -
433 FunctionAlignment.value();
434 }
435 Offset = OffsetBB + BlockSize;
436 }
437
438 return Offset;
439}
440
441/// This method iterates over the basic blocks and assigns their IsBeginSection
442/// and IsEndSection fields. This must be called after MBB layout is finalized
443/// and the SectionID's are assigned to MBBs.
446 auto CurrentSectionID = front().getSectionID();
447 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
448 if (MBBI->getSectionID() == CurrentSectionID)
449 continue;
450 MBBI->setIsBeginSection();
451 std::prev(MBBI)->setIsEndSection();
452 CurrentSectionID = MBBI->getSectionID();
453 }
455}
456
457/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
458MachineInstr *MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
459 DebugLoc DL,
460 bool NoImplicit) {
461 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
462 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
463}
464
465/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
466/// identical in all ways except the instruction has no parent, prev, or next.
468MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
469 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
470 MachineInstr(*this, *Orig);
471}
472
473MachineInstr &MachineFunction::cloneMachineInstrBundle(
475 const MachineInstr &Orig) {
476 MachineInstr *FirstClone = nullptr;
478 while (true) {
479 MachineInstr *Cloned = CloneMachineInstr(&*I);
480 MBB.insert(InsertBefore, Cloned);
481 if (FirstClone == nullptr) {
482 FirstClone = Cloned;
483 } else {
484 Cloned->bundleWithPred();
485 }
486
487 if (!I->isBundledWithSucc())
488 break;
489 ++I;
490 }
491 // Copy over call info to the cloned instruction if needed. If Orig is in
492 // a bundle, copyAdditionalCallInfo takes care of finding the call instruction
493 // in the bundle.
495 copyAdditionalCallInfo(&Orig, FirstClone);
496 return *FirstClone;
497}
498
499/// Delete the given MachineInstr.
500///
501/// This function also serves as the MachineInstr destructor - the real
502/// ~MachineInstr() destructor must be empty.
503void MachineFunction::deleteMachineInstr(MachineInstr *MI) {
504 // Verify that a call site info is at valid state. This assertion should
505 // be triggered during the implementation of support for the
506 // call site info of a new architecture. If the assertion is triggered,
507 // back trace will tell where to insert a call to updateCallSiteInfo().
508 assert((!MI->isCandidateForAdditionalCallInfo() ||
509 !CallSitesInfo.contains(MI)) &&
510 "Call site info was not updated!");
511 // Verify that the "called globals" info is in a valid state.
512 assert((!MI->isCandidateForAdditionalCallInfo() ||
513 !CalledGlobalsInfo.contains(MI)) &&
514 "Called globals info was not updated!");
515 // Strip it for parts. The operand array and the MI object itself are
516 // independently recyclable.
517 if (MI->Operands)
518 deallocateOperandArray(MI->CapOperands, MI->Operands);
519 // Don't call ~MachineInstr() which must be trivial anyway because
520 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
521 // destructors.
522 InstructionRecycler.Deallocate(Allocator, MI);
523}
524
525/// Allocate a new MachineBasicBlock. Use this instead of
526/// `new MachineBasicBlock'.
529 std::optional<UniqueBBID> BBID) {
531 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
532 MachineBasicBlock(*this, BB);
533 // Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
534 // allow robust mapping of profiles to basic blocks.
535 if (Target.Options.BBAddrMap ||
536 Target.getBBSectionsType() == BasicBlockSection::List)
537 MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
538 return MBB;
539}
540
541/// Delete the given MachineBasicBlock.
543 assert(MBB->getParent() == this && "MBB parent mismatch!");
544 // Clean up any references to MBB in jump tables before deleting it.
545 if (JumpTableInfo)
546 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
547 MBB->~MachineBasicBlock();
548 BasicBlockRecycler.Deallocate(Allocator, MBB);
549}
550
553 Align BaseAlignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
554 SyncScope::ID SSID, AtomicOrdering Ordering,
555 AtomicOrdering FailureOrdering) {
556 assert((!Size.hasValue() ||
557 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
558 "Unexpected an unknown size to be represented using "
559 "LocationSize::beforeOrAfter()");
560 return new (Allocator)
561 MachineMemOperand(PtrInfo, F, Size, BaseAlignment, AAInfo, Ranges, SSID,
562 Ordering, FailureOrdering);
563}
564
567 Align base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
568 SyncScope::ID SSID, AtomicOrdering Ordering,
569 AtomicOrdering FailureOrdering) {
570 return new (Allocator)
571 MachineMemOperand(PtrInfo, f, MemTy, base_alignment, AAInfo, Ranges, SSID,
572 Ordering, FailureOrdering);
573}
574
577 const MachinePointerInfo &PtrInfo,
579 assert((!Size.hasValue() ||
580 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
581 "Unexpected an unknown size to be represented using "
582 "LocationSize::beforeOrAfter()");
583 return new (Allocator)
584 MachineMemOperand(PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
585 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
587}
588
590 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
591 return new (Allocator)
592 MachineMemOperand(PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
593 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
595}
596
599 int64_t Offset, LLT Ty) {
600 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
601
602 // If there is no pointer value, the offset isn't tracked so we need to adjust
603 // the base alignment.
604 Align Alignment = PtrInfo.V.isNull()
606 : MMO->getBaseAlign();
607
608 // Do not preserve ranges, since we don't necessarily know what the high bits
609 // are anymore.
610 return new (Allocator) MachineMemOperand(
611 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
612 MMO->getAAInfo(), nullptr, MMO->getSyncScopeID(),
614}
615
618 const AAMDNodes &AAInfo) {
619 MachinePointerInfo MPI = MMO->getValue() ?
620 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
622
623 return new (Allocator) MachineMemOperand(
624 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(), AAInfo,
625 MMO->getRanges(), MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
626 MMO->getFailureOrdering());
627}
628
632 return new (Allocator) MachineMemOperand(
633 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
634 MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(),
636}
637
638MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
639 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
640 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
641 uint32_t CFIType, MDNode *MMRAs, Value *DS) {
642 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
643 PostInstrSymbol, HeapAllocMarker,
644 PCSections, CFIType, MMRAs, DS);
645}
646
648 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
649 llvm::copy(Name, Dest);
650 Dest[Name.size()] = 0;
651 return Dest;
652}
653
655 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
656 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
657 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
658 memset(Mask, 0, Size * sizeof(Mask[0]));
659 return Mask;
660}
661
663 int* AllocMask = Allocator.Allocate<int>(Mask.size());
664 copy(Mask, AllocMask);
665 return {AllocMask, Mask.size()};
666}
667
668#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
672#endif
673
677
678void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
679 OS << "# Machine code for function " << getName() << ": ";
680 getProperties().print(OS);
681 OS << '\n';
682
683 // Print Frame Information
684 FrameInfo->print(*this, OS);
685
686 // Print JumpTable Information
687 if (JumpTableInfo)
688 JumpTableInfo->print(OS);
689
690 // Print Constant Pool
691 ConstantPool->print(OS);
692
694
695 if (RegInfo && !RegInfo->livein_empty()) {
696 OS << "Function Live Ins: ";
698 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
699 OS << printReg(I->first, TRI);
700 if (I->second)
701 OS << " in " << printReg(I->second, TRI);
702 if (std::next(I) != E)
703 OS << ", ";
704 }
705 OS << '\n';
706 }
707
710 for (const auto &BB : *this) {
711 OS << '\n';
712 // If we print the whole function, print it at its most verbose level.
713 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
714 }
715
716 OS << "\n# End machine code for function " << getName() << ".\n\n";
717}
718
719/// True if this function needs frame moves for debug or exceptions.
721 // TODO: Ideally, what we'd like is to have a switch that allows emitting
722 // synchronous (precise at call-sites only) CFA into .eh_frame. However, even
723 // under this switch, we'd like .debug_frame to be precise when using -g. At
724 // this moment, there's no way to specify that some CFI directives go into
725 // .eh_frame only, while others go into .debug_frame only.
727 F.needsUnwindTableEntry() ||
728 !F.getParent()->debug_compile_units().empty();
729}
730
732 if (MDNode *Node = CB.getMetadata(llvm::LLVMContext::MD_call_target))
734
735 // Numeric callee_type ids are only for indirect calls.
736 if (!CB.isIndirectCall())
737 return;
738
739 MDNode *CalleeTypeList = CB.getMetadata(LLVMContext::MD_callee_type);
740 if (!CalleeTypeList)
741 return;
742
743 for (const MDOperand &Op : CalleeTypeList->operands()) {
744 MDNode *TypeMD = cast<MDNode>(Op);
745 MDString *TypeIdStr = cast<MDString>(TypeMD->getOperand(1));
746 // Compute numeric type id from generalized type id string
747 uint64_t TypeIdVal = MD5Hash(TypeIdStr->getString());
748 IntegerType *Int64Ty = Type::getInt64Ty(CB.getContext());
749 CalleeTypeIds.push_back(
750 ConstantInt::get(Int64Ty, TypeIdVal, /*IsSigned=*/false));
751 }
752}
753
754template <>
756 : public DefaultDOTGraphTraits {
758
759 static std::string getGraphName(const MachineFunction *F) {
760 return ("CFG for '" + F->getName() + "' function").str();
761 }
762
764 const MachineFunction *Graph) {
765 std::string OutStr;
766 {
767 raw_string_ostream OSS(OutStr);
768
769 if (isSimple()) {
770 OSS << printMBBReference(*Node);
771 if (const BasicBlock *BB = Node->getBasicBlock())
772 OSS << ": " << BB->getName();
773 } else
774 Node->print(OSS);
775 }
776
777 if (OutStr[0] == '\n')
778 OutStr.erase(OutStr.begin());
779
780 // Process string output to make it nicer...
781 for (unsigned i = 0; i != OutStr.length(); ++i)
782 if (OutStr[i] == '\n') { // Left justify
783 OutStr[i] = '\\';
784 OutStr.insert(OutStr.begin() + i + 1, 'l');
785 }
786 return OutStr;
787 }
788};
789
791{
792#ifndef NDEBUG
793 ViewGraph(this, "mf" + getName());
794#else
795 errs() << "MachineFunction::viewCFG is only available in debug builds on "
796 << "systems with Graphviz or gv!\n";
797#endif // NDEBUG
798}
799
801{
802#ifndef NDEBUG
803 ViewGraph(this, "mf" + getName(), true);
804#else
805 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
806 << "systems with Graphviz or gv!\n";
807#endif // NDEBUG
808}
809
810/// Add the specified physical register as a live-in value and
811/// create a corresponding virtual register for it.
813 const TargetRegisterClass *RC) {
815 Register VReg = MRI.getLiveInVirtReg(PReg);
816 if (VReg) {
817 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
818 (void)VRegRC;
819 // A physical register can be added several times.
820 // Between two calls, the register class of the related virtual register
821 // may have been constrained to match some operation constraints.
822 // In that case, check that the current register class includes the
823 // physical register and is a sub class of the specified RC.
824 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
825 RC->hasSubClassEq(VRegRC))) &&
826 "Register class mismatch!");
827 return VReg;
828 }
829 VReg = MRI.createVirtualRegister(RC);
830 MRI.addLiveIn(PReg, VReg);
831 return VReg;
832}
833
834/// Return the MCSymbol for the specified non-empty jump table.
835/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
836/// normal 'L' label is returned.
838 bool isLinkerPrivate) const {
839 const DataLayout &DL = getDataLayout();
840 assert(JumpTableInfo && "No jump tables");
841 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
842
843 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
844 : DL.getInternalSymbolPrefix();
845 SmallString<60> Name;
847 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
848 return Ctx.getOrCreateSymbol(Name);
849}
850
851/// Return a function-local symbol to represent the PIC base.
853 const DataLayout &DL = getDataLayout();
854 return Ctx.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
855 Twine(getFunctionNumber()) + "$pb");
856}
857
858/// \name Exception Handling
859/// \{
860
863 unsigned N = LandingPads.size();
864 for (unsigned i = 0; i < N; ++i) {
865 LandingPadInfo &LP = LandingPads[i];
866 if (LP.LandingPadBlock == LandingPad)
867 return LP;
868 }
869
870 LandingPads.push_back(LandingPadInfo(LandingPad));
871 return LandingPads[N];
872}
873
875 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
877 LP.BeginLabels.push_back(BeginLabel);
878 LP.EndLabels.push_back(EndLabel);
879}
880
882 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
884 LP.LandingPadLabel = LandingPadLabel;
885
887 LandingPad->getBasicBlock()->getFirstNonPHIIt();
888 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
889 // If there's no typeid list specified, then "cleanup" is implicit.
890 // Otherwise, id 0 is reserved for the cleanup action.
891 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
892 LP.TypeIds.push_back(0);
893
894 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
895 // correct, but we need to do it this way because of how the DWARF EH
896 // emitter processes the clauses.
897 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
898 Value *Val = LPI->getClause(I - 1);
899 if (LPI->isCatch(I - 1)) {
900 LP.TypeIds.push_back(
902 } else {
903 // Add filters in a list.
904 auto *CVal = cast<Constant>(Val);
905 SmallVector<unsigned, 4> FilterList;
906 for (const Use &U : CVal->operands())
907 FilterList.push_back(
908 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
909
910 LP.TypeIds.push_back(getFilterIDFor(FilterList));
911 }
912 }
913
914 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
915 for (unsigned I = CPI->arg_size(); I != 0; --I) {
916 auto *TypeInfo =
917 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
918 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
919 }
920
921 } else {
922 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
923 }
924
925 return LandingPadLabel;
926}
927
929 ArrayRef<unsigned> Sites) {
930 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
931}
932
934 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
935 if (TypeInfos[i] == TI) return i + 1;
936
937 TypeInfos.push_back(TI);
938 return TypeInfos.size();
939}
940
942 // If the new filter coincides with the tail of an existing filter, then
943 // re-use the existing filter. Folding filters more than this requires
944 // re-ordering filters and/or their elements - probably not worth it.
945 for (unsigned i : FilterEnds) {
946 unsigned j = TyIds.size();
947
948 while (i && j)
949 if (FilterIds[--i] != TyIds[--j])
950 goto try_next;
951
952 if (!j)
953 // The new filter coincides with range [i, end) of the existing filter.
954 return -(1 + i);
955
956try_next:;
957 }
958
959 // Add the new filter.
960 int FilterID = -(1 + FilterIds.size());
961 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
962 llvm::append_range(FilterIds, TyIds);
963 FilterEnds.push_back(FilterIds.size());
964 FilterIds.push_back(0); // terminator
965 return FilterID;
966}
967
969MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
970 assert(MI->isCandidateForAdditionalCallInfo() &&
971 "Call site info refers only to call (MI) candidates");
972
973 if (!Target.Options.EmitCallSiteInfo && !Target.Options.EmitCallGraphSection)
974 return CallSitesInfo.end();
975 return CallSitesInfo.find(MI);
976}
977
978/// Return the call machine instruction or find a call within bundle.
980 if (!MI->isBundle())
981 return MI;
982
983 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
984 getBundleEnd(MI->getIterator())))
985 if (BMI.isCandidateForAdditionalCallInfo())
986 return &BMI;
987
988 llvm_unreachable("Unexpected bundle without a call site candidate");
989}
990
992 assert(MI->shouldUpdateAdditionalCallInfo() &&
993 "Call info refers only to call (MI) candidates or "
994 "candidates inside bundles");
995
996 const MachineInstr *CallMI = getCallInstr(MI);
997
998 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
999 if (CSIt != CallSitesInfo.end())
1000 CallSitesInfo.erase(CSIt);
1001
1002 CalledGlobalsInfo.erase(CallMI);
1003}
1004
1006 const MachineInstr *New) {
1008 "Call info refers only to call (MI) candidates or "
1009 "candidates inside bundles");
1010
1011 if (!New->isCandidateForAdditionalCallInfo())
1012 return eraseAdditionalCallInfo(Old);
1013
1014 const MachineInstr *OldCallMI = getCallInstr(Old);
1015 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1016 if (CSIt != CallSitesInfo.end()) {
1017 CallSiteInfo CSInfo = CSIt->second;
1018 CallSitesInfo[New] = std::move(CSInfo);
1019 }
1020
1021 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1022 if (CGIt != CalledGlobalsInfo.end()) {
1023 CalledGlobalInfo CGInfo = CGIt->second;
1024 CalledGlobalsInfo[New] = std::move(CGInfo);
1025 }
1026}
1027
1029 const MachineInstr *New) {
1031 "Call info refers only to call (MI) candidates or "
1032 "candidates inside bundles");
1033
1034 if (!New->isCandidateForAdditionalCallInfo())
1035 return eraseAdditionalCallInfo(Old);
1036
1037 const MachineInstr *OldCallMI = getCallInstr(Old);
1038 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1039 if (CSIt != CallSitesInfo.end()) {
1040 CallSiteInfo CSInfo = std::move(CSIt->second);
1041 CallSitesInfo.erase(CSIt);
1042 CallSitesInfo[New] = std::move(CSInfo);
1043 }
1044
1045 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1046 if (CGIt != CalledGlobalsInfo.end()) {
1047 CalledGlobalInfo CGInfo = std::move(CGIt->second);
1048 CalledGlobalsInfo.erase(CGIt);
1049 CalledGlobalsInfo[New] = std::move(CGInfo);
1050 }
1051}
1052
1056
1059 unsigned Subreg) {
1060 // Catch any accidental self-loops.
1061 assert(A.first != B.first);
1062 // Don't allow any substitutions _from_ the memory operand number.
1063 assert(A.second != DebugOperandMemNumber);
1064
1065 DebugValueSubstitutions.push_back({A, B, Subreg});
1066}
1067
1069 MachineInstr &New,
1070 unsigned MaxOperand) {
1071 // If the Old instruction wasn't tracked at all, there is no work to do.
1072 unsigned OldInstrNum = Old.peekDebugInstrNum();
1073 if (!OldInstrNum)
1074 return;
1075
1076 // Iterate over all operands looking for defs to create substitutions for.
1077 // Avoid creating new instr numbers unless we create a new substitution.
1078 // While this has no functional effect, it risks confusing someone reading
1079 // MIR output.
1080 // Examine all the operands, or the first N specified by the caller.
1081 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
1082 for (unsigned int I = 0; I < MaxOperand; ++I) {
1083 const auto &OldMO = Old.getOperand(I);
1084 auto &NewMO = New.getOperand(I);
1085 (void)NewMO;
1086
1087 if (!OldMO.isReg() || !OldMO.isDef())
1088 continue;
1089 assert(NewMO.isDef());
1090
1091 unsigned NewInstrNum = New.getDebugInstrNum();
1092 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
1093 std::make_pair(NewInstrNum, I));
1094 }
1095}
1096
1101
1102 // Check whether this copy-like instruction has already been salvaged into
1103 // an operand pair.
1104 Register Dest;
1105 if (auto CopyDstSrc = TII.isCopyLikeInstr(MI)) {
1106 Dest = CopyDstSrc->Destination->getReg();
1107 } else {
1108 assert(MI.isSubregToReg());
1109 Dest = MI.getOperand(0).getReg();
1110 }
1111
1112 auto CacheIt = DbgPHICache.find(Dest);
1113 if (CacheIt != DbgPHICache.end())
1114 return CacheIt->second;
1115
1116 // Calculate the instruction number to use, or install a DBG_PHI.
1117 auto OperandPair = salvageCopySSAImpl(MI);
1118 DbgPHICache.insert({Dest, OperandPair});
1119 return OperandPair;
1120}
1121
1127
1128 // Chase the value read by a copy-like instruction back to the instruction
1129 // that ultimately _defines_ that value. This may pass:
1130 // * Through multiple intermediate copies, including subregister moves /
1131 // copies,
1132 // * Copies from physical registers that must then be traced back to the
1133 // defining instruction,
1134 // * Or, physical registers may be live-in to (only) the entry block, which
1135 // requires a DBG_PHI to be created.
1136 // We can pursue this problem in that order: trace back through copies,
1137 // optionally through a physical register, to a defining instruction. We
1138 // should never move from physreg to vreg. As we're still in SSA form, no need
1139 // to worry about partial definitions of registers.
1140
1141 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1142 // returns the register read and any subregister identifying which part is
1143 // read.
1144 auto GetRegAndSubreg =
1145 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1146 Register NewReg, OldReg;
1147 unsigned SubReg;
1148 if (Cpy.isCopy()) {
1149 OldReg = Cpy.getOperand(0).getReg();
1150 NewReg = Cpy.getOperand(1).getReg();
1151 SubReg = Cpy.getOperand(1).getSubReg();
1152 } else if (Cpy.isSubregToReg()) {
1153 OldReg = Cpy.getOperand(0).getReg();
1154 NewReg = Cpy.getOperand(1).getReg();
1155 SubReg = Cpy.getOperand(2).getImm();
1156 } else {
1157 auto CopyDetails = *TII.isCopyInstr(Cpy);
1158 const MachineOperand &Src = *CopyDetails.Source;
1159 const MachineOperand &Dest = *CopyDetails.Destination;
1160 OldReg = Dest.getReg();
1161 NewReg = Src.getReg();
1162 SubReg = Src.getSubReg();
1163 }
1164
1165 return {NewReg, SubReg};
1166 };
1167
1168 // First seek either the defining instruction, or a copy from a physreg.
1169 // During search, the current state is the current copy instruction, and which
1170 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1171 // deal with those later.
1172 auto State = GetRegAndSubreg(MI);
1173 auto CurInst = MI.getIterator();
1174 SmallVector<unsigned, 4> SubregsSeen;
1175 while (true) {
1176 // If we've found a copy from a physreg, first portion of search is over.
1177 if (!State.first.isVirtual())
1178 break;
1179
1180 // Record any subregister qualifier.
1181 if (State.second)
1182 SubregsSeen.push_back(State.second);
1183
1184 assert(MRI.hasOneDef(State.first));
1185 MachineInstr &Inst = *MRI.def_begin(State.first)->getParent();
1186 CurInst = Inst.getIterator();
1187
1188 // Any non-copy instruction is the defining instruction we're seeking.
1189 if (!Inst.isCopyLike() && !TII.isCopyLikeInstr(Inst))
1190 break;
1191 State = GetRegAndSubreg(Inst);
1192 };
1193
1194 // Helper lambda to apply additional subregister substitutions to a known
1195 // instruction/operand pair. Adds new (fake) substitutions so that we can
1196 // record the subregister. FIXME: this isn't very space efficient if multiple
1197 // values are tracked back through the same copies; cache something later.
1198 auto ApplySubregisters =
1200 for (unsigned Subreg : reverse(SubregsSeen)) {
1201 // Fetch a new instruction number, not attached to an actual instruction.
1202 unsigned NewInstrNumber = getNewDebugInstrNum();
1203 // Add a substitution from the "new" number to the known one, with a
1204 // qualifying subreg.
1205 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1206 // Return the new number; to find the underlying value, consumers need to
1207 // deal with the qualifying subreg.
1208 P = {NewInstrNumber, 0};
1209 }
1210 return P;
1211 };
1212
1213 // If we managed to find the defining instruction after COPYs, return an
1214 // instruction / operand pair after adding subregister qualifiers.
1215 if (State.first.isVirtual()) {
1216 // Virtual register def -- we can just look up where this happens.
1217 MachineInstr *Inst = MRI.def_begin(State.first)->getParent();
1218 for (auto &MO : Inst->all_defs()) {
1219 if (MO.getReg() != State.first)
1220 continue;
1221 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1222 }
1223
1224 llvm_unreachable("Vreg def with no corresponding operand?");
1225 }
1226
1227 // Our search ended in a copy from a physreg: walk back up the function
1228 // looking for whatever defines the physreg.
1229 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1230 State = GetRegAndSubreg(*CurInst);
1231 Register RegToSeek = State.first;
1232
1233 auto RMII = CurInst->getReverseIterator();
1234 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1235 for (auto &ToExamine : PrevInstrs) {
1236 for (auto &MO : ToExamine.all_defs()) {
1237 // Test for operand that defines something aliasing RegToSeek.
1238 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1239 continue;
1240
1241 return ApplySubregisters(
1242 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1243 }
1244 }
1245
1246 MachineBasicBlock &InsertBB = *CurInst->getParent();
1247
1248 // We reached the start of the block before finding a defining instruction.
1249 // There are numerous scenarios where this can happen:
1250 // * Constant physical registers,
1251 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1252 // * Arguments in the entry block,
1253 // * Exception handling landing pads.
1254 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1255 // the variable value at this position, rather than checking it makes sense.
1256
1257 // Create DBG_PHI for specified physreg.
1258 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1259 TII.get(TargetOpcode::DBG_PHI));
1260 Builder.addReg(State.first);
1261 unsigned NewNum = getNewDebugInstrNum();
1262 Builder.addImm(NewNum);
1263 return ApplySubregisters({NewNum, 0u});
1264}
1265
1267 auto *TII = getSubtarget().getInstrInfo();
1268
1269 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1270 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1271 MI.setDesc(RefII);
1272 MI.setDebugValueUndef();
1273 };
1274
1276 for (auto &MBB : *this) {
1277 for (auto &MI : MBB) {
1278 if (!MI.isDebugRef())
1279 continue;
1280
1281 bool IsValidRef = true;
1282
1283 for (MachineOperand &MO : MI.debug_operands()) {
1284 if (!MO.isReg())
1285 continue;
1286
1287 Register Reg = MO.getReg();
1288
1289 // Some vregs can be deleted as redundant in the meantime. Mark those
1290 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1291 // quickly deleted, leaving dangling references to vregs with no def.
1292 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1293 IsValidRef = false;
1294 break;
1295 }
1296
1297 assert(Reg.isVirtual());
1298 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1299
1300 // If we've found a copy-like instruction, follow it back to the
1301 // instruction that defines the source value, see salvageCopySSA docs
1302 // for why this is important.
1303 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1304 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1305 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1306 } else {
1307 // Otherwise, identify the operand number that the VReg refers to.
1308 unsigned OperandIdx = 0;
1309 for (const auto &DefMO : DefMI.operands()) {
1310 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1311 break;
1312 ++OperandIdx;
1313 }
1314 assert(OperandIdx < DefMI.getNumOperands());
1315
1316 // Morph this instr ref to point at the given instruction and operand.
1317 unsigned ID = DefMI.getDebugInstrNum();
1318 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1319 }
1320 }
1321
1322 if (!IsValidRef)
1323 MakeUndefDbgValue(MI);
1324 }
1325 }
1326}
1327
1329 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1330 // have optimized code inlined into this unoptimized code, however with
1331 // fewer and less aggressive optimizations happening, coverage and accuracy
1332 // should not suffer.
1333 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1334 return false;
1335
1336 // Don't use instr-ref if this function is marked optnone.
1337 if (F.hasFnAttribute(Attribute::OptimizeNone))
1338 return false;
1339
1340 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1341 return true;
1342
1343 return false;
1344}
1345
1347 return UseDebugInstrRef;
1348}
1349
1353
1354// Use one million as a high / reserved number.
1355const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1356
1357/// \}
1358
1359//===----------------------------------------------------------------------===//
1360// MachineJumpTableInfo implementation
1361//===----------------------------------------------------------------------===//
1362
1364 const std::vector<MachineBasicBlock *> &MBBs)
1366
1367/// Return the size of each entry in the jump table.
1369 // The size of a jump table entry is 4 bytes unless the entry is just the
1370 // address of a block, in which case it is the pointer size.
1371 switch (getEntryKind()) {
1373 return TD.getPointerSize();
1376 return 8;
1380 return 4;
1382 return 0;
1383 }
1384 llvm_unreachable("Unknown jump table encoding!");
1385}
1386
1387/// Return the alignment of each entry in the jump table.
1389 // The alignment of a jump table entry is the alignment of int32 unless the
1390 // entry is just the address of a block, in which case it is the pointer
1391 // alignment.
1392 switch (getEntryKind()) {
1394 return TD.getPointerABIAlignment(0).value();
1397 return TD.getABIIntegerTypeAlignment(64).value();
1401 return TD.getABIIntegerTypeAlignment(32).value();
1403 return 1;
1404 }
1405 llvm_unreachable("Unknown jump table encoding!");
1406}
1407
1408/// Create a new jump table entry in the jump table info.
1410 const std::vector<MachineBasicBlock*> &DestBBs) {
1411 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1412 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1413 return JumpTables.size()-1;
1414}
1415
1417 size_t JTI, MachineFunctionDataHotness Hotness) {
1418 assert(JTI < JumpTables.size() && "Invalid JTI!");
1419 // Record the largest hotness value.
1420 if (Hotness <= JumpTables[JTI].Hotness)
1421 return false;
1422
1423 JumpTables[JTI].Hotness = Hotness;
1424 return true;
1425}
1426
1427/// If Old is the target of any jump tables, update the jump tables to branch
1428/// to New instead.
1430 MachineBasicBlock *New) {
1431 assert(Old != New && "Not making a change?");
1432 bool MadeChange = false;
1433 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1434 ReplaceMBBInJumpTable(i, Old, New);
1435 return MadeChange;
1436}
1437
1438/// If MBB is present in any jump tables, remove it.
1440 bool MadeChange = false;
1441 for (MachineJumpTableEntry &JTE : JumpTables) {
1442 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1443 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1444 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1445 }
1446 return MadeChange;
1447}
1448
1449/// If Old is a target of the jump tables, update the jump table to branch to
1450/// New instead.
1452 MachineBasicBlock *Old,
1453 MachineBasicBlock *New) {
1454 assert(Old != New && "Not making a change?");
1455 bool MadeChange = false;
1456 MachineJumpTableEntry &JTE = JumpTables[Idx];
1457 for (MachineBasicBlock *&MBB : JTE.MBBs)
1458 if (MBB == Old) {
1459 MBB = New;
1460 MadeChange = true;
1461 }
1462 return MadeChange;
1463}
1464
1466 if (JumpTables.empty()) return;
1467
1468 OS << "Jump Tables:\n";
1469
1470 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1471 OS << printJumpTableEntryReference(i) << ':';
1472 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1473 OS << ' ' << printMBBReference(*MBB);
1474 OS << '\n';
1475 }
1476
1477 OS << '\n';
1478}
1479
1480#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1482#endif
1483
1485 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1486}
1487
1488//===----------------------------------------------------------------------===//
1489// MachineConstantPool implementation
1490//===----------------------------------------------------------------------===//
1491
1492void MachineConstantPoolValue::anchor() {}
1493
1495 return DL.getTypeAllocSize(Ty);
1496}
1497
1500 return Val.MachineCPVal->getSizeInBytes(DL);
1501 return DL.getTypeAllocSize(Val.ConstVal->getType());
1502}
1503
1506 return true;
1507 return Val.ConstVal->needsDynamicRelocation();
1508}
1509
1512 if (needsRelocation())
1514 switch (getSizeInBytes(*DL)) {
1515 case 4:
1517 case 8:
1519 case 16:
1521 case 32:
1523 default:
1524 return SectionKind::getReadOnly();
1525 }
1526}
1527
1529 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1530 // so keep track of which we've deleted to avoid double deletions.
1532 for (const MachineConstantPoolEntry &C : Constants)
1533 if (C.isMachineConstantPoolEntry()) {
1534 Deleted.insert(C.Val.MachineCPVal);
1535 delete C.Val.MachineCPVal;
1536 }
1537 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1538 if (Deleted.count(CPV) == 0)
1539 delete CPV;
1540 }
1541}
1542
1543/// Test whether the given two constants can be allocated the same constant pool
1544/// entry referenced by \param A.
1545static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1546 const DataLayout &DL) {
1547 // Handle the trivial case quickly.
1548 if (A == B) return true;
1549
1550 // If they have the same type but weren't the same constant, quickly
1551 // reject them.
1552 if (A->getType() == B->getType()) return false;
1553
1554 // We can't handle structs or arrays.
1555 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1556 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1557 return false;
1558
1559 // For now, only support constants with the same size.
1560 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1561 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1562 return false;
1563
1564 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1565
1566 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1567
1568 // Try constant folding a bitcast of both instructions to an integer. If we
1569 // get two identical ConstantInt's, then we are good to share them. We use
1570 // the constant folding APIs to do this so that we get the benefit of
1571 // DataLayout.
1572 if (isa<PointerType>(A->getType()))
1573 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1574 const_cast<Constant *>(A), IntTy, DL);
1575 else if (A->getType() != IntTy)
1576 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1577 IntTy, DL);
1578 if (isa<PointerType>(B->getType()))
1579 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1580 const_cast<Constant *>(B), IntTy, DL);
1581 else if (B->getType() != IntTy)
1582 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1583 IntTy, DL);
1584
1585 if (A != B)
1586 return false;
1587
1588 // Constants only safely match if A doesn't contain undef/poison.
1589 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1590 // TODO: Handle cases where A and B have the same undef/poison elements.
1591 // TODO: Merge A and B with mismatching undef/poison elements.
1592 return !ContainsUndefOrPoisonA;
1593}
1594
1595/// Create a new entry in the constant pool or return an existing one.
1596/// User must specify the log2 of the minimum required alignment for the object.
1598 Align Alignment) {
1599 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1600
1601 // Check to see if we already have this constant.
1602 //
1603 // FIXME, this could be made much more efficient for large constant pools.
1604 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1605 if (!Constants[i].isMachineConstantPoolEntry() &&
1606 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1607 if (Constants[i].getAlign() < Alignment)
1608 Constants[i].Alignment = Alignment;
1609 return i;
1610 }
1611
1612 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1613 return Constants.size()-1;
1614}
1615
1617 Align Alignment) {
1618 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1619
1620 // Check to see if we already have this constant.
1621 //
1622 // FIXME, this could be made much more efficient for large constant pools.
1623 int Idx = V->getExistingMachineCPValue(this, Alignment);
1624 if (Idx != -1) {
1625 MachineCPVsSharingEntries.insert(V);
1626 return (unsigned)Idx;
1627 }
1628
1629 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1630 return Constants.size()-1;
1631}
1632
1634 if (Constants.empty()) return;
1635
1636 OS << "Constant Pool:\n";
1637 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1638 OS << " cp#" << i << ": ";
1639 if (Constants[i].isMachineConstantPoolEntry())
1640 Constants[i].Val.MachineCPVal->print(OS);
1641 else
1642 Constants[i].Val.ConstVal->printAsOperand(OS, /*PrintType=*/false);
1643 OS << ", align=" << Constants[i].getAlign().value();
1644 OS << "\n";
1645 }
1646}
1647
1648//===----------------------------------------------------------------------===//
1649// Template specialization for MachineFunction implementation of
1650// ProfileSummaryInfo::getEntryCount().
1651//===----------------------------------------------------------------------===//
1652template <>
1653std::optional<Function::ProfileCount>
1654ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1655 const llvm::MachineFunction *F) const {
1656 return F->getFunction().getEntryCount();
1657}
1658
1659#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1661#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:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
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:124
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:78
iterator end()
Definition DenseMap.h:85
Implements a dense probed hash-table based set.
Definition DenseSet.h:289
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:350
Context object for machine code objects.
Definition MCContext.h:83
Describe properties that are true of each instruction in the target description file.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
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:1075
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1439
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1437
Tracking metadata reference owned by Metadata.
Definition Metadata.h:897
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.
LLVM_ABI 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 ...
LLVM_ABI unsigned getSizeInBytes(const DataLayout &DL) const
LLVM_ABI 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...
LLVM_ABI void dump() const
dump - Call print(cerr) to be called from the debugger.
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
LLVM_ABI 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.
void replaceFrameInstRegister(MCRegister From, MCRegister To)
Replace all references to register.
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:56
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:310
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:712
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:558
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:209
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