LLVM 20.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"
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"
69#include <algorithm>
70#include <cassert>
71#include <cstddef>
72#include <cstdint>
73#include <iterator>
74#include <string>
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::FailedRegAlloc: return "FailedRegAlloc";
106 case P::TracksDebugUserValues: return "TracksDebugUserValues";
107 }
108 // clang-format on
109 llvm_unreachable("Invalid machine function property");
110}
111
113 if (!F.hasFnAttribute(Attribute::SafeStack))
114 return;
115
116 auto *Existing =
117 dyn_cast_or_null<MDTuple>(F.getMetadata(LLVMContext::MD_annotation));
118
119 if (!Existing || Existing->getNumOperands() != 2)
120 return;
121
122 auto *MetadataName = "unsafe-stack-size";
123 if (auto &N = Existing->getOperand(0)) {
124 if (N.equalsStr(MetadataName)) {
125 if (auto &Op = Existing->getOperand(1)) {
126 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
127 FrameInfo.setUnsafeStackSize(Val);
128 }
129 }
130 }
131}
132
133// Pin the vtable to this file.
134void MachineFunction::Delegate::anchor() {}
135
137 const char *Separator = "";
138 for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
139 if (!Properties[I])
140 continue;
141 OS << Separator << getPropertyName(static_cast<Property>(I));
142 Separator = ", ";
143 }
144}
145
146//===----------------------------------------------------------------------===//
147// MachineFunction implementation
148//===----------------------------------------------------------------------===//
149
150// Out-of-line virtual method.
152
155}
156
158 const Function &F) {
159 if (auto MA = F.getFnStackAlign())
160 return *MA;
161 return STI->getFrameLowering()->getStackAlign();
162}
163
165 const TargetSubtargetInfo &STI, MCContext &Ctx,
166 unsigned FunctionNum)
167 : F(F), Target(Target), STI(&STI), Ctx(Ctx) {
168 FunctionNumber = FunctionNum;
169 init();
170}
171
172void MachineFunction::handleInsertion(MachineInstr &MI) {
173 if (TheDelegate)
174 TheDelegate->MF_HandleInsertion(MI);
175}
176
177void MachineFunction::handleRemoval(MachineInstr &MI) {
178 if (TheDelegate)
179 TheDelegate->MF_HandleRemoval(MI);
180}
181
183 const MCInstrDesc &TID) {
184 if (TheDelegate)
185 TheDelegate->MF_HandleChangeDesc(MI, TID);
186}
187
188void MachineFunction::init() {
189 // Assume the function starts in SSA form with correct liveness.
192 if (STI->getRegisterInfo())
193 RegInfo = new (Allocator) MachineRegisterInfo(this);
194 else
195 RegInfo = nullptr;
196
197 MFInfo = nullptr;
198
199 // We can realign the stack if the target supports it and the user hasn't
200 // explicitly asked us not to.
201 bool CanRealignSP = STI->getFrameLowering()->isStackRealignable() &&
202 !F.hasFnAttribute("no-realign-stack");
203 bool ForceRealignSP = F.hasFnAttribute(Attribute::StackAlignment) ||
204 F.hasFnAttribute("stackrealign");
205 FrameInfo = new (Allocator) MachineFrameInfo(
206 getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
207 /*ForcedRealign=*/ForceRealignSP && CanRealignSP);
208
209 setUnsafeStackSize(F, *FrameInfo);
210
211 if (F.hasFnAttribute(Attribute::StackAlignment))
212 FrameInfo->ensureMaxAlignment(*F.getFnStackAlign());
213
215 Alignment = STI->getTargetLowering()->getMinFunctionAlignment();
216
217 // FIXME: Shouldn't use pref alignment if explicit alignment is set on F.
218 // FIXME: Use Function::hasOptSize().
219 if (!F.hasFnAttribute(Attribute::OptimizeForSize))
220 Alignment = std::max(Alignment,
222
223 // -fsanitize=function and -fsanitize=kcfi instrument indirect function calls
224 // to load a type hash before the function label. Ensure functions are aligned
225 // by a least 4 to avoid unaligned access, which is especially important for
226 // -mno-unaligned-access.
227 if (F.hasMetadata(LLVMContext::MD_func_sanitize) ||
228 F.getMetadata(LLVMContext::MD_kcfi_type))
229 Alignment = std::max(Alignment, Align(4));
230
232 Alignment = Align(1ULL << AlignAllFunctions);
233
234 JumpTableInfo = nullptr;
235
237 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
238 WinEHInfo = new (Allocator) WinEHFuncInfo();
239 }
240
242 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
243 WasmEHInfo = new (Allocator) WasmEHFuncInfo();
244 }
245
246 assert(Target.isCompatibleDataLayout(getDataLayout()) &&
247 "Can't create a MachineFunction using a Module with a "
248 "Target-incompatible DataLayout attached\n");
249
250 PSVManager = std::make_unique<PseudoSourceValueManager>(getTarget());
251}
252
254 const TargetSubtargetInfo &STI) {
255 assert(!MFInfo && "MachineFunctionInfo already set");
256 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
257}
258
260 clear();
261}
262
263void MachineFunction::clear() {
264 Properties.reset();
265 // Don't call destructors on MachineInstr and MachineOperand. All of their
266 // memory comes from the BumpPtrAllocator which is about to be purged.
267 //
268 // Do call MachineBasicBlock destructors, it contains std::vectors.
269 for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
270 I->Insts.clearAndLeakNodesUnsafely();
271 MBBNumbering.clear();
272
273 InstructionRecycler.clear(Allocator);
274 OperandRecycler.clear(Allocator);
275 BasicBlockRecycler.clear(Allocator);
276 CodeViewAnnotations.clear();
278 if (RegInfo) {
279 RegInfo->~MachineRegisterInfo();
280 Allocator.Deallocate(RegInfo);
281 }
282 if (MFInfo) {
283 MFInfo->~MachineFunctionInfo();
284 Allocator.Deallocate(MFInfo);
285 }
286
287 FrameInfo->~MachineFrameInfo();
288 Allocator.Deallocate(FrameInfo);
289
290 ConstantPool->~MachineConstantPool();
291 Allocator.Deallocate(ConstantPool);
292
293 if (JumpTableInfo) {
294 JumpTableInfo->~MachineJumpTableInfo();
295 Allocator.Deallocate(JumpTableInfo);
296 }
297
298 if (WinEHInfo) {
299 WinEHInfo->~WinEHFuncInfo();
300 Allocator.Deallocate(WinEHInfo);
301 }
302
303 if (WasmEHInfo) {
304 WasmEHInfo->~WasmEHFuncInfo();
305 Allocator.Deallocate(WasmEHInfo);
306 }
307}
308
310 return F.getDataLayout();
311}
312
313/// Get the JumpTableInfo for this function.
314/// If it does not already exist, allocate one.
316getOrCreateJumpTableInfo(unsigned EntryKind) {
317 if (JumpTableInfo) return JumpTableInfo;
318
319 JumpTableInfo = new (Allocator)
321 return JumpTableInfo;
322}
323
325 return F.getDenormalMode(FPType);
326}
327
328/// Should we be emitting segmented stack stuff for the function
330 return getFunction().hasFnAttribute("split-stack");
331}
332
333[[nodiscard]] unsigned
335 FrameInstructions.push_back(Inst);
336 return FrameInstructions.size() - 1;
337}
338
339/// This discards all of the MachineBasicBlock numbers and recomputes them.
340/// This guarantees that the MBB numbers are sequential, dense, and match the
341/// ordering of the blocks within the function. If a specific MachineBasicBlock
342/// is specified, only that block and those after it are renumbered.
344 if (empty()) { MBBNumbering.clear(); return; }
346 if (MBB == nullptr)
347 MBBI = begin();
348 else
349 MBBI = MBB->getIterator();
350
351 // Figure out the block number this should have.
352 unsigned BlockNo = 0;
353 if (MBBI != begin())
354 BlockNo = std::prev(MBBI)->getNumber() + 1;
355
356 for (; MBBI != E; ++MBBI, ++BlockNo) {
357 if (MBBI->getNumber() != (int)BlockNo) {
358 // Remove use of the old number.
359 if (MBBI->getNumber() != -1) {
360 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
361 "MBB number mismatch!");
362 MBBNumbering[MBBI->getNumber()] = nullptr;
363 }
364
365 // If BlockNo is already taken, set that block's number to -1.
366 if (MBBNumbering[BlockNo])
367 MBBNumbering[BlockNo]->setNumber(-1);
368
369 MBBNumbering[BlockNo] = &*MBBI;
370 MBBI->setNumber(BlockNo);
371 }
372 }
373
374 // Okay, all the blocks are renumbered. If we have compactified the block
375 // numbering, shrink MBBNumbering now.
376 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
377 MBBNumbering.resize(BlockNo);
378 MBBNumberingEpoch++;
379}
380
383 const Align FunctionAlignment = getAlignment();
385 /// Offset - Distance from the beginning of the function to the end
386 /// of the basic block.
387 int64_t Offset = 0;
388
389 for (; MBBI != E; ++MBBI) {
390 const Align Alignment = MBBI->getAlignment();
391 int64_t BlockSize = 0;
392
393 for (auto &MI : *MBBI) {
394 BlockSize += TII.getInstSizeInBytes(MI);
395 }
396
397 int64_t OffsetBB;
398 if (Alignment <= FunctionAlignment) {
399 OffsetBB = alignTo(Offset, Alignment);
400 } else {
401 // The alignment of this MBB is larger than the function's alignment, so
402 // we can't tell whether or not it will insert nops. Assume that it will.
403 OffsetBB = alignTo(Offset, Alignment) + Alignment.value() -
404 FunctionAlignment.value();
405 }
406 Offset = OffsetBB + BlockSize;
407 }
408
409 return Offset;
410}
411
412/// This method iterates over the basic blocks and assigns their IsBeginSection
413/// and IsEndSection fields. This must be called after MBB layout is finalized
414/// and the SectionID's are assigned to MBBs.
417 auto CurrentSectionID = front().getSectionID();
418 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
419 if (MBBI->getSectionID() == CurrentSectionID)
420 continue;
422 std::prev(MBBI)->setIsEndSection();
423 CurrentSectionID = MBBI->getSectionID();
424 }
426}
427
428/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
430 DebugLoc DL,
431 bool NoImplicit) {
432 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
433 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
434}
435
436/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
437/// identical in all ways except the instruction has no parent, prev, or next.
440 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
441 MachineInstr(*this, *Orig);
442}
443
446 const MachineInstr &Orig) {
447 MachineInstr *FirstClone = nullptr;
449 while (true) {
450 MachineInstr *Cloned = CloneMachineInstr(&*I);
451 MBB.insert(InsertBefore, Cloned);
452 if (FirstClone == nullptr) {
453 FirstClone = Cloned;
454 } else {
455 Cloned->bundleWithPred();
456 }
457
458 if (!I->isBundledWithSucc())
459 break;
460 ++I;
461 }
462 // Copy over call site info to the cloned instruction if needed. If Orig is in
463 // a bundle, copyCallSiteInfo takes care of finding the call instruction in
464 // the bundle.
465 if (Orig.shouldUpdateCallSiteInfo())
466 copyCallSiteInfo(&Orig, FirstClone);
467 return *FirstClone;
468}
469
470/// Delete the given MachineInstr.
471///
472/// This function also serves as the MachineInstr destructor - the real
473/// ~MachineInstr() destructor must be empty.
475 // Verify that a call site info is at valid state. This assertion should
476 // be triggered during the implementation of support for the
477 // call site info of a new architecture. If the assertion is triggered,
478 // back trace will tell where to insert a call to updateCallSiteInfo().
479 assert((!MI->isCandidateForCallSiteEntry() || !CallSitesInfo.contains(MI)) &&
480 "Call site info was not updated!");
481 // Strip it for parts. The operand array and the MI object itself are
482 // independently recyclable.
483 if (MI->Operands)
484 deallocateOperandArray(MI->CapOperands, MI->Operands);
485 // Don't call ~MachineInstr() which must be trivial anyway because
486 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
487 // destructors.
488 InstructionRecycler.Deallocate(Allocator, MI);
489}
490
491/// Allocate a new MachineBasicBlock. Use this instead of
492/// `new MachineBasicBlock'.
495 std::optional<UniqueBBID> BBID) {
497 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
498 MachineBasicBlock(*this, BB);
499 // Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
500 // allow robust mapping of profiles to basic blocks.
501 if (Target.Options.BBAddrMap ||
502 Target.getBBSectionsType() == BasicBlockSection::List)
503 MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
504 return MBB;
505}
506
507/// Delete the given MachineBasicBlock.
509 assert(MBB->getParent() == this && "MBB parent mismatch!");
510 // Clean up any references to MBB in jump tables before deleting it.
511 if (JumpTableInfo)
512 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
513 MBB->~MachineBasicBlock();
514 BasicBlockRecycler.Deallocate(Allocator, MBB);
515}
516
519 Align BaseAlignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
520 SyncScope::ID SSID, AtomicOrdering Ordering,
521 AtomicOrdering FailureOrdering) {
522 assert((!Size.hasValue() ||
523 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
524 "Unexpected an unknown size to be represented using "
525 "LocationSize::beforeOrAfter()");
526 return new (Allocator)
527 MachineMemOperand(PtrInfo, F, Size, BaseAlignment, AAInfo, Ranges, SSID,
528 Ordering, FailureOrdering);
529}
530
533 Align base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
534 SyncScope::ID SSID, AtomicOrdering Ordering,
535 AtomicOrdering FailureOrdering) {
536 return new (Allocator)
537 MachineMemOperand(PtrInfo, f, MemTy, base_alignment, AAInfo, Ranges, SSID,
538 Ordering, FailureOrdering);
539}
540
543 const MachinePointerInfo &PtrInfo,
545 assert((!Size.hasValue() ||
546 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
547 "Unexpected an unknown size to be represented using "
548 "LocationSize::beforeOrAfter()");
549 return new (Allocator)
550 MachineMemOperand(PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
551 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
553}
554
556 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
557 return new (Allocator)
558 MachineMemOperand(PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
559 AAMDNodes(), nullptr, MMO->getSyncScopeID(),
561}
562
565 int64_t Offset, LLT Ty) {
566 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
567
568 // If there is no pointer value, the offset isn't tracked so we need to adjust
569 // the base alignment.
570 Align Alignment = PtrInfo.V.isNull()
572 : MMO->getBaseAlign();
573
574 // Do not preserve ranges, since we don't necessarily know what the high bits
575 // are anymore.
576 return new (Allocator) MachineMemOperand(
577 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
578 MMO->getAAInfo(), nullptr, MMO->getSyncScopeID(),
580}
581
584 const AAMDNodes &AAInfo) {
585 MachinePointerInfo MPI = MMO->getValue() ?
586 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
588
589 return new (Allocator) MachineMemOperand(
590 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(), AAInfo,
591 MMO->getRanges(), MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
592 MMO->getFailureOrdering());
593}
594
598 return new (Allocator) MachineMemOperand(
599 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
600 MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(),
602}
603
604MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
605 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
606 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
607 uint32_t CFIType, MDNode *MMRAs) {
608 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
609 PostInstrSymbol, HeapAllocMarker,
610 PCSections, CFIType, MMRAs);
611}
612
614 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
615 llvm::copy(Name, Dest);
616 Dest[Name.size()] = 0;
617 return Dest;
618}
619
621 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
622 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
623 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
624 memset(Mask, 0, Size * sizeof(Mask[0]));
625 return Mask;
626}
627
629 int* AllocMask = Allocator.Allocate<int>(Mask.size());
630 copy(Mask, AllocMask);
631 return {AllocMask, Mask.size()};
632}
633
634#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
636 print(dbgs());
637}
638#endif
639
641 return getFunction().getName();
642}
643
644void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
645 OS << "# Machine code for function " << getName() << ": ";
647 OS << '\n';
648
649 // Print Frame Information
650 FrameInfo->print(*this, OS);
651
652 // Print JumpTable Information
653 if (JumpTableInfo)
654 JumpTableInfo->print(OS);
655
656 // Print Constant Pool
657 ConstantPool->print(OS);
658
660
661 if (RegInfo && !RegInfo->livein_empty()) {
662 OS << "Function Live Ins: ";
664 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
665 OS << printReg(I->first, TRI);
666 if (I->second)
667 OS << " in " << printReg(I->second, TRI);
668 if (std::next(I) != E)
669 OS << ", ";
670 }
671 OS << '\n';
672 }
673
676 for (const auto &BB : *this) {
677 OS << '\n';
678 // If we print the whole function, print it at its most verbose level.
679 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
680 }
681
682 OS << "\n# End machine code for function " << getName() << ".\n\n";
683}
684
685/// True if this function needs frame moves for debug or exceptions.
687 // TODO: Ideally, what we'd like is to have a switch that allows emitting
688 // synchronous (precise at call-sites only) CFA into .eh_frame. However, even
689 // under this switch, we'd like .debug_frame to be precise when using -g. At
690 // this moment, there's no way to specify that some CFI directives go into
691 // .eh_frame only, while others go into .debug_frame only.
694 !F.getParent()->debug_compile_units().empty();
695}
696
697namespace llvm {
698
699 template<>
702
703 static std::string getGraphName(const MachineFunction *F) {
704 return ("CFG for '" + F->getName() + "' function").str();
705 }
706
707 std::string getNodeLabel(const MachineBasicBlock *Node,
708 const MachineFunction *Graph) {
709 std::string OutStr;
710 {
711 raw_string_ostream OSS(OutStr);
712
713 if (isSimple()) {
714 OSS << printMBBReference(*Node);
715 if (const BasicBlock *BB = Node->getBasicBlock())
716 OSS << ": " << BB->getName();
717 } else
718 Node->print(OSS);
719 }
720
721 if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
722
723 // Process string output to make it nicer...
724 for (unsigned i = 0; i != OutStr.length(); ++i)
725 if (OutStr[i] == '\n') { // Left justify
726 OutStr[i] = '\\';
727 OutStr.insert(OutStr.begin()+i+1, 'l');
728 }
729 return OutStr;
730 }
731 };
732
733} // end namespace llvm
734
736{
737#ifndef NDEBUG
738 ViewGraph(this, "mf" + getName());
739#else
740 errs() << "MachineFunction::viewCFG is only available in debug builds on "
741 << "systems with Graphviz or gv!\n";
742#endif // NDEBUG
743}
744
746{
747#ifndef NDEBUG
748 ViewGraph(this, "mf" + getName(), true);
749#else
750 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
751 << "systems with Graphviz or gv!\n";
752#endif // NDEBUG
753}
754
755/// Add the specified physical register as a live-in value and
756/// create a corresponding virtual register for it.
758 const TargetRegisterClass *RC) {
760 Register VReg = MRI.getLiveInVirtReg(PReg);
761 if (VReg) {
762 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
763 (void)VRegRC;
764 // A physical register can be added several times.
765 // Between two calls, the register class of the related virtual register
766 // may have been constrained to match some operation constraints.
767 // In that case, check that the current register class includes the
768 // physical register and is a sub class of the specified RC.
769 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
770 RC->hasSubClassEq(VRegRC))) &&
771 "Register class mismatch!");
772 return VReg;
773 }
774 VReg = MRI.createVirtualRegister(RC);
775 MRI.addLiveIn(PReg, VReg);
776 return VReg;
777}
778
779/// Return the MCSymbol for the specified non-empty jump table.
780/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
781/// normal 'L' label is returned.
783 bool isLinkerPrivate) const {
784 const DataLayout &DL = getDataLayout();
785 assert(JumpTableInfo && "No jump tables");
786 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
787
788 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
789 : DL.getPrivateGlobalPrefix();
792 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
793 return Ctx.getOrCreateSymbol(Name);
794}
795
796/// Return a function-local symbol to represent the PIC base.
798 const DataLayout &DL = getDataLayout();
799 return Ctx.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
800 Twine(getFunctionNumber()) + "$pb");
801}
802
803/// \name Exception Handling
804/// \{
805
808 unsigned N = LandingPads.size();
809 for (unsigned i = 0; i < N; ++i) {
810 LandingPadInfo &LP = LandingPads[i];
811 if (LP.LandingPadBlock == LandingPad)
812 return LP;
813 }
814
815 LandingPads.push_back(LandingPadInfo(LandingPad));
816 return LandingPads[N];
817}
818
820 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
822 LP.BeginLabels.push_back(BeginLabel);
823 LP.EndLabels.push_back(EndLabel);
824}
825
827 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
829 LP.LandingPadLabel = LandingPadLabel;
830
831 const Instruction *FirstI = LandingPad->getBasicBlock()->getFirstNonPHI();
832 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
833 // If there's no typeid list specified, then "cleanup" is implicit.
834 // Otherwise, id 0 is reserved for the cleanup action.
835 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
836 LP.TypeIds.push_back(0);
837
838 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
839 // correct, but we need to do it this way because of how the DWARF EH
840 // emitter processes the clauses.
841 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
842 Value *Val = LPI->getClause(I - 1);
843 if (LPI->isCatch(I - 1)) {
844 LP.TypeIds.push_back(
845 getTypeIDFor(dyn_cast<GlobalValue>(Val->stripPointerCasts())));
846 } else {
847 // Add filters in a list.
848 auto *CVal = cast<Constant>(Val);
849 SmallVector<unsigned, 4> FilterList;
850 for (const Use &U : CVal->operands())
851 FilterList.push_back(
852 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
853
854 LP.TypeIds.push_back(getFilterIDFor(FilterList));
855 }
856 }
857
858 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
859 for (unsigned I = CPI->arg_size(); I != 0; --I) {
860 auto *TypeInfo =
861 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
862 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
863 }
864
865 } else {
866 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
867 }
868
869 return LandingPadLabel;
870}
871
873 ArrayRef<unsigned> Sites) {
874 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
875}
876
878 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
879 if (TypeInfos[i] == TI) return i + 1;
880
881 TypeInfos.push_back(TI);
882 return TypeInfos.size();
883}
884
886 // If the new filter coincides with the tail of an existing filter, then
887 // re-use the existing filter. Folding filters more than this requires
888 // re-ordering filters and/or their elements - probably not worth it.
889 for (unsigned i : FilterEnds) {
890 unsigned j = TyIds.size();
891
892 while (i && j)
893 if (FilterIds[--i] != TyIds[--j])
894 goto try_next;
895
896 if (!j)
897 // The new filter coincides with range [i, end) of the existing filter.
898 return -(1 + i);
899
900try_next:;
901 }
902
903 // Add the new filter.
904 int FilterID = -(1 + FilterIds.size());
905 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
906 llvm::append_range(FilterIds, TyIds);
907 FilterEnds.push_back(FilterIds.size());
908 FilterIds.push_back(0); // terminator
909 return FilterID;
910}
911
913MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
914 assert(MI->isCandidateForCallSiteEntry() &&
915 "Call site info refers only to call (MI) candidates");
916
917 if (!Target.Options.EmitCallSiteInfo)
918 return CallSitesInfo.end();
919 return CallSitesInfo.find(MI);
920}
921
922/// Return the call machine instruction or find a call within bundle.
924 if (!MI->isBundle())
925 return MI;
926
927 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
928 getBundleEnd(MI->getIterator())))
929 if (BMI.isCandidateForCallSiteEntry())
930 return &BMI;
931
932 llvm_unreachable("Unexpected bundle without a call site candidate");
933}
934
936 assert(MI->shouldUpdateCallSiteInfo() &&
937 "Call site info refers only to call (MI) candidates or "
938 "candidates inside bundles");
939
940 const MachineInstr *CallMI = getCallInstr(MI);
941 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
942 if (CSIt == CallSitesInfo.end())
943 return;
944 CallSitesInfo.erase(CSIt);
945}
946
948 const MachineInstr *New) {
950 "Call site info refers only to call (MI) candidates or "
951 "candidates inside bundles");
952
953 if (!New->isCandidateForCallSiteEntry())
954 return eraseCallSiteInfo(Old);
955
956 const MachineInstr *OldCallMI = getCallInstr(Old);
957 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
958 if (CSIt == CallSitesInfo.end())
959 return;
960
961 CallSiteInfo CSInfo = CSIt->second;
962 CallSitesInfo[New] = CSInfo;
963}
964
966 const MachineInstr *New) {
968 "Call site info refers only to call (MI) candidates or "
969 "candidates inside bundles");
970
971 if (!New->isCandidateForCallSiteEntry())
972 return eraseCallSiteInfo(Old);
973
974 const MachineInstr *OldCallMI = getCallInstr(Old);
975 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
976 if (CSIt == CallSitesInfo.end())
977 return;
978
979 CallSiteInfo CSInfo = std::move(CSIt->second);
980 CallSitesInfo.erase(CSIt);
981 CallSitesInfo[New] = CSInfo;
982}
983
986}
987
990 unsigned Subreg) {
991 // Catch any accidental self-loops.
992 assert(A.first != B.first);
993 // Don't allow any substitutions _from_ the memory operand number.
994 assert(A.second != DebugOperandMemNumber);
995
996 DebugValueSubstitutions.push_back({A, B, Subreg});
997}
998
1000 MachineInstr &New,
1001 unsigned MaxOperand) {
1002 // If the Old instruction wasn't tracked at all, there is no work to do.
1003 unsigned OldInstrNum = Old.peekDebugInstrNum();
1004 if (!OldInstrNum)
1005 return;
1006
1007 // Iterate over all operands looking for defs to create substitutions for.
1008 // Avoid creating new instr numbers unless we create a new substitution.
1009 // While this has no functional effect, it risks confusing someone reading
1010 // MIR output.
1011 // Examine all the operands, or the first N specified by the caller.
1012 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
1013 for (unsigned int I = 0; I < MaxOperand; ++I) {
1014 const auto &OldMO = Old.getOperand(I);
1015 auto &NewMO = New.getOperand(I);
1016 (void)NewMO;
1017
1018 if (!OldMO.isReg() || !OldMO.isDef())
1019 continue;
1020 assert(NewMO.isDef());
1021
1022 unsigned NewInstrNum = New.getDebugInstrNum();
1023 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
1024 std::make_pair(NewInstrNum, I));
1025 }
1026}
1027
1031 const TargetInstrInfo &TII = *getSubtarget().getInstrInfo();
1032
1033 // Check whether this copy-like instruction has already been salvaged into
1034 // an operand pair.
1035 Register Dest;
1036 if (auto CopyDstSrc = TII.isCopyInstr(MI)) {
1037 Dest = CopyDstSrc->Destination->getReg();
1038 } else {
1039 assert(MI.isSubregToReg());
1040 Dest = MI.getOperand(0).getReg();
1041 }
1042
1043 auto CacheIt = DbgPHICache.find(Dest);
1044 if (CacheIt != DbgPHICache.end())
1045 return CacheIt->second;
1046
1047 // Calculate the instruction number to use, or install a DBG_PHI.
1048 auto OperandPair = salvageCopySSAImpl(MI);
1049 DbgPHICache.insert({Dest, OperandPair});
1050 return OperandPair;
1051}
1052
1055 MachineRegisterInfo &MRI = getRegInfo();
1056 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
1057 const TargetInstrInfo &TII = *getSubtarget().getInstrInfo();
1058
1059 // Chase the value read by a copy-like instruction back to the instruction
1060 // that ultimately _defines_ that value. This may pass:
1061 // * Through multiple intermediate copies, including subregister moves /
1062 // copies,
1063 // * Copies from physical registers that must then be traced back to the
1064 // defining instruction,
1065 // * Or, physical registers may be live-in to (only) the entry block, which
1066 // requires a DBG_PHI to be created.
1067 // We can pursue this problem in that order: trace back through copies,
1068 // optionally through a physical register, to a defining instruction. We
1069 // should never move from physreg to vreg. As we're still in SSA form, no need
1070 // to worry about partial definitions of registers.
1071
1072 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1073 // returns the register read and any subregister identifying which part is
1074 // read.
1075 auto GetRegAndSubreg =
1076 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1077 Register NewReg, OldReg;
1078 unsigned SubReg;
1079 if (Cpy.isCopy()) {
1080 OldReg = Cpy.getOperand(0).getReg();
1081 NewReg = Cpy.getOperand(1).getReg();
1082 SubReg = Cpy.getOperand(1).getSubReg();
1083 } else if (Cpy.isSubregToReg()) {
1084 OldReg = Cpy.getOperand(0).getReg();
1085 NewReg = Cpy.getOperand(2).getReg();
1086 SubReg = Cpy.getOperand(3).getImm();
1087 } else {
1088 auto CopyDetails = *TII.isCopyInstr(Cpy);
1089 const MachineOperand &Src = *CopyDetails.Source;
1090 const MachineOperand &Dest = *CopyDetails.Destination;
1091 OldReg = Dest.getReg();
1092 NewReg = Src.getReg();
1093 SubReg = Src.getSubReg();
1094 }
1095
1096 return {NewReg, SubReg};
1097 };
1098
1099 // First seek either the defining instruction, or a copy from a physreg.
1100 // During search, the current state is the current copy instruction, and which
1101 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1102 // deal with those later.
1103 auto State = GetRegAndSubreg(MI);
1104 auto CurInst = MI.getIterator();
1105 SmallVector<unsigned, 4> SubregsSeen;
1106 while (true) {
1107 // If we've found a copy from a physreg, first portion of search is over.
1108 if (!State.first.isVirtual())
1109 break;
1110
1111 // Record any subregister qualifier.
1112 if (State.second)
1113 SubregsSeen.push_back(State.second);
1114
1115 assert(MRI.hasOneDef(State.first));
1116 MachineInstr &Inst = *MRI.def_begin(State.first)->getParent();
1117 CurInst = Inst.getIterator();
1118
1119 // Any non-copy instruction is the defining instruction we're seeking.
1120 if (!Inst.isCopyLike() && !TII.isCopyInstr(Inst))
1121 break;
1122 State = GetRegAndSubreg(Inst);
1123 };
1124
1125 // Helper lambda to apply additional subregister substitutions to a known
1126 // instruction/operand pair. Adds new (fake) substitutions so that we can
1127 // record the subregister. FIXME: this isn't very space efficient if multiple
1128 // values are tracked back through the same copies; cache something later.
1129 auto ApplySubregisters =
1131 for (unsigned Subreg : reverse(SubregsSeen)) {
1132 // Fetch a new instruction number, not attached to an actual instruction.
1133 unsigned NewInstrNumber = getNewDebugInstrNum();
1134 // Add a substitution from the "new" number to the known one, with a
1135 // qualifying subreg.
1136 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1137 // Return the new number; to find the underlying value, consumers need to
1138 // deal with the qualifying subreg.
1139 P = {NewInstrNumber, 0};
1140 }
1141 return P;
1142 };
1143
1144 // If we managed to find the defining instruction after COPYs, return an
1145 // instruction / operand pair after adding subregister qualifiers.
1146 if (State.first.isVirtual()) {
1147 // Virtual register def -- we can just look up where this happens.
1148 MachineInstr *Inst = MRI.def_begin(State.first)->getParent();
1149 for (auto &MO : Inst->all_defs()) {
1150 if (MO.getReg() != State.first)
1151 continue;
1152 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1153 }
1154
1155 llvm_unreachable("Vreg def with no corresponding operand?");
1156 }
1157
1158 // Our search ended in a copy from a physreg: walk back up the function
1159 // looking for whatever defines the physreg.
1160 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1161 State = GetRegAndSubreg(*CurInst);
1162 Register RegToSeek = State.first;
1163
1164 auto RMII = CurInst->getReverseIterator();
1165 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1166 for (auto &ToExamine : PrevInstrs) {
1167 for (auto &MO : ToExamine.all_defs()) {
1168 // Test for operand that defines something aliasing RegToSeek.
1169 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1170 continue;
1171
1172 return ApplySubregisters(
1173 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1174 }
1175 }
1176
1177 MachineBasicBlock &InsertBB = *CurInst->getParent();
1178
1179 // We reached the start of the block before finding a defining instruction.
1180 // There are numerous scenarios where this can happen:
1181 // * Constant physical registers,
1182 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1183 // * Arguments in the entry block,
1184 // * Exception handling landing pads.
1185 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1186 // the variable value at this position, rather than checking it makes sense.
1187
1188 // Create DBG_PHI for specified physreg.
1189 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1190 TII.get(TargetOpcode::DBG_PHI));
1191 Builder.addReg(State.first);
1192 unsigned NewNum = getNewDebugInstrNum();
1193 Builder.addImm(NewNum);
1194 return ApplySubregisters({NewNum, 0u});
1195}
1196
1198 auto *TII = getSubtarget().getInstrInfo();
1199
1200 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1201 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1202 MI.setDesc(RefII);
1203 MI.setDebugValueUndef();
1204 };
1205
1207 for (auto &MBB : *this) {
1208 for (auto &MI : MBB) {
1209 if (!MI.isDebugRef())
1210 continue;
1211
1212 bool IsValidRef = true;
1213
1214 for (MachineOperand &MO : MI.debug_operands()) {
1215 if (!MO.isReg())
1216 continue;
1217
1218 Register Reg = MO.getReg();
1219
1220 // Some vregs can be deleted as redundant in the meantime. Mark those
1221 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1222 // quickly deleted, leaving dangling references to vregs with no def.
1223 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1224 IsValidRef = false;
1225 break;
1226 }
1227
1228 assert(Reg.isVirtual());
1229 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1230
1231 // If we've found a copy-like instruction, follow it back to the
1232 // instruction that defines the source value, see salvageCopySSA docs
1233 // for why this is important.
1234 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1235 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1236 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1237 } else {
1238 // Otherwise, identify the operand number that the VReg refers to.
1239 unsigned OperandIdx = 0;
1240 for (const auto &DefMO : DefMI.operands()) {
1241 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1242 break;
1243 ++OperandIdx;
1244 }
1245 assert(OperandIdx < DefMI.getNumOperands());
1246
1247 // Morph this instr ref to point at the given instruction and operand.
1248 unsigned ID = DefMI.getDebugInstrNum();
1249 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1250 }
1251 }
1252
1253 if (!IsValidRef)
1254 MakeUndefDbgValue(MI);
1255 }
1256 }
1257}
1258
1260 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1261 // have optimized code inlined into this unoptimized code, however with
1262 // fewer and less aggressive optimizations happening, coverage and accuracy
1263 // should not suffer.
1264 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1265 return false;
1266
1267 // Don't use instr-ref if this function is marked optnone.
1268 if (F.hasFnAttribute(Attribute::OptimizeNone))
1269 return false;
1270
1271 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1272 return true;
1273
1274 return false;
1275}
1276
1278 return UseDebugInstrRef;
1279}
1280
1283}
1284
1285// Use one million as a high / reserved number.
1286const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1287
1288/// \}
1289
1290//===----------------------------------------------------------------------===//
1291// MachineJumpTableInfo implementation
1292//===----------------------------------------------------------------------===//
1293
1294/// Return the size of each entry in the jump table.
1296 // The size of a jump table entry is 4 bytes unless the entry is just the
1297 // address of a block, in which case it is the pointer size.
1298 switch (getEntryKind()) {
1300 return TD.getPointerSize();
1303 return 8;
1307 return 4;
1309 return 0;
1310 }
1311 llvm_unreachable("Unknown jump table encoding!");
1312}
1313
1314/// Return the alignment of each entry in the jump table.
1316 // The alignment of a jump table entry is the alignment of int32 unless the
1317 // entry is just the address of a block, in which case it is the pointer
1318 // alignment.
1319 switch (getEntryKind()) {
1321 return TD.getPointerABIAlignment(0).value();
1324 return TD.getABIIntegerTypeAlignment(64).value();
1328 return TD.getABIIntegerTypeAlignment(32).value();
1330 return 1;
1331 }
1332 llvm_unreachable("Unknown jump table encoding!");
1333}
1334
1335/// Create a new jump table entry in the jump table info.
1337 const std::vector<MachineBasicBlock*> &DestBBs) {
1338 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1339 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1340 return JumpTables.size()-1;
1341}
1342
1343/// If Old is the target of any jump tables, update the jump tables to branch
1344/// to New instead.
1346 MachineBasicBlock *New) {
1347 assert(Old != New && "Not making a change?");
1348 bool MadeChange = false;
1349 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1350 ReplaceMBBInJumpTable(i, Old, New);
1351 return MadeChange;
1352}
1353
1354/// If MBB is present in any jump tables, remove it.
1356 bool MadeChange = false;
1357 for (MachineJumpTableEntry &JTE : JumpTables) {
1358 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1359 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1360 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1361 }
1362 return MadeChange;
1363}
1364
1365/// If Old is a target of the jump tables, update the jump table to branch to
1366/// New instead.
1368 MachineBasicBlock *Old,
1369 MachineBasicBlock *New) {
1370 assert(Old != New && "Not making a change?");
1371 bool MadeChange = false;
1372 MachineJumpTableEntry &JTE = JumpTables[Idx];
1373 for (MachineBasicBlock *&MBB : JTE.MBBs)
1374 if (MBB == Old) {
1375 MBB = New;
1376 MadeChange = true;
1377 }
1378 return MadeChange;
1379}
1380
1382 if (JumpTables.empty()) return;
1383
1384 OS << "Jump Tables:\n";
1385
1386 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1387 OS << printJumpTableEntryReference(i) << ':';
1388 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1389 OS << ' ' << printMBBReference(*MBB);
1390 if (i != e)
1391 OS << '\n';
1392 }
1393
1394 OS << '\n';
1395}
1396
1397#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1399#endif
1400
1402 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1403}
1404
1405//===----------------------------------------------------------------------===//
1406// MachineConstantPool implementation
1407//===----------------------------------------------------------------------===//
1408
1409void MachineConstantPoolValue::anchor() {}
1410
1412 return DL.getTypeAllocSize(Ty);
1413}
1414
1417 return Val.MachineCPVal->getSizeInBytes(DL);
1418 return DL.getTypeAllocSize(Val.ConstVal->getType());
1419}
1420
1423 return true;
1424 return Val.ConstVal->needsDynamicRelocation();
1425}
1426
1429 if (needsRelocation())
1431 switch (getSizeInBytes(*DL)) {
1432 case 4:
1434 case 8:
1436 case 16:
1438 case 32:
1440 default:
1441 return SectionKind::getReadOnly();
1442 }
1443}
1444
1446 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1447 // so keep track of which we've deleted to avoid double deletions.
1449 for (const MachineConstantPoolEntry &C : Constants)
1450 if (C.isMachineConstantPoolEntry()) {
1451 Deleted.insert(C.Val.MachineCPVal);
1452 delete C.Val.MachineCPVal;
1453 }
1454 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1455 if (Deleted.count(CPV) == 0)
1456 delete CPV;
1457 }
1458}
1459
1460/// Test whether the given two constants can be allocated the same constant pool
1461/// entry referenced by \param A.
1462static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1463 const DataLayout &DL) {
1464 // Handle the trivial case quickly.
1465 if (A == B) return true;
1466
1467 // If they have the same type but weren't the same constant, quickly
1468 // reject them.
1469 if (A->getType() == B->getType()) return false;
1470
1471 // We can't handle structs or arrays.
1472 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1473 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1474 return false;
1475
1476 // For now, only support constants with the same size.
1477 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1478 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1479 return false;
1480
1481 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1482
1483 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1484
1485 // Try constant folding a bitcast of both instructions to an integer. If we
1486 // get two identical ConstantInt's, then we are good to share them. We use
1487 // the constant folding APIs to do this so that we get the benefit of
1488 // DataLayout.
1489 if (isa<PointerType>(A->getType()))
1490 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1491 const_cast<Constant *>(A), IntTy, DL);
1492 else if (A->getType() != IntTy)
1493 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1494 IntTy, DL);
1495 if (isa<PointerType>(B->getType()))
1496 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1497 const_cast<Constant *>(B), IntTy, DL);
1498 else if (B->getType() != IntTy)
1499 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1500 IntTy, DL);
1501
1502 if (A != B)
1503 return false;
1504
1505 // Constants only safely match if A doesn't contain undef/poison.
1506 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1507 // TODO: Handle cases where A and B have the same undef/poison elements.
1508 // TODO: Merge A and B with mismatching undef/poison elements.
1509 return !ContainsUndefOrPoisonA;
1510}
1511
1512/// Create a new entry in the constant pool or return an existing one.
1513/// User must specify the log2 of the minimum required alignment for the object.
1515 Align Alignment) {
1516 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1517
1518 // Check to see if we already have this constant.
1519 //
1520 // FIXME, this could be made much more efficient for large constant pools.
1521 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1522 if (!Constants[i].isMachineConstantPoolEntry() &&
1523 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1524 if (Constants[i].getAlign() < Alignment)
1525 Constants[i].Alignment = Alignment;
1526 return i;
1527 }
1528
1529 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1530 return Constants.size()-1;
1531}
1532
1534 Align Alignment) {
1535 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1536
1537 // Check to see if we already have this constant.
1538 //
1539 // FIXME, this could be made much more efficient for large constant pools.
1540 int Idx = V->getExistingMachineCPValue(this, Alignment);
1541 if (Idx != -1) {
1542 MachineCPVsSharingEntries.insert(V);
1543 return (unsigned)Idx;
1544 }
1545
1546 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1547 return Constants.size()-1;
1548}
1549
1551 if (Constants.empty()) return;
1552
1553 OS << "Constant Pool:\n";
1554 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1555 OS << " cp#" << i << ": ";
1556 if (Constants[i].isMachineConstantPoolEntry())
1557 Constants[i].Val.MachineCPVal->print(OS);
1558 else
1559 Constants[i].Val.ConstVal->printAsOperand(OS, /*PrintType=*/false);
1560 OS << ", align=" << Constants[i].getAlign().value();
1561 OS << "\n";
1562 }
1563}
1564
1565//===----------------------------------------------------------------------===//
1566// Template specialization for MachineFunction implementation of
1567// ProfileSummaryInfo::getEntryCount().
1568//===----------------------------------------------------------------------===//
1569template <>
1570std::optional<Function::ProfileCount>
1571ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1572 const llvm::MachineFunction *F) const {
1573 return F->getFunction().getEntryCount();
1574}
1575
1576#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1578#endif
unsigned SubReg
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder MachineInstrBuilder & DefMI
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:622
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:479
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: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.
#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.
static const int BlockSize
Definition: TarWriter.cpp:33
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:157
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:168
iterator begin() const
Definition: ArrayRef.h:156
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Definition: BasicBlock.cpp:367
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:225
This is an important base class in LLVM.
Definition: Constant.h:42
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:63
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
Definition: DataLayout.h:486
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Definition: DataLayout.cpp:739
Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
Definition: DataLayout.cpp:731
A debug info location.
Definition: DebugLoc.h:33
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:156
bool erase(const KeyT &Val)
Definition: DenseMap.h:321
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:147
Implements a dense probed hash-table based set.
Definition: DenseSet.h:278
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
Definition: Function.cpp:373
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
Definition: Function.h:470
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition: Function.h:905
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1048
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition: Function.cpp:807
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
Definition: Function.h:682
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.cpp:731
bool hasMetadata() const
Return true if this value has any metadata attached to it.
Definition: Value.h:589
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition: Value.h:565
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:311
Context object for machine code objects.
Definition: MCContext.h:83
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:345
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Definition: MCContext.cpp:212
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:1069
void setBBID(const UniqueBBID &V)
Sets the fixed BBID of this basic block.
void setIsEndSection(bool V=true)
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
Align getAlignment() const
Return alignment of the basic block.
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
union llvm::MachineConstantPoolEntry::@204 Val
The constant itself.
unsigned getSizeInBytes(const DataLayout &DL) const
SectionKind getSectionKind(const DataLayout *DL) const
Abstract base class for all machine specific constantpool value subclasses.
virtual unsigned getSizeInBytes(const DataLayout &DL) const
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
void dump() const
dump - Call print(cerr) to be called from the debugger.
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
void setUnsafeStackSize(uint64_t Size)
void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & set(Property P)
MachineFunctionProperties & reset(Property P)
virtual void MF_HandleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
Callback before changing MCInstrDesc.
virtual void MF_HandleRemoval(MachineInstr &MI)=0
Callback before a removal. This should not modify the MI directly.
virtual void MF_HandleInsertion(MachineInstr &MI)=0
Callback after an insertion. This should not modify the MI directly.
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
std::pair< unsigned, unsigned > DebugInstrOperandPair
Pair of instruction number and operand number.
unsigned addFrameInst(const MCCFIInstruction &Inst)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
SmallVector< DebugSubstitution, 8 > DebugValueSubstitutions
Debug value substitutions: a collection of DebugSubstitution objects, recording changes in where a va...
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, unsigned MaxOperand=UINT_MAX)
Create substitutions for any tracked values in Old, to point at New.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineInstr & cloneMachineInstrBundle(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig)
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, bool NoImplicit=false)
CreateMachineInstr - Allocate a new MachineInstr.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFunction(Function &F, const TargetMachine &Target, const TargetSubtargetInfo &STI, MCContext &Ctx, unsigned FunctionNum)
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
void 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.
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.
Align getAlignment() const
getAlignment - Return the alignment of the function.
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
Function & getFunction()
Return the LLVM function that this machine code represents.
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
BasicBlockListType::iterator iterator
void setDebugInstrNumberingCount(unsigned Num)
Set value of DebugInstrNumberingCount field.
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
void viewCFG() const
viewCFG - This function is meant for use from the debugger.
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
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.
int64_t estimateFunctionSizeInBytes()
Return an estimate of the function's code size, taking into account block and function alignment.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
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.
Definition: MachineInstr.h:69
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:578
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
Definition: MachineInstr.h:546
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:585
iterator_range< filtered_mop_iterator > all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
Definition: MachineInstr.h:762
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.
LocationSize getSize() const
Return the size in bytes of the memory reference.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
const PseudoSourceValue * getPseudoValue() const
const MDNode * getRanges() const
Return the range tag for the memory reference.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
Flags
Flags values. These may be or'd together.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
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:904
iterator_range< debug_compile_units_iterator > debug_compile_units() const
Return an iterator for all DICompileUnits listed in this Module's llvm.dbg.cu named metadata node and...
Definition: Module.h:870
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:297
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:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Align getPrefFunctionAlignment() const
Return the preferred function alignment.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:77
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:694
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
self_iterator getIterator()
Definition: ilist_node.h:132
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:661
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:691
#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:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2115
MaybeAlign getAlign(const Function &F, unsigned Index)
Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:420
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...
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
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:1841
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:760
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