LLVM 18.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"
23#include "llvm/ADT/Twine.h"
42#include "llvm/Config/llvm-config.h"
43#include "llvm/IR/Attributes.h"
44#include "llvm/IR/BasicBlock.h"
45#include "llvm/IR/Constant.h"
46#include "llvm/IR/DataLayout.h"
49#include "llvm/IR/Function.h"
50#include "llvm/IR/GlobalValue.h"
51#include "llvm/IR/Instruction.h"
53#include "llvm/IR/Metadata.h"
54#include "llvm/IR/Module.h"
56#include "llvm/IR/Value.h"
57#include "llvm/MC/MCContext.h"
58#include "llvm/MC/MCSymbol.h"
59#include "llvm/MC/SectionKind.h"
68#include <algorithm>
69#include <cassert>
70#include <cstddef>
71#include <cstdint>
72#include <iterator>
73#include <string>
74#include <type_traits>
75#include <utility>
76#include <vector>
77
79
80using namespace llvm;
81
82#define DEBUG_TYPE "codegen"
83
85 "align-all-functions",
86 cl::desc("Force the alignment of all functions in log2 format (e.g. 4 "
87 "means align on 16B boundaries)."),
89
92
93 // clang-format off
94 switch(Prop) {
95 case P::FailedISel: return "FailedISel";
96 case P::IsSSA: return "IsSSA";
97 case P::Legalized: return "Legalized";
98 case P::NoPHIs: return "NoPHIs";
99 case P::NoVRegs: return "NoVRegs";
100 case P::RegBankSelected: return "RegBankSelected";
101 case P::Selected: return "Selected";
102 case P::TracksLiveness: return "TracksLiveness";
103 case P::TiedOpsRewritten: return "TiedOpsRewritten";
104 case P::FailsVerification: return "FailsVerification";
105 case P::TracksDebugUserValues: return "TracksDebugUserValues";
106 }
107 // clang-format on
108 llvm_unreachable("Invalid machine function property");
109}
110
112 if (!F.hasFnAttribute(Attribute::SafeStack))
113 return;
114
115 auto *Existing =
116 dyn_cast_or_null<MDTuple>(F.getMetadata(LLVMContext::MD_annotation));
117
118 if (!Existing || Existing->getNumOperands() != 2)
119 return;
120
121 auto *MetadataName = "unsafe-stack-size";
122 if (auto &N = Existing->getOperand(0)) {
123 if (N.equalsStr(MetadataName)) {
124 if (auto &Op = Existing->getOperand(1)) {
125 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
126 FrameInfo.setUnsafeStackSize(Val);
127 }
128 }
129 }
130}
131
132// Pin the vtable to this file.
133void MachineFunction::Delegate::anchor() {}
134
136 const char *Separator = "";
137 for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
138 if (!Properties[I])
139 continue;
140 OS << Separator << getPropertyName(static_cast<Property>(I));
141 Separator = ", ";
142 }
143}
144
145//===----------------------------------------------------------------------===//
146// MachineFunction implementation
147//===----------------------------------------------------------------------===//
148
149// Out-of-line virtual method.
151
154}
155
157 const Function &F) {
158 if (auto MA = F.getFnStackAlign())
159 return *MA;
160 return STI->getFrameLowering()->getStackAlign();
161}
162
164 const TargetSubtargetInfo &STI,
165 unsigned FunctionNum, MachineModuleInfo &mmi)
166 : F(F), Target(Target), STI(&STI), Ctx(mmi.getContext()), MMI(mmi) {
167 FunctionNumber = FunctionNum;
168 init();
169}
170
171void MachineFunction::handleInsertion(MachineInstr &MI) {
172 if (TheDelegate)
173 TheDelegate->MF_HandleInsertion(MI);
174}
175
176void MachineFunction::handleRemoval(MachineInstr &MI) {
177 if (TheDelegate)
178 TheDelegate->MF_HandleRemoval(MI);
179}
180
181void MachineFunction::init() {
182 // Assume the function starts in SSA form with correct liveness.
185 if (STI->getRegisterInfo())
186 RegInfo = new (Allocator) MachineRegisterInfo(this);
187 else
188 RegInfo = nullptr;
189
190 MFInfo = nullptr;
191
192 // We can realign the stack if the target supports it and the user hasn't
193 // explicitly asked us not to.
194 bool CanRealignSP = STI->getFrameLowering()->isStackRealignable() &&
195 !F.hasFnAttribute("no-realign-stack");
196 FrameInfo = new (Allocator) MachineFrameInfo(
197 getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
198 /*ForcedRealign=*/CanRealignSP &&
199 F.hasFnAttribute(Attribute::StackAlignment));
200
201 setUnsafeStackSize(F, *FrameInfo);
202
203 if (F.hasFnAttribute(Attribute::StackAlignment))
204 FrameInfo->ensureMaxAlignment(*F.getFnStackAlign());
205
207 Alignment = STI->getTargetLowering()->getMinFunctionAlignment();
208
209 // FIXME: Shouldn't use pref alignment if explicit alignment is set on F.
210 // FIXME: Use Function::hasOptSize().
211 if (!F.hasFnAttribute(Attribute::OptimizeForSize))
212 Alignment = std::max(Alignment,
214
215 // -fsanitize=function and -fsanitize=kcfi instrument indirect function calls
216 // to load a type hash before the function label. Ensure functions are aligned
217 // by a least 4 to avoid unaligned access, which is especially important for
218 // -mno-unaligned-access.
219 if (F.hasMetadata(LLVMContext::MD_func_sanitize) ||
220 F.getMetadata(LLVMContext::MD_kcfi_type))
221 Alignment = std::max(Alignment, Align(4));
222
224 Alignment = Align(1ULL << AlignAllFunctions);
225
226 JumpTableInfo = nullptr;
227
229 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
230 WinEHInfo = new (Allocator) WinEHFuncInfo();
231 }
232
234 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
235 WasmEHInfo = new (Allocator) WasmEHFuncInfo();
236 }
237
238 assert(Target.isCompatibleDataLayout(getDataLayout()) &&
239 "Can't create a MachineFunction using a Module with a "
240 "Target-incompatible DataLayout attached\n");
241
242 PSVManager = std::make_unique<PseudoSourceValueManager>(getTarget());
243}
244
246 const TargetSubtargetInfo &STI) {
247 assert(!MFInfo && "MachineFunctionInfo already set");
248 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
249}
250
252 clear();
253}
254
255void MachineFunction::clear() {
256 Properties.reset();
257 // Don't call destructors on MachineInstr and MachineOperand. All of their
258 // memory comes from the BumpPtrAllocator which is about to be purged.
259 //
260 // Do call MachineBasicBlock destructors, it contains std::vectors.
261 for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
262 I->Insts.clearAndLeakNodesUnsafely();
263 MBBNumbering.clear();
264
265 InstructionRecycler.clear(Allocator);
266 OperandRecycler.clear(Allocator);
267 BasicBlockRecycler.clear(Allocator);
268 CodeViewAnnotations.clear();
270 if (RegInfo) {
271 RegInfo->~MachineRegisterInfo();
272 Allocator.Deallocate(RegInfo);
273 }
274 if (MFInfo) {
275 MFInfo->~MachineFunctionInfo();
276 Allocator.Deallocate(MFInfo);
277 }
278
279 FrameInfo->~MachineFrameInfo();
280 Allocator.Deallocate(FrameInfo);
281
282 ConstantPool->~MachineConstantPool();
283 Allocator.Deallocate(ConstantPool);
284
285 if (JumpTableInfo) {
286 JumpTableInfo->~MachineJumpTableInfo();
287 Allocator.Deallocate(JumpTableInfo);
288 }
289
290 if (WinEHInfo) {
291 WinEHInfo->~WinEHFuncInfo();
292 Allocator.Deallocate(WinEHInfo);
293 }
294
295 if (WasmEHInfo) {
296 WasmEHInfo->~WasmEHFuncInfo();
297 Allocator.Deallocate(WasmEHInfo);
298 }
299}
300
302 return F.getParent()->getDataLayout();
303}
304
305/// Get the JumpTableInfo for this function.
306/// If it does not already exist, allocate one.
308getOrCreateJumpTableInfo(unsigned EntryKind) {
309 if (JumpTableInfo) return JumpTableInfo;
310
311 JumpTableInfo = new (Allocator)
313 return JumpTableInfo;
314}
315
317 return F.getDenormalMode(FPType);
318}
319
320/// Should we be emitting segmented stack stuff for the function
322 return getFunction().hasFnAttribute("split-stack");
323}
324
325[[nodiscard]] unsigned
327 FrameInstructions.push_back(Inst);
328 return FrameInstructions.size() - 1;
329}
330
331/// This discards all of the MachineBasicBlock numbers and recomputes them.
332/// This guarantees that the MBB numbers are sequential, dense, and match the
333/// ordering of the blocks within the function. If a specific MachineBasicBlock
334/// is specified, only that block and those after it are renumbered.
336 if (empty()) { MBBNumbering.clear(); return; }
338 if (MBB == nullptr)
339 MBBI = begin();
340 else
341 MBBI = MBB->getIterator();
342
343 // Figure out the block number this should have.
344 unsigned BlockNo = 0;
345 if (MBBI != begin())
346 BlockNo = std::prev(MBBI)->getNumber() + 1;
347
348 for (; MBBI != E; ++MBBI, ++BlockNo) {
349 if (MBBI->getNumber() != (int)BlockNo) {
350 // Remove use of the old number.
351 if (MBBI->getNumber() != -1) {
352 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
353 "MBB number mismatch!");
354 MBBNumbering[MBBI->getNumber()] = nullptr;
355 }
356
357 // If BlockNo is already taken, set that block's number to -1.
358 if (MBBNumbering[BlockNo])
359 MBBNumbering[BlockNo]->setNumber(-1);
360
361 MBBNumbering[BlockNo] = &*MBBI;
362 MBBI->setNumber(BlockNo);
363 }
364 }
365
366 // Okay, all the blocks are renumbered. If we have compactified the block
367 // numbering, shrink MBBNumbering now.
368 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
369 MBBNumbering.resize(BlockNo);
370}
371
372/// This method iterates over the basic blocks and assigns their IsBeginSection
373/// and IsEndSection fields. This must be called after MBB layout is finalized
374/// and the SectionID's are assigned to MBBs.
377 auto CurrentSectionID = front().getSectionID();
378 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
379 if (MBBI->getSectionID() == CurrentSectionID)
380 continue;
382 std::prev(MBBI)->setIsEndSection();
383 CurrentSectionID = MBBI->getSectionID();
384 }
386}
387
388/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
390 DebugLoc DL,
391 bool NoImplicit) {
392 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
393 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
394}
395
396/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
397/// identical in all ways except the instruction has no parent, prev, or next.
400 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
401 MachineInstr(*this, *Orig);
402}
403
406 const MachineInstr &Orig) {
407 MachineInstr *FirstClone = nullptr;
409 while (true) {
410 MachineInstr *Cloned = CloneMachineInstr(&*I);
411 MBB.insert(InsertBefore, Cloned);
412 if (FirstClone == nullptr) {
413 FirstClone = Cloned;
414 } else {
415 Cloned->bundleWithPred();
416 }
417
418 if (!I->isBundledWithSucc())
419 break;
420 ++I;
421 }
422 // Copy over call site info to the cloned instruction if needed. If Orig is in
423 // a bundle, copyCallSiteInfo takes care of finding the call instruction in
424 // the bundle.
425 if (Orig.shouldUpdateCallSiteInfo())
426 copyCallSiteInfo(&Orig, FirstClone);
427 return *FirstClone;
428}
429
430/// Delete the given MachineInstr.
431///
432/// This function also serves as the MachineInstr destructor - the real
433/// ~MachineInstr() destructor must be empty.
435 // Verify that a call site info is at valid state. This assertion should
436 // be triggered during the implementation of support for the
437 // call site info of a new architecture. If the assertion is triggered,
438 // back trace will tell where to insert a call to updateCallSiteInfo().
439 assert((!MI->isCandidateForCallSiteEntry() || !CallSitesInfo.contains(MI)) &&
440 "Call site info was not updated!");
441 // Strip it for parts. The operand array and the MI object itself are
442 // independently recyclable.
443 if (MI->Operands)
444 deallocateOperandArray(MI->CapOperands, MI->Operands);
445 // Don't call ~MachineInstr() which must be trivial anyway because
446 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
447 // destructors.
448 InstructionRecycler.Deallocate(Allocator, MI);
449}
450
451/// Allocate a new MachineBasicBlock. Use this instead of
452/// `new MachineBasicBlock'.
456 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
457 MachineBasicBlock(*this, bb);
458 // Set BBID for `-basic-block=sections=labels` and
459 // `-basic-block-sections=list` to allow robust mapping of profiles to basic
460 // blocks.
461 if (Target.getBBSectionsType() == BasicBlockSection::Labels ||
462 Target.getBBSectionsType() == BasicBlockSection::List)
463 MBB->setBBID(NextBBID++);
464 return MBB;
465}
466
467/// Delete the given MachineBasicBlock.
469 assert(MBB->getParent() == this && "MBB parent mismatch!");
470 // Clean up any references to MBB in jump tables before deleting it.
471 if (JumpTableInfo)
472 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
473 MBB->~MachineBasicBlock();
474 BasicBlockRecycler.Deallocate(Allocator, MBB);
475}
476
479 Align base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
480 SyncScope::ID SSID, AtomicOrdering Ordering,
481 AtomicOrdering FailureOrdering) {
482 return new (Allocator)
483 MachineMemOperand(PtrInfo, f, s, base_alignment, AAInfo, Ranges,
484 SSID, Ordering, FailureOrdering);
485}
486
489 Align base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
490 SyncScope::ID SSID, AtomicOrdering Ordering,
491 AtomicOrdering FailureOrdering) {
492 return new (Allocator)
493 MachineMemOperand(PtrInfo, f, MemTy, base_alignment, AAInfo, Ranges, SSID,
494 Ordering, FailureOrdering);
495}
496
498 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, uint64_t Size) {
499 return new (Allocator)
500 MachineMemOperand(PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
501 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
503}
504
506 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
507 return new (Allocator)
508 MachineMemOperand(PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
509 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
511}
512
515 int64_t Offset, LLT Ty) {
516 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
517
518 // If there is no pointer value, the offset isn't tracked so we need to adjust
519 // the base alignment.
520 Align Alignment = PtrInfo.V.isNull()
522 : MMO->getBaseAlign();
523
524 // Do not preserve ranges, since we don't necessarily know what the high bits
525 // are anymore.
526 return new (Allocator) MachineMemOperand(
527 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
528 MMO->getAAInfo(), nullptr, MMO->getSyncScopeID(),
530}
531
534 const AAMDNodes &AAInfo) {
535 MachinePointerInfo MPI = MMO->getValue() ?
536 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
538
539 return new (Allocator) MachineMemOperand(
540 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(), AAInfo,
541 MMO->getRanges(), MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
542 MMO->getFailureOrdering());
543}
544
548 return new (Allocator) MachineMemOperand(
549 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
550 MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(),
552}
553
554MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
555 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
556 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
557 uint32_t CFIType) {
558 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
559 PostInstrSymbol, HeapAllocMarker,
560 PCSections, CFIType);
561}
562
564 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
565 llvm::copy(Name, Dest);
566 Dest[Name.size()] = 0;
567 return Dest;
568}
569
571 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
572 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
573 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
574 memset(Mask, 0, Size * sizeof(Mask[0]));
575 return Mask;
576}
577
579 int* AllocMask = Allocator.Allocate<int>(Mask.size());
580 copy(Mask, AllocMask);
581 return {AllocMask, Mask.size()};
582}
583
584#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
586 print(dbgs());
587}
588#endif
589
591 return getFunction().getName();
592}
593
594void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
595 OS << "# Machine code for function " << getName() << ": ";
597 OS << '\n';
598
599 // Print Frame Information
600 FrameInfo->print(*this, OS);
601
602 // Print JumpTable Information
603 if (JumpTableInfo)
604 JumpTableInfo->print(OS);
605
606 // Print Constant Pool
607 ConstantPool->print(OS);
608
610
611 if (RegInfo && !RegInfo->livein_empty()) {
612 OS << "Function Live Ins: ";
614 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
615 OS << printReg(I->first, TRI);
616 if (I->second)
617 OS << " in " << printReg(I->second, TRI);
618 if (std::next(I) != E)
619 OS << ", ";
620 }
621 OS << '\n';
622 }
623
626 for (const auto &BB : *this) {
627 OS << '\n';
628 // If we print the whole function, print it at its most verbose level.
629 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
630 }
631
632 OS << "\n# End machine code for function " << getName() << ".\n\n";
633}
634
635/// True if this function needs frame moves for debug or exceptions.
637 return getMMI().hasDebugInfo() ||
640}
641
642namespace llvm {
643
644 template<>
647
648 static std::string getGraphName(const MachineFunction *F) {
649 return ("CFG for '" + F->getName() + "' function").str();
650 }
651
652 std::string getNodeLabel(const MachineBasicBlock *Node,
653 const MachineFunction *Graph) {
654 std::string OutStr;
655 {
656 raw_string_ostream OSS(OutStr);
657
658 if (isSimple()) {
659 OSS << printMBBReference(*Node);
660 if (const BasicBlock *BB = Node->getBasicBlock())
661 OSS << ": " << BB->getName();
662 } else
663 Node->print(OSS);
664 }
665
666 if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
667
668 // Process string output to make it nicer...
669 for (unsigned i = 0; i != OutStr.length(); ++i)
670 if (OutStr[i] == '\n') { // Left justify
671 OutStr[i] = '\\';
672 OutStr.insert(OutStr.begin()+i+1, 'l');
673 }
674 return OutStr;
675 }
676 };
677
678} // end namespace llvm
679
681{
682#ifndef NDEBUG
683 ViewGraph(this, "mf" + getName());
684#else
685 errs() << "MachineFunction::viewCFG is only available in debug builds on "
686 << "systems with Graphviz or gv!\n";
687#endif // NDEBUG
688}
689
691{
692#ifndef NDEBUG
693 ViewGraph(this, "mf" + getName(), true);
694#else
695 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
696 << "systems with Graphviz or gv!\n";
697#endif // NDEBUG
698}
699
700/// Add the specified physical register as a live-in value and
701/// create a corresponding virtual register for it.
703 const TargetRegisterClass *RC) {
705 Register VReg = MRI.getLiveInVirtReg(PReg);
706 if (VReg) {
707 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
708 (void)VRegRC;
709 // A physical register can be added several times.
710 // Between two calls, the register class of the related virtual register
711 // may have been constrained to match some operation constraints.
712 // In that case, check that the current register class includes the
713 // physical register and is a sub class of the specified RC.
714 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
715 RC->hasSubClassEq(VRegRC))) &&
716 "Register class mismatch!");
717 return VReg;
718 }
719 VReg = MRI.createVirtualRegister(RC);
720 MRI.addLiveIn(PReg, VReg);
721 return VReg;
722}
723
724/// Return the MCSymbol for the specified non-empty jump table.
725/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
726/// normal 'L' label is returned.
728 bool isLinkerPrivate) const {
729 const DataLayout &DL = getDataLayout();
730 assert(JumpTableInfo && "No jump tables");
731 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
732
733 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
734 : DL.getPrivateGlobalPrefix();
737 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
738 return Ctx.getOrCreateSymbol(Name);
739}
740
741/// Return a function-local symbol to represent the PIC base.
743 const DataLayout &DL = getDataLayout();
744 return Ctx.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
745 Twine(getFunctionNumber()) + "$pb");
746}
747
748/// \name Exception Handling
749/// \{
750
753 unsigned N = LandingPads.size();
754 for (unsigned i = 0; i < N; ++i) {
755 LandingPadInfo &LP = LandingPads[i];
756 if (LP.LandingPadBlock == LandingPad)
757 return LP;
758 }
759
760 LandingPads.push_back(LandingPadInfo(LandingPad));
761 return LandingPads[N];
762}
763
765 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
767 LP.BeginLabels.push_back(BeginLabel);
768 LP.EndLabels.push_back(EndLabel);
769}
770
772 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
774 LP.LandingPadLabel = LandingPadLabel;
775
776 const Instruction *FirstI = LandingPad->getBasicBlock()->getFirstNonPHI();
777 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
778 // If there's no typeid list specified, then "cleanup" is implicit.
779 // Otherwise, id 0 is reserved for the cleanup action.
780 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
781 LP.TypeIds.push_back(0);
782
783 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
784 // correct, but we need to do it this way because of how the DWARF EH
785 // emitter processes the clauses.
786 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
787 Value *Val = LPI->getClause(I - 1);
788 if (LPI->isCatch(I - 1)) {
789 LP.TypeIds.push_back(
790 getTypeIDFor(dyn_cast<GlobalValue>(Val->stripPointerCasts())));
791 } else {
792 // Add filters in a list.
793 auto *CVal = cast<Constant>(Val);
794 SmallVector<unsigned, 4> FilterList;
795 for (const Use &U : CVal->operands())
796 FilterList.push_back(
797 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
798
799 LP.TypeIds.push_back(getFilterIDFor(FilterList));
800 }
801 }
802
803 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
804 for (unsigned I = CPI->arg_size(); I != 0; --I) {
805 auto *TypeInfo =
806 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
807 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
808 }
809
810 } else {
811 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
812 }
813
814 return LandingPadLabel;
815}
816
818 ArrayRef<unsigned> Sites) {
819 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
820}
821
823 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
824 if (TypeInfos[i] == TI) return i + 1;
825
826 TypeInfos.push_back(TI);
827 return TypeInfos.size();
828}
829
831 // If the new filter coincides with the tail of an existing filter, then
832 // re-use the existing filter. Folding filters more than this requires
833 // re-ordering filters and/or their elements - probably not worth it.
834 for (unsigned i : FilterEnds) {
835 unsigned j = TyIds.size();
836
837 while (i && j)
838 if (FilterIds[--i] != TyIds[--j])
839 goto try_next;
840
841 if (!j)
842 // The new filter coincides with range [i, end) of the existing filter.
843 return -(1 + i);
844
845try_next:;
846 }
847
848 // Add the new filter.
849 int FilterID = -(1 + FilterIds.size());
850 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
851 llvm::append_range(FilterIds, TyIds);
852 FilterEnds.push_back(FilterIds.size());
853 FilterIds.push_back(0); // terminator
854 return FilterID;
855}
856
858MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
859 assert(MI->isCandidateForCallSiteEntry() &&
860 "Call site info refers only to call (MI) candidates");
861
862 if (!Target.Options.EmitCallSiteInfo)
863 return CallSitesInfo.end();
864 return CallSitesInfo.find(MI);
865}
866
867/// Return the call machine instruction or find a call within bundle.
869 if (!MI->isBundle())
870 return MI;
871
872 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
873 getBundleEnd(MI->getIterator())))
874 if (BMI.isCandidateForCallSiteEntry())
875 return &BMI;
876
877 llvm_unreachable("Unexpected bundle without a call site candidate");
878}
879
881 assert(MI->shouldUpdateCallSiteInfo() &&
882 "Call site info refers only to call (MI) candidates or "
883 "candidates inside bundles");
884
885 const MachineInstr *CallMI = getCallInstr(MI);
886 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
887 if (CSIt == CallSitesInfo.end())
888 return;
889 CallSitesInfo.erase(CSIt);
890}
891
893 const MachineInstr *New) {
895 "Call site info refers only to call (MI) candidates or "
896 "candidates inside bundles");
897
898 if (!New->isCandidateForCallSiteEntry())
899 return eraseCallSiteInfo(Old);
900
901 const MachineInstr *OldCallMI = getCallInstr(Old);
902 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
903 if (CSIt == CallSitesInfo.end())
904 return;
905
906 CallSiteInfo CSInfo = CSIt->second;
907 CallSitesInfo[New] = CSInfo;
908}
909
911 const MachineInstr *New) {
913 "Call site info refers only to call (MI) candidates or "
914 "candidates inside bundles");
915
916 if (!New->isCandidateForCallSiteEntry())
917 return eraseCallSiteInfo(Old);
918
919 const MachineInstr *OldCallMI = getCallInstr(Old);
920 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
921 if (CSIt == CallSitesInfo.end())
922 return;
923
924 CallSiteInfo CSInfo = std::move(CSIt->second);
925 CallSitesInfo.erase(CSIt);
926 CallSitesInfo[New] = CSInfo;
927}
928
931}
932
935 unsigned Subreg) {
936 // Catch any accidental self-loops.
937 assert(A.first != B.first);
938 // Don't allow any substitutions _from_ the memory operand number.
939 assert(A.second != DebugOperandMemNumber);
940
941 DebugValueSubstitutions.push_back({A, B, Subreg});
942}
943
945 MachineInstr &New,
946 unsigned MaxOperand) {
947 // If the Old instruction wasn't tracked at all, there is no work to do.
948 unsigned OldInstrNum = Old.peekDebugInstrNum();
949 if (!OldInstrNum)
950 return;
951
952 // Iterate over all operands looking for defs to create substitutions for.
953 // Avoid creating new instr numbers unless we create a new substitution.
954 // While this has no functional effect, it risks confusing someone reading
955 // MIR output.
956 // Examine all the operands, or the first N specified by the caller.
957 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
958 for (unsigned int I = 0; I < MaxOperand; ++I) {
959 const auto &OldMO = Old.getOperand(I);
960 auto &NewMO = New.getOperand(I);
961 (void)NewMO;
962
963 if (!OldMO.isReg() || !OldMO.isDef())
964 continue;
965 assert(NewMO.isDef());
966
967 unsigned NewInstrNum = New.getDebugInstrNum();
968 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
969 std::make_pair(NewInstrNum, I));
970 }
971}
972
976 const TargetInstrInfo &TII = *getSubtarget().getInstrInfo();
977
978 // Check whether this copy-like instruction has already been salvaged into
979 // an operand pair.
980 Register Dest;
981 if (auto CopyDstSrc = TII.isCopyInstr(MI)) {
982 Dest = CopyDstSrc->Destination->getReg();
983 } else {
984 assert(MI.isSubregToReg());
985 Dest = MI.getOperand(0).getReg();
986 }
987
988 auto CacheIt = DbgPHICache.find(Dest);
989 if (CacheIt != DbgPHICache.end())
990 return CacheIt->second;
991
992 // Calculate the instruction number to use, or install a DBG_PHI.
993 auto OperandPair = salvageCopySSAImpl(MI);
994 DbgPHICache.insert({Dest, OperandPair});
995 return OperandPair;
996}
997
1000 MachineRegisterInfo &MRI = getRegInfo();
1001 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
1002 const TargetInstrInfo &TII = *getSubtarget().getInstrInfo();
1003
1004 // Chase the value read by a copy-like instruction back to the instruction
1005 // that ultimately _defines_ that value. This may pass:
1006 // * Through multiple intermediate copies, including subregister moves /
1007 // copies,
1008 // * Copies from physical registers that must then be traced back to the
1009 // defining instruction,
1010 // * Or, physical registers may be live-in to (only) the entry block, which
1011 // requires a DBG_PHI to be created.
1012 // We can pursue this problem in that order: trace back through copies,
1013 // optionally through a physical register, to a defining instruction. We
1014 // should never move from physreg to vreg. As we're still in SSA form, no need
1015 // to worry about partial definitions of registers.
1016
1017 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1018 // returns the register read and any subregister identifying which part is
1019 // read.
1020 auto GetRegAndSubreg =
1021 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1022 Register NewReg, OldReg;
1023 unsigned SubReg;
1024 if (Cpy.isCopy()) {
1025 OldReg = Cpy.getOperand(0).getReg();
1026 NewReg = Cpy.getOperand(1).getReg();
1027 SubReg = Cpy.getOperand(1).getSubReg();
1028 } else if (Cpy.isSubregToReg()) {
1029 OldReg = Cpy.getOperand(0).getReg();
1030 NewReg = Cpy.getOperand(2).getReg();
1031 SubReg = Cpy.getOperand(3).getImm();
1032 } else {
1033 auto CopyDetails = *TII.isCopyInstr(Cpy);
1034 const MachineOperand &Src = *CopyDetails.Source;
1035 const MachineOperand &Dest = *CopyDetails.Destination;
1036 OldReg = Dest.getReg();
1037 NewReg = Src.getReg();
1038 SubReg = Src.getSubReg();
1039 }
1040
1041 return {NewReg, SubReg};
1042 };
1043
1044 // First seek either the defining instruction, or a copy from a physreg.
1045 // During search, the current state is the current copy instruction, and which
1046 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1047 // deal with those later.
1048 auto State = GetRegAndSubreg(MI);
1049 auto CurInst = MI.getIterator();
1050 SmallVector<unsigned, 4> SubregsSeen;
1051 while (true) {
1052 // If we've found a copy from a physreg, first portion of search is over.
1053 if (!State.first.isVirtual())
1054 break;
1055
1056 // Record any subregister qualifier.
1057 if (State.second)
1058 SubregsSeen.push_back(State.second);
1059
1060 assert(MRI.hasOneDef(State.first));
1061 MachineInstr &Inst = *MRI.def_begin(State.first)->getParent();
1062 CurInst = Inst.getIterator();
1063
1064 // Any non-copy instruction is the defining instruction we're seeking.
1065 if (!Inst.isCopyLike() && !TII.isCopyInstr(Inst))
1066 break;
1067 State = GetRegAndSubreg(Inst);
1068 };
1069
1070 // Helper lambda to apply additional subregister substitutions to a known
1071 // instruction/operand pair. Adds new (fake) substitutions so that we can
1072 // record the subregister. FIXME: this isn't very space efficient if multiple
1073 // values are tracked back through the same copies; cache something later.
1074 auto ApplySubregisters =
1076 for (unsigned Subreg : reverse(SubregsSeen)) {
1077 // Fetch a new instruction number, not attached to an actual instruction.
1078 unsigned NewInstrNumber = getNewDebugInstrNum();
1079 // Add a substitution from the "new" number to the known one, with a
1080 // qualifying subreg.
1081 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1082 // Return the new number; to find the underlying value, consumers need to
1083 // deal with the qualifying subreg.
1084 P = {NewInstrNumber, 0};
1085 }
1086 return P;
1087 };
1088
1089 // If we managed to find the defining instruction after COPYs, return an
1090 // instruction / operand pair after adding subregister qualifiers.
1091 if (State.first.isVirtual()) {
1092 // Virtual register def -- we can just look up where this happens.
1093 MachineInstr *Inst = MRI.def_begin(State.first)->getParent();
1094 for (auto &MO : Inst->all_defs()) {
1095 if (MO.getReg() != State.first)
1096 continue;
1097 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1098 }
1099
1100 llvm_unreachable("Vreg def with no corresponding operand?");
1101 }
1102
1103 // Our search ended in a copy from a physreg: walk back up the function
1104 // looking for whatever defines the physreg.
1105 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1106 State = GetRegAndSubreg(*CurInst);
1107 Register RegToSeek = State.first;
1108
1109 auto RMII = CurInst->getReverseIterator();
1110 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1111 for (auto &ToExamine : PrevInstrs) {
1112 for (auto &MO : ToExamine.all_defs()) {
1113 // Test for operand that defines something aliasing RegToSeek.
1114 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1115 continue;
1116
1117 return ApplySubregisters(
1118 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1119 }
1120 }
1121
1122 MachineBasicBlock &InsertBB = *CurInst->getParent();
1123
1124 // We reached the start of the block before finding a defining instruction.
1125 // There are numerous scenarios where this can happen:
1126 // * Constant physical registers,
1127 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1128 // * Arguments in the entry block,
1129 // * Exception handling landing pads.
1130 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1131 // the variable value at this position, rather than checking it makes sense.
1132
1133 // Create DBG_PHI for specified physreg.
1134 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1135 TII.get(TargetOpcode::DBG_PHI));
1136 Builder.addReg(State.first);
1137 unsigned NewNum = getNewDebugInstrNum();
1138 Builder.addImm(NewNum);
1139 return ApplySubregisters({NewNum, 0u});
1140}
1141
1143 auto *TII = getSubtarget().getInstrInfo();
1144
1145 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1146 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1147 MI.setDesc(RefII);
1148 MI.setDebugValueUndef();
1149 };
1150
1152 for (auto &MBB : *this) {
1153 for (auto &MI : MBB) {
1154 if (!MI.isDebugRef())
1155 continue;
1156
1157 bool IsValidRef = true;
1158
1159 for (MachineOperand &MO : MI.debug_operands()) {
1160 if (!MO.isReg())
1161 continue;
1162
1163 Register Reg = MO.getReg();
1164
1165 // Some vregs can be deleted as redundant in the meantime. Mark those
1166 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1167 // quickly deleted, leaving dangling references to vregs with no def.
1168 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1169 IsValidRef = false;
1170 break;
1171 }
1172
1173 assert(Reg.isVirtual());
1174 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1175
1176 // If we've found a copy-like instruction, follow it back to the
1177 // instruction that defines the source value, see salvageCopySSA docs
1178 // for why this is important.
1179 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1180 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1181 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1182 } else {
1183 // Otherwise, identify the operand number that the VReg refers to.
1184 unsigned OperandIdx = 0;
1185 for (const auto &DefMO : DefMI.operands()) {
1186 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1187 break;
1188 ++OperandIdx;
1189 }
1190 assert(OperandIdx < DefMI.getNumOperands());
1191
1192 // Morph this instr ref to point at the given instruction and operand.
1193 unsigned ID = DefMI.getDebugInstrNum();
1194 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1195 }
1196 }
1197
1198 if (!IsValidRef)
1199 MakeUndefDbgValue(MI);
1200 }
1201 }
1202}
1203
1205 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1206 // have optimized code inlined into this unoptimized code, however with
1207 // fewer and less aggressive optimizations happening, coverage and accuracy
1208 // should not suffer.
1209 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1210 return false;
1211
1212 // Don't use instr-ref if this function is marked optnone.
1213 if (F.hasFnAttribute(Attribute::OptimizeNone))
1214 return false;
1215
1216 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1217 return true;
1218
1219 return false;
1220}
1221
1223 return UseDebugInstrRef;
1224}
1225
1228}
1229
1230// Use one million as a high / reserved number.
1231const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1232
1233/// \}
1234
1235//===----------------------------------------------------------------------===//
1236// MachineJumpTableInfo implementation
1237//===----------------------------------------------------------------------===//
1238
1239/// Return the size of each entry in the jump table.
1241 // The size of a jump table entry is 4 bytes unless the entry is just the
1242 // address of a block, in which case it is the pointer size.
1243 switch (getEntryKind()) {
1245 return TD.getPointerSize();
1248 return 8;
1252 return 4;
1254 return 0;
1255 }
1256 llvm_unreachable("Unknown jump table encoding!");
1257}
1258
1259/// Return the alignment of each entry in the jump table.
1261 // The alignment of a jump table entry is the alignment of int32 unless the
1262 // entry is just the address of a block, in which case it is the pointer
1263 // alignment.
1264 switch (getEntryKind()) {
1266 return TD.getPointerABIAlignment(0).value();
1269 return TD.getABIIntegerTypeAlignment(64).value();
1273 return TD.getABIIntegerTypeAlignment(32).value();
1275 return 1;
1276 }
1277 llvm_unreachable("Unknown jump table encoding!");
1278}
1279
1280/// Create a new jump table entry in the jump table info.
1282 const std::vector<MachineBasicBlock*> &DestBBs) {
1283 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1284 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1285 return JumpTables.size()-1;
1286}
1287
1288/// If Old is the target of any jump tables, update the jump tables to branch
1289/// to New instead.
1291 MachineBasicBlock *New) {
1292 assert(Old != New && "Not making a change?");
1293 bool MadeChange = false;
1294 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1295 ReplaceMBBInJumpTable(i, Old, New);
1296 return MadeChange;
1297}
1298
1299/// If MBB is present in any jump tables, remove it.
1301 bool MadeChange = false;
1302 for (MachineJumpTableEntry &JTE : JumpTables) {
1303 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1304 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1305 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1306 }
1307 return MadeChange;
1308}
1309
1310/// If Old is a target of the jump tables, update the jump table to branch to
1311/// New instead.
1313 MachineBasicBlock *Old,
1314 MachineBasicBlock *New) {
1315 assert(Old != New && "Not making a change?");
1316 bool MadeChange = false;
1317 MachineJumpTableEntry &JTE = JumpTables[Idx];
1318 for (MachineBasicBlock *&MBB : JTE.MBBs)
1319 if (MBB == Old) {
1320 MBB = New;
1321 MadeChange = true;
1322 }
1323 return MadeChange;
1324}
1325
1327 if (JumpTables.empty()) return;
1328
1329 OS << "Jump Tables:\n";
1330
1331 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1332 OS << printJumpTableEntryReference(i) << ':';
1333 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1334 OS << ' ' << printMBBReference(*MBB);
1335 if (i != e)
1336 OS << '\n';
1337 }
1338
1339 OS << '\n';
1340}
1341
1342#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1344#endif
1345
1347 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1348}
1349
1350//===----------------------------------------------------------------------===//
1351// MachineConstantPool implementation
1352//===----------------------------------------------------------------------===//
1353
1354void MachineConstantPoolValue::anchor() {}
1355
1357 return DL.getTypeAllocSize(Ty);
1358}
1359
1362 return Val.MachineCPVal->getSizeInBytes(DL);
1363 return DL.getTypeAllocSize(Val.ConstVal->getType());
1364}
1365
1368 return true;
1369 return Val.ConstVal->needsDynamicRelocation();
1370}
1371
1374 if (needsRelocation())
1376 switch (getSizeInBytes(*DL)) {
1377 case 4:
1379 case 8:
1381 case 16:
1383 case 32:
1385 default:
1386 return SectionKind::getReadOnly();
1387 }
1388}
1389
1391 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1392 // so keep track of which we've deleted to avoid double deletions.
1394 for (const MachineConstantPoolEntry &C : Constants)
1395 if (C.isMachineConstantPoolEntry()) {
1396 Deleted.insert(C.Val.MachineCPVal);
1397 delete C.Val.MachineCPVal;
1398 }
1399 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1400 if (Deleted.count(CPV) == 0)
1401 delete CPV;
1402 }
1403}
1404
1405/// Test whether the given two constants can be allocated the same constant pool
1406/// entry referenced by \param A.
1407static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1408 const DataLayout &DL) {
1409 // Handle the trivial case quickly.
1410 if (A == B) return true;
1411
1412 // If they have the same type but weren't the same constant, quickly
1413 // reject them.
1414 if (A->getType() == B->getType()) return false;
1415
1416 // We can't handle structs or arrays.
1417 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1418 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1419 return false;
1420
1421 // For now, only support constants with the same size.
1422 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1423 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1424 return false;
1425
1426 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1427
1428 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1429
1430 // Try constant folding a bitcast of both instructions to an integer. If we
1431 // get two identical ConstantInt's, then we are good to share them. We use
1432 // the constant folding APIs to do this so that we get the benefit of
1433 // DataLayout.
1434 if (isa<PointerType>(A->getType()))
1435 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1436 const_cast<Constant *>(A), IntTy, DL);
1437 else if (A->getType() != IntTy)
1438 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1439 IntTy, DL);
1440 if (isa<PointerType>(B->getType()))
1441 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1442 const_cast<Constant *>(B), IntTy, DL);
1443 else if (B->getType() != IntTy)
1444 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1445 IntTy, DL);
1446
1447 if (A != B)
1448 return false;
1449
1450 // Constants only safely match if A doesn't contain undef/poison.
1451 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1452 // TODO: Handle cases where A and B have the same undef/poison elements.
1453 // TODO: Merge A and B with mismatching undef/poison elements.
1454 return !ContainsUndefOrPoisonA;
1455}
1456
1457/// Create a new entry in the constant pool or return an existing one.
1458/// User must specify the log2 of the minimum required alignment for the object.
1460 Align Alignment) {
1461 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1462
1463 // Check to see if we already have this constant.
1464 //
1465 // FIXME, this could be made much more efficient for large constant pools.
1466 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1467 if (!Constants[i].isMachineConstantPoolEntry() &&
1468 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1469 if (Constants[i].getAlign() < Alignment)
1470 Constants[i].Alignment = Alignment;
1471 return i;
1472 }
1473
1474 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1475 return Constants.size()-1;
1476}
1477
1479 Align Alignment) {
1480 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1481
1482 // Check to see if we already have this constant.
1483 //
1484 // FIXME, this could be made much more efficient for large constant pools.
1485 int Idx = V->getExistingMachineCPValue(this, Alignment);
1486 if (Idx != -1) {
1487 MachineCPVsSharingEntries.insert(V);
1488 return (unsigned)Idx;
1489 }
1490
1491 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1492 return Constants.size()-1;
1493}
1494
1496 if (Constants.empty()) return;
1497
1498 OS << "Constant Pool:\n";
1499 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1500 OS << " cp#" << i << ": ";
1501 if (Constants[i].isMachineConstantPoolEntry())
1502 Constants[i].Val.MachineCPVal->print(OS);
1503 else
1504 Constants[i].Val.ConstVal->printAsOperand(OS, /*PrintType=*/false);
1505 OS << ", align=" << Constants[i].getAlign().value();
1506 OS << "\n";
1507 }
1508}
1509
1510//===----------------------------------------------------------------------===//
1511// Template specialization for MachineFunction implementation of
1512// ProfileSummaryInfo::getEntryCount().
1513//===----------------------------------------------------------------------===//
1514template <>
1515std::optional<Function::ProfileCount>
1516ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1517 const llvm::MachineFunction *F) const {
1518 return F->getFunction().getEntryCount();
1519}
1520
1521#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1523#endif
unsigned SubReg
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder MachineInstrBuilder & DefMI
aarch64 promote const
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
assume Assume Builder
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:510
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
std::string Name
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:468
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static Align getFnStackAlignment(const TargetSubtargetInfo *STI, const Function &F)
static cl::opt< unsigned > AlignAllFunctions("align-all-functions", cl::desc("Force the alignment of all functions in log2 format (e.g. 4 " "means align on 16B boundaries)."), cl::init(0), cl::Hidden)
static const MachineInstr * getCallInstr(const MachineInstr *MI)
Return the call machine instruction or find a call within bundle.
static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, const DataLayout &DL)
Test whether the given two constants can be allocated the same constant pool entry referenced by.
void setUnsafeStackSize(const Function &F, MachineFrameInfo &FrameInfo)
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
unsigned const TargetRegisterInfo * TRI
unsigned Reg
This file contains the declarations for metadata subclasses.
Module.h This file contains the declarations for the Module class.
#define P(N)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isSimple(Instruction *I)
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the SmallString class.
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:154
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:165
iterator begin() const
Definition: ArrayRef.h:153
LLVM Basic Block Representation.
Definition: BasicBlock.h:56
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Definition: BasicBlock.cpp:216
LLVM_ATTRIBUTE_RETURNS_NONNULL void * Allocate(size_t Size, Align Alignment)
Allocate space at the specified alignment.
Definition: Allocator.h:148
void Deallocate(const void *Ptr, size_t Size, size_t)
Definition: Allocator.h:218
This is an important base class in LLVM.
Definition: Constant.h:41
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
Definition: DataLayout.h:533
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Definition: DataLayout.cpp:748
Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
Definition: DataLayout.cpp:740
A debug info location.
Definition: DebugLoc.h:33
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:155
bool erase(const KeyT &Val)
Definition: DenseMap.h:329
iterator end()
Definition: DenseMap.h:84
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:145
Implements a dense probed hash-table based set.
Definition: DenseSet.h:271
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
Definition: Function.h:423
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition: Function.h:815
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1845
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition: Function.cpp:704
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
Definition: Function.h:622
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.cpp:645
bool hasMetadata() const
Return true if this value has any metadata attached to it.
Definition: Value.h:585
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition: Metadata.cpp:1354
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:652
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:279
This class describes a target machine that is implemented with the LLVM target-independent code gener...
Context object for machine code objects.
Definition: MCContext.h:76
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:322
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Definition: MCContext.cpp:201
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:198
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:33
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
Metadata node.
Definition: Metadata.h:950
void setIsEndSection(bool V=true)
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setBBID(unsigned V)
Sets the fixed BBID of this basic block.
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
unsigned getSizeInBytes(const DataLayout &DL) const
SectionKind getSectionKind(const DataLayout *DL) const
union llvm::MachineConstantPoolEntry::@195 Val
The constant itself.
Abstract base class for all machine specific constantpool value subclasses.
virtual unsigned getSizeInBytes(const DataLayout &DL) const
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
void dump() const
dump - Call print(cerr) to be called from the debugger.
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
void setUnsafeStackSize(uint64_t Size)
void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & set(Property P)
MachineFunctionProperties & reset(Property P)
virtual void MF_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.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, 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.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *bb=nullptr)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
std::pair< unsigned, unsigned > DebugInstrOperandPair
Pair of instruction number and operand number.
unsigned addFrameInst(const MCCFIInstruction &Inst)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
SmallVector< DebugSubstitution, 8 > DebugValueSubstitutions
Debug value substitutions: a collection of DebugSubstitution objects, recording changes in where a va...
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, unsigned MaxOperand=UINT_MAX)
Create substitutions for any tracked values in Old, to point at New.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineInstr & cloneMachineInstrBundle(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig)
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, bool NoImplicit=false)
CreateMachineInstr - Allocate a new MachineInstr.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
void copyCallSiteInfo(const MachineInstr *Old, const MachineInstr *New)
Copy the call site info from Old to \ New.
void deleteMachineInstr(MachineInstr *MI)
DeleteMachineInstr - Delete the given MachineInstr.
void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI)
Initialize the target specific MachineFunctionInfo.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
MCContext & getContext() const
LandingPadInfo & getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad)
Find or create an LandingPadInfo for the specified MachineBasicBlock.
unsigned size() const
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.
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.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
MachineModuleInfo & getMMI() 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.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
void eraseCallSiteInfo(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...
void moveCallSiteInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
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...
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0)
Allocate and construct an extra info structure for a MachineInstr.
VariableDbgInfoMapTy VariableDbgInfos
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
MachineFunction(Function &F, const LLVMTargetMachine &Target, const TargetSubtargetInfo &STI, unsigned FunctionNum, MachineModuleInfo &MMI)
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.
Definition: MachineInstr.h:68
void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
unsigned getNumOperands() const
Retuns the total number of operands.
Definition: MachineInstr.h:546
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
Definition: MachineInstr.h:519
bool shouldUpdateCallSiteInfo() const
Return true if copying, moving, or erasing this instruction requires updating Call Site Info (see cop...
unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:553
iterator_range< filtered_mop_iterator > all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
Definition: MachineInstr.h:730
bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
void dump() const
dump - Call to stderr.
bool ReplaceMBBInJumpTable(unsigned Idx, MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTable - If Old is a target of the jump tables, update the jump table to branch to New...
JTEntryKind
JTEntryKind - This enum indicates how each entry of the jump table is represented and emitted.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
JTEntryKind getEntryKind() const
A description of a memory reference used in the backend.
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.
uint64_t getSize() const
Return the size in bytes of 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.
This class contains meta information specific to a module.
bool hasDebugInfo() const
Returns true if valid debug info is present.
MachineOperand class - Representation of each machine instruction operand.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
def_instr_iterator def_instr_begin(Register RegNo) const
std::vector< std::pair< MCRegister, Register > >::const_iterator livein_iterator
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
livein_iterator livein_end() const
livein_iterator livein_begin() const
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
Definition: AsmWriter.cpp:873
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition: Module.h:254
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Definition: PointerUnion.h:142
Simple wrapper around std::function<void(raw_ostream&)>.
Definition: Printable.h:38
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:22
static SectionKind getMergeableConst4()
Definition: SectionKind.h:202
static SectionKind getReadOnlyWithRel()
Definition: SectionKind.h:214
static SectionKind getMergeableConst8()
Definition: SectionKind.h:203
static SectionKind getMergeableConst16()
Definition: SectionKind.h:204
static SectionKind getReadOnly()
Definition: SectionKind.h:192
static SectionKind getMergeableConst32()
Definition: SectionKind.h:205
SlotIndexes pass.
Definition: SlotIndexes.h:301
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)
Definition: SmallVector.h:416
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1200
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Align getPrefFunctionAlignment() const
Return the preferred function alignment.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
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 TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
LLVM Value Representation.
Definition: Value.h:74
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:688
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
Iterator for intrusive lists based on ilist_node.
self_iterator getIterator()
Definition: ilist_node.h:82
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:52
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:642
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:672
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:445
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:440
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool getAlign(const Function &F, unsigned index, unsigned &align)
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 a range to a container.
Definition: STLExtras.h:2037
Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:429
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
AtomicOrdering
Atomic ordering for LLVM's memory model.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
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.
Definition: GraphWriter.h:427
OutputIt copy(R &&Range, OutputIt Out)
Definition: STLExtras.h:1829
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:651
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
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...
DefaultDOTGraphTraits - This class provides the default implementations of all of the DOTGraphTraits ...
Represent subnormal handling kind for floating point instruction inputs and outputs.
This structure is used to retain landing pad info for the current function.
SmallVector< MCSymbol *, 1 > EndLabels
MachineBasicBlock * LandingPadBlock
SmallVector< MCSymbol *, 1 > BeginLabels
std::vector< int > TypeIds
MachineJumpTableEntry - One jump table in the jump table info.
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
This class contains a discriminated union of information about pointers in memory operands,...
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static void deleteNode(NodeTy *V)
Definition: ilist.h:42