LLVM 22.0.0git
TargetRegisterInfo.cpp
Go to the documentation of this file.
1//==- TargetRegisterInfo.cpp - Target Register Information Implementation --==//
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// This file implements the TargetRegisterInfo interface.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/BitVector.h"
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/SmallSet.h"
29#include "llvm/Config/llvm-config.h"
30#include "llvm/IR/Attributes.h"
32#include "llvm/IR/Function.h"
36#include "llvm/Support/Debug.h"
39#include <cassert>
40#include <utility>
41
42#define DEBUG_TYPE "target-reg-info"
43
44using namespace llvm;
45
47 HugeSizeForSplit("huge-size-for-split", cl::Hidden,
48 cl::desc("A threshold of live range size which may cause "
49 "high compile time cost in global splitting."),
50 cl::init(5000));
51
54 regclass_iterator RCE, const char *const *SRINames,
55 const SubRegCoveredBits *SubIdxRanges, const LaneBitmask *SRILaneMasks,
56 LaneBitmask SRICoveringLanes, const RegClassInfo *const RCIs,
57 const MVT::SimpleValueType *const RCVTLists, unsigned Mode)
58 : InfoDesc(ID), SubRegIndexNames(SRINames), SubRegIdxRanges(SubIdxRanges),
59 SubRegIndexLaneMasks(SRILaneMasks), RegClassBegin(RCB), RegClassEnd(RCE),
60 CoveringLanes(SRICoveringLanes), RCInfos(RCIs), RCVTLists(RCVTLists),
61 HwMode(Mode) {}
62
64
66 const MachineFunction &MF, const LiveInterval &VirtReg) const {
69 MachineInstr *MI = MRI.getUniqueVRegDef(VirtReg.reg());
70 if (MI && TII->isTriviallyReMaterializable(*MI) &&
71 VirtReg.size() > HugeSizeForSplit)
72 return false;
73 return true;
74}
75
77 MCRegister Reg) const {
78 for (MCPhysReg SR : superregs_inclusive(Reg))
79 RegisterSet.set(SR);
80}
81
83 ArrayRef<MCPhysReg> Exceptions) const {
84 // Check that all super registers of reserved regs are reserved as well.
85 BitVector Checked(getNumRegs());
86 for (unsigned Reg : RegisterSet.set_bits()) {
87 if (Checked[Reg])
88 continue;
89 for (MCPhysReg SR : superregs(Reg)) {
90 if (!RegisterSet[SR] && !is_contained(Exceptions, Reg)) {
91 dbgs() << "Error: Super register " << printReg(SR, this)
92 << " of reserved register " << printReg(Reg, this)
93 << " is not reserved.\n";
94 return false;
95 }
96
97 // We transitively check superregs. So we can remember this for later
98 // to avoid compiletime explosion in deep register hierarchies.
99 Checked.set(SR);
100 }
101 }
102 return true;
103}
104
105namespace llvm {
106
108 unsigned SubIdx, const MachineRegisterInfo *MRI) {
109 return Printable([Reg, TRI, SubIdx, MRI](raw_ostream &OS) {
110 if (!Reg)
111 OS << "$noreg";
112 else if (Reg.isStack())
113 OS << "SS#" << Reg.stackSlotIndex();
114 else if (Reg.isVirtual()) {
115 StringRef Name = MRI ? MRI->getVRegName(Reg) : "";
116 if (Name != "") {
117 OS << '%' << Name;
118 } else {
119 OS << '%' << Reg.virtRegIndex();
120 }
121 } else if (!TRI)
122 OS << '$' << "physreg" << Reg.id();
123 else if (Reg < TRI->getNumRegs()) {
124 OS << '$';
125 printLowerCase(TRI->getName(Reg), OS);
126 } else
127 llvm_unreachable("Register kind is unsupported.");
128
129 if (SubIdx) {
130 if (TRI)
131 OS << ':' << TRI->getSubRegIndexName(SubIdx);
132 else
133 OS << ":sub(" << SubIdx << ')';
134 }
135 });
136}
137
139 return Printable([Unit, TRI](raw_ostream &OS) {
140 // Generic printout when TRI is missing.
141 if (!TRI) {
142 OS << "Unit~" << Unit;
143 return;
144 }
145
146 // Check for invalid register units.
147 if (Unit >= TRI->getNumRegUnits()) {
148 OS << "BadUnit~" << Unit;
149 return;
150 }
151
152 // Normal units have at least one root.
153 MCRegUnitRootIterator Roots(Unit, TRI);
154 assert(Roots.isValid() && "Unit has no roots.");
155 OS << TRI->getName(*Roots);
156 for (++Roots; Roots.isValid(); ++Roots)
157 OS << '~' << TRI->getName(*Roots);
158 });
159}
160
162 return Printable([Unit, TRI](raw_ostream &OS) {
163 if (Register::isVirtualRegister(Unit)) {
164 OS << '%' << Register(Unit).virtRegIndex();
165 } else {
166 OS << printRegUnit(Unit, TRI);
167 }
168 });
169}
170
172 const TargetRegisterInfo *TRI) {
173 return Printable([Reg, &RegInfo, TRI](raw_ostream &OS) {
174 if (RegInfo.getRegClassOrNull(Reg))
175 OS << StringRef(TRI->getRegClassName(RegInfo.getRegClass(Reg))).lower();
176 else if (RegInfo.getRegBankOrNull(Reg))
177 OS << StringRef(RegInfo.getRegBankOrNull(Reg)->getName()).lower();
178 else {
179 OS << "_";
180 assert((RegInfo.def_empty(Reg) || RegInfo.getType(Reg).isValid()) &&
181 "Generic registers must have a valid type");
182 }
183 });
184}
185
186} // end namespace llvm
187
188/// getAllocatableClass - Return the maximal subclass of the given register
189/// class that is alloctable, or NULL.
192 if (!RC || RC->isAllocatable())
193 return RC;
194
195 for (BitMaskClassIterator It(RC->getSubClassMask(), *this); It.isValid();
196 ++It) {
197 const TargetRegisterClass *SubRC = getRegClass(It.getID());
198 if (SubRC->isAllocatable())
199 return SubRC;
200 }
201 return nullptr;
202}
203
204template <typename TypeT>
205static const TargetRegisterClass *
207 TypeT Ty) {
208 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
209 assert(Reg.isPhysical() && "reg must be a physical register");
210
211 bool IsDefault = [&]() {
212 if constexpr (std::is_same_v<TypeT, MVT>)
213 return Ty == MVT::Other;
214 else
215 return !Ty.isValid();
216 }();
217
218 // Pick the most sub register class of the right type that contains
219 // this physreg.
220 const TargetRegisterClass *BestRC = nullptr;
221 for (const TargetRegisterClass *RC : TRI->regclasses()) {
222 if ((IsDefault || TRI->isTypeLegalForClass(*RC, Ty)) && RC->contains(Reg) &&
223 (!BestRC || BestRC->hasSubClass(RC)))
224 BestRC = RC;
225 }
226
227 if constexpr (std::is_same_v<TypeT, MVT>)
228 assert(BestRC && "Couldn't find the register class");
229 return BestRC;
230}
231
232template <typename TypeT>
233static const TargetRegisterClass *
235 MCRegister Reg2, TypeT Ty) {
236 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
237 assert(Reg1.isPhysical() && Reg2.isPhysical() &&
238 "Reg1/Reg2 must be a physical register");
239
240 bool IsDefault = [&]() {
241 if constexpr (std::is_same_v<TypeT, MVT>)
242 return Ty == MVT::Other;
243 else
244 return !Ty.isValid();
245 }();
246
247 // Pick the most sub register class of the right type that contains
248 // this physreg.
249 const TargetRegisterClass *BestRC = nullptr;
250 for (const TargetRegisterClass *RC : TRI->regclasses()) {
251 if ((IsDefault || TRI->isTypeLegalForClass(*RC, Ty)) &&
252 RC->contains(Reg1, Reg2) && (!BestRC || BestRC->hasSubClass(RC)))
253 BestRC = RC;
254 }
255
256 if constexpr (std::is_same_v<TypeT, MVT>)
257 assert(BestRC && "Couldn't find the register class");
258 return BestRC;
259}
260
263 return ::getMinimalPhysRegClass(this, Reg, VT);
264}
265
267 MCRegister Reg1, MCRegister Reg2, MVT VT) const {
268 return ::getCommonMinimalPhysRegClass(this, Reg1, Reg2, VT);
269}
270
273 return ::getMinimalPhysRegClass(this, Reg, Ty);
274}
275
277 MCRegister Reg1, MCRegister Reg2, LLT Ty) const {
278 return ::getCommonMinimalPhysRegClass(this, Reg1, Reg2, Ty);
279}
280
281/// getAllocatableSetForRC - Toggle the bits that represent allocatable
282/// registers for the specific register class.
284 const TargetRegisterClass *RC, BitVector &R){
285 assert(RC->isAllocatable() && "invalid for nonallocatable sets");
287 for (MCPhysReg PR : Order)
288 R.set(PR);
289}
290
292 const TargetRegisterClass *RC) const {
293 BitVector Allocatable(getNumRegs());
294 if (RC) {
295 // A register class with no allocatable subclass returns an empty set.
296 const TargetRegisterClass *SubClass = getAllocatableClass(RC);
297 if (SubClass)
298 getAllocatableSetForRC(MF, SubClass, Allocatable);
299 } else {
300 for (const TargetRegisterClass *C : regclasses())
301 if (C->isAllocatable())
302 getAllocatableSetForRC(MF, C, Allocatable);
303 }
304
305 // Mask out the reserved registers
306 const MachineRegisterInfo &MRI = MF.getRegInfo();
307 const BitVector &Reserved = MRI.getReservedRegs();
308 Allocatable.reset(Reserved);
309
310 return Allocatable;
311}
312
313static inline
315 const uint32_t *B,
316 const TargetRegisterInfo *TRI) {
317 for (unsigned I = 0, E = TRI->getNumRegClasses(); I < E; I += 32)
318 if (unsigned Common = *A++ & *B++)
319 return TRI->getRegClass(I + llvm::countr_zero(Common));
320 return nullptr;
321}
322
325 const TargetRegisterClass *B) const {
326 // First take care of the trivial cases.
327 if (A == B)
328 return A;
329 if (!A || !B)
330 return nullptr;
331
332 // Register classes are ordered topologically, so the largest common
333 // sub-class it the common sub-class with the smallest ID.
334 return firstCommonClass(A->getSubClassMask(), B->getSubClassMask(), this);
335}
336
339 const TargetRegisterClass *B,
340 unsigned Idx) const {
341 assert(A && B && "Missing register class");
342 assert(Idx && "Bad sub-register index");
343
344 // Find Idx in the list of super-register indices.
345 for (SuperRegClassIterator RCI(B, this); RCI.isValid(); ++RCI)
346 if (RCI.getSubReg() == Idx)
347 // The bit mask contains all register classes that are projected into B
348 // by Idx. Find a class that is also a sub-class of A.
349 return firstCommonClass(RCI.getMask(), A->getSubClassMask(), this);
350 return nullptr;
351}
352
354getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA,
355 const TargetRegisterClass *RCB, unsigned SubB,
356 unsigned &PreA, unsigned &PreB) const {
357 assert(RCA && SubA && RCB && SubB && "Invalid arguments");
358
359 // Search all pairs of sub-register indices that project into RCA and RCB
360 // respectively. This is quadratic, but usually the sets are very small. On
361 // most targets like X86, there will only be a single sub-register index
362 // (e.g., sub_16bit projecting into GR16).
363 //
364 // The worst case is a register class like DPR on ARM.
365 // We have indices dsub_0..dsub_7 projecting into that class.
366 //
367 // It is very common that one register class is a sub-register of the other.
368 // Arrange for RCA to be the larger register so the answer will be found in
369 // the first iteration. This makes the search linear for the most common
370 // case.
371 const TargetRegisterClass *BestRC = nullptr;
372 unsigned *BestPreA = &PreA;
373 unsigned *BestPreB = &PreB;
374 if (getRegSizeInBits(*RCA) < getRegSizeInBits(*RCB)) {
375 std::swap(RCA, RCB);
376 std::swap(SubA, SubB);
377 std::swap(BestPreA, BestPreB);
378 }
379
380 // Also terminate the search one we have found a register class as small as
381 // RCA.
382 unsigned MinSize = getRegSizeInBits(*RCA);
383
384 for (SuperRegClassIterator IA(RCA, this, true); IA.isValid(); ++IA) {
385 unsigned FinalA = composeSubRegIndices(IA.getSubReg(), SubA);
386 for (SuperRegClassIterator IB(RCB, this, true); IB.isValid(); ++IB) {
387 // Check if a common super-register class exists for this index pair.
388 const TargetRegisterClass *RC =
389 firstCommonClass(IA.getMask(), IB.getMask(), this);
390 if (!RC || getRegSizeInBits(*RC) < MinSize)
391 continue;
392
393 // The indexes must compose identically: PreA+SubA == PreB+SubB.
394 unsigned FinalB = composeSubRegIndices(IB.getSubReg(), SubB);
395 if (FinalA != FinalB)
396 continue;
397
398 // Is RC a better candidate than BestRC?
399 if (BestRC && getRegSizeInBits(*RC) >= getRegSizeInBits(*BestRC))
400 continue;
401
402 // Yes, RC is the smallest super-register seen so far.
403 BestRC = RC;
404 *BestPreA = IA.getSubReg();
405 *BestPreB = IB.getSubReg();
406
407 // Bail early if we reached MinSize. We won't find a better candidate.
408 if (getRegSizeInBits(*BestRC) == MinSize)
409 return BestRC;
410 }
411 }
412 return BestRC;
413}
414
416 const TargetRegisterClass *DefRC, unsigned DefSubReg,
417 const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const {
418 // Same register class.
419 //
420 // When processing uncoalescable copies / bitcasts, it is possible we reach
421 // here with the same register class, but mismatched subregister indices.
422 if (DefRC == SrcRC && DefSubReg == SrcSubReg)
423 return DefRC;
424
425 // Both operands are sub registers. Check if they share a register class.
426 unsigned SrcIdx, DefIdx;
427 if (SrcSubReg && DefSubReg) {
428 return getCommonSuperRegClass(SrcRC, SrcSubReg, DefRC, DefSubReg, SrcIdx,
429 DefIdx);
430 }
431
432 // At most one of the register is a sub register, make it Src to avoid
433 // duplicating the test.
434 if (!SrcSubReg) {
435 std::swap(DefSubReg, SrcSubReg);
436 std::swap(DefRC, SrcRC);
437 }
438
439 // One of the register is a sub register, check if we can get a superclass.
440 if (SrcSubReg)
441 return getMatchingSuperRegClass(SrcRC, DefRC, SrcSubReg);
442
443 // Plain copy.
444 return getCommonSubClass(DefRC, SrcRC);
445}
446
448 const TargetRegisterClass *RC) const {
449 return 1.0;
450}
451
452// Compute target-independent register allocator hints to help eliminate copies.
454 Register VirtReg, ArrayRef<MCPhysReg> Order,
456 const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const {
457 const MachineRegisterInfo &MRI = MF.getRegInfo();
458 const std::pair<unsigned, SmallVector<Register, 4>> *Hints_MRI =
459 MRI.getRegAllocationHints(VirtReg);
460
461 if (!Hints_MRI)
462 return false;
463
464 SmallSet<Register, 32> HintedRegs;
465 // First hint may be a target hint.
466 bool Skip = (Hints_MRI->first != 0);
467 for (auto Reg : Hints_MRI->second) {
468 if (Skip) {
469 Skip = false;
470 continue;
471 }
472
473 // Target-independent hints are either a physical or a virtual register.
474 Register Phys = Reg;
475 if (VRM && Phys.isVirtual())
476 Phys = VRM->getPhys(Phys);
477
478 // Don't add the same reg twice (Hints_MRI may contain multiple virtual
479 // registers allocated to the same physreg).
480 if (!HintedRegs.insert(Phys).second)
481 continue;
482 // Check that Phys is a valid hint in VirtReg's register class.
483 if (!Phys.isPhysical())
484 continue;
485 if (MRI.isReserved(Phys))
486 continue;
487 // Check that Phys is in the allocation order. We shouldn't heed hints
488 // from VirtReg's register class if they aren't in the allocation order. The
489 // target probably has a reason for removing the register.
490 if (!is_contained(Order, Phys))
491 continue;
492
493 // All clear, tell the register allocator to prefer this register.
494 Hints.push_back(Phys.id());
495 }
496 return false;
497}
498
500 MCRegister PhysReg, const MachineFunction &MF) const {
501 if (!PhysReg)
502 return false;
503 const uint32_t *callerPreservedRegs =
505 if (callerPreservedRegs) {
506 assert(PhysReg.isPhysical() && "Expected physical register");
507 return (callerPreservedRegs[PhysReg.id() / 32] >> PhysReg.id() % 32) & 1;
508 }
509 return false;
510}
511
515
519
521 const uint32_t *mask1) const {
522 unsigned N = (getNumRegs()+31) / 32;
523 for (unsigned I = 0; I < N; ++I)
524 if ((mask0[I] & mask1[I]) != mask0[I])
525 return false;
526 return true;
527}
528
531 const MachineRegisterInfo &MRI) const {
532 const TargetRegisterClass *RC{};
533 if (Reg.isPhysical()) {
534 // The size is not directly available for physical registers.
535 // Instead, we need to access a register class that contains Reg and
536 // get the size of that register class.
537 RC = getMinimalPhysRegClass(Reg);
538 assert(RC && "Unable to deduce the register class");
539 return getRegSizeInBits(*RC);
540 }
541 LLT Ty = MRI.getType(Reg);
542 if (Ty.isValid())
543 return Ty.getSizeInBits();
544
545 // Since Reg is not a generic register, it may have a register class.
546 RC = MRI.getRegClass(Reg);
547 assert(RC && "Unable to deduce the register class");
548 return getRegSizeInBits(*RC);
549}
550
552 const TargetRegisterClass *RC, LaneBitmask LaneMask,
553 SmallVectorImpl<unsigned> &NeededIndexes) const {
554 SmallVector<unsigned, 8> PossibleIndexes;
555 unsigned BestIdx = 0;
556 unsigned BestCover = 0;
557
558 for (unsigned Idx = 1, E = getNumSubRegIndices(); Idx < E; ++Idx) {
559 // Is this index even compatible with the given class?
560 if (getSubClassWithSubReg(RC, Idx) != RC)
561 continue;
562 LaneBitmask SubRegMask = getSubRegIndexLaneMask(Idx);
563 // Early exit if we found a perfect match.
564 if (SubRegMask == LaneMask) {
565 BestIdx = Idx;
566 break;
567 }
568
569 // The index must not cover any lanes outside \p LaneMask.
570 if ((SubRegMask & ~LaneMask).any())
571 continue;
572
573 unsigned PopCount = SubRegMask.getNumLanes();
574 PossibleIndexes.push_back(Idx);
575 if (PopCount > BestCover) {
576 BestCover = PopCount;
577 BestIdx = Idx;
578 }
579 }
580
581 // Abort if we cannot possibly implement the COPY with the given indexes.
582 if (BestIdx == 0)
583 return false;
584
585 NeededIndexes.push_back(BestIdx);
586
587 // Greedy heuristic: Keep iterating keeping the best covering subreg index
588 // each time.
589 LaneBitmask LanesLeft = LaneMask & ~getSubRegIndexLaneMask(BestIdx);
590 while (LanesLeft.any()) {
591 unsigned BestIdx = 0;
592 int BestCover = std::numeric_limits<int>::min();
593 for (unsigned Idx : PossibleIndexes) {
594 LaneBitmask SubRegMask = getSubRegIndexLaneMask(Idx);
595 // Early exit if we found a perfect match.
596 if (SubRegMask == LanesLeft) {
597 BestIdx = Idx;
598 break;
599 }
600
601 // Do not cover already-covered lanes to avoid creating cycles
602 // in copy bundles (= bundle contains copies that write to the
603 // registers).
604 if ((SubRegMask & ~LanesLeft).any())
605 continue;
606
607 // Try to cover as many of the remaining lanes as possible.
608 const int Cover = (SubRegMask & LanesLeft).getNumLanes();
609 if (Cover > BestCover) {
610 BestCover = Cover;
611 BestIdx = Idx;
612 }
613 }
614
615 if (BestIdx == 0)
616 return false; // Impossible to handle
617
618 NeededIndexes.push_back(BestIdx);
619
620 LanesLeft &= ~getSubRegIndexLaneMask(BestIdx);
621 }
622
623 return BestIdx;
624}
625
626unsigned TargetRegisterInfo::getSubRegIdxSize(unsigned Idx) const {
627 assert(Idx && Idx < getNumSubRegIndices() &&
628 "This is not a subregister index");
629 return SubRegIdxRanges[HwMode * getNumSubRegIndices() + Idx].Size;
630}
631
632unsigned TargetRegisterInfo::getSubRegIdxOffset(unsigned Idx) const {
633 assert(Idx && Idx < getNumSubRegIndices() &&
634 "This is not a subregister index");
635 return SubRegIdxRanges[HwMode * getNumSubRegIndices() + Idx].Offset;
636}
637
640 const MachineRegisterInfo *MRI) const {
641 while (true) {
642 const MachineInstr *MI = MRI->getVRegDef(SrcReg);
643 if (!MI->isCopyLike())
644 return SrcReg;
645
646 Register CopySrcReg;
647 if (MI->isCopy())
648 CopySrcReg = MI->getOperand(1).getReg();
649 else {
650 assert(MI->isSubregToReg() && "Bad opcode for lookThruCopyLike");
651 CopySrcReg = MI->getOperand(2).getReg();
652 }
653
654 if (!CopySrcReg.isVirtual())
655 return CopySrcReg;
656
657 SrcReg = CopySrcReg;
658 }
659}
660
662 Register SrcReg, const MachineRegisterInfo *MRI) const {
663 while (true) {
664 const MachineInstr *MI = MRI->getVRegDef(SrcReg);
665 // Found the real definition, return it if it has a single use.
666 if (!MI->isCopyLike())
667 return MRI->hasOneNonDBGUse(SrcReg) ? SrcReg : Register();
668
669 Register CopySrcReg;
670 if (MI->isCopy())
671 CopySrcReg = MI->getOperand(1).getReg();
672 else {
673 assert(MI->isSubregToReg() && "Bad opcode for lookThruCopyLike");
674 CopySrcReg = MI->getOperand(2).getReg();
675 }
676
677 // Continue only if the next definition in the chain is for a virtual
678 // register that has a single use.
679 if (!CopySrcReg.isVirtual() || !MRI->hasOneNonDBGUse(CopySrcReg))
680 return Register();
681
682 SrcReg = CopySrcReg;
683 }
684}
685
688 assert(!Offset.getScalable() && "Scalable offsets are not handled");
690}
691
694 unsigned PrependFlags,
695 const StackOffset &Offset) const {
696 assert((PrependFlags &
699 "Unsupported prepend flag");
700 SmallVector<uint64_t, 16> OffsetExpr;
701 if (PrependFlags & DIExpression::DerefBefore)
702 OffsetExpr.push_back(dwarf::DW_OP_deref);
703 getOffsetOpcodes(Offset, OffsetExpr);
704 if (PrependFlags & DIExpression::DerefAfter)
705 OffsetExpr.push_back(dwarf::DW_OP_deref);
706 return DIExpression::prependOpcodes(Expr, OffsetExpr,
707 PrependFlags & DIExpression::StackValue,
708 PrependFlags & DIExpression::EntryValue);
709}
710
711#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
713void TargetRegisterInfo::dumpReg(Register Reg, unsigned SubRegIndex,
714 const TargetRegisterInfo *TRI) {
715 dbgs() << printReg(Reg, TRI, SubRegIndex) << "\n";
716}
717#endif
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:638
This file contains constants used for implementing Dwarf debug support.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Live Register Matrix
#define I(x, y, z)
Definition MD5.cpp:58
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallSet class.
This file contains some functions that are useful when dealing with strings.
static const TargetRegisterClass * getMinimalPhysRegClass(const TargetRegisterInfo *TRI, MCRegister Reg, TypeT Ty)
static void getAllocatableSetForRC(const MachineFunction &MF, const TargetRegisterClass *RC, BitVector &R)
getAllocatableSetForRC - Toggle the bits that represent allocatable registers for the specific regist...
static const TargetRegisterClass * firstCommonClass(const uint32_t *A, const uint32_t *B, const TargetRegisterInfo *TRI)
static const TargetRegisterClass * getCommonMinimalPhysRegClass(const TargetRegisterInfo *TRI, MCRegister Reg1, MCRegister Reg2, TypeT Ty)
static cl::opt< unsigned > HugeSizeForSplit("huge-size-for-split", cl::Hidden, cl::desc("A threshold of live range size which may cause " "high compile time cost in global splitting."), cl::init(5000))
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
This class encapuslates the logic to iterate over bitmask returned by the various RegClass related AP...
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
BitVector & reset()
Definition BitVector.h:392
BitVector & set()
Definition BitVector.h:351
DWARF expression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:270
LiveInterval - This class represents the liveness of a register, or stack slot.
Register reg() const
size_t size() const
MCRegUnitRootIterator enumerates the root registers of a register unit.
bool isValid() const
Check if the iterator is at the end of the list.
unsigned getNumSubRegIndices() const
Return the number of sub-register indices understood by the target.
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
iterator_range< MCSuperRegIterator > superregs_inclusive(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, including Reg.
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
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition MCRegister.h:64
constexpr unsigned id() const
Definition MCRegister.h:74
Machine Value Type.
bool shouldRealignStack() const
Return true if stack realignment is forced by function attributes or if the stack alignment.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Simple wrapper around std::function<void(raw_ostream&)>.
Definition Printable.h:38
Wrapper class representing virtual and physical registers.
Definition Register.h:19
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:74
static constexpr bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:61
constexpr unsigned id() const
Definition Register.h:95
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:78
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:133
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:181
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:31
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
LLVM_ABI std::string lower() const
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
TargetInstrInfo - Interface to description of machine instruction set.
ArrayRef< MCPhysReg > getRawAllocationOrder(const MachineFunction &MF, bool Rev=false) const
Returns the preferred order for allocating registers from this register class in MF.
bool isAllocatable() const
Return true if this register class may be used to create virtual registers.
bool hasSubClass(const TargetRegisterClass *RC) const
Return true if the specified TargetRegisterClass is a proper sub-class of this TargetRegisterClass.
const uint32_t * getSubClassMask() const
Returns a bit vector of subclasses, including this one.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
const TargetRegisterClass *const * regclass_iterator
const TargetRegisterClass * getMinimalPhysRegClass(MCRegister Reg, MVT VT=MVT::Other) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
iterator_range< regclass_iterator > regclasses() const
virtual bool shouldRegionSplitForVirtReg(const MachineFunction &MF, const LiveInterval &VirtReg) const
Region split has a high compile time cost especially for large live range.
virtual bool canRealignStack(const MachineFunction &MF) const
True if the stack can be realigned for the target.
virtual const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const
Returns the largest legal sub-class of RC that supports the sub-register index Idx.
bool getCoveringSubRegIndexes(const TargetRegisterClass *RC, LaneBitmask LaneMask, SmallVectorImpl< unsigned > &Indexes) const
Try to find one or more subregister indexes to cover LaneMask.
const TargetRegisterClass * getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
unsigned composeSubRegIndices(unsigned a, unsigned b) const
Return the subregister index you get from composing two subregister indices.
const TargetRegisterClass * getCommonSubClass(const TargetRegisterClass *A, const TargetRegisterClass *B) const
Find the largest common subclass of A and B.
const TargetRegisterClass * getMinimalPhysRegClassLLT(MCRegister Reg, LLT Ty=LLT()) const
Returns the Register Class of a physical register of the given type, picking the most sub register cl...
void markSuperRegs(BitVector &RegisterSet, MCRegister Reg) const
Mark a register and all its aliases as reserved in the given set.
virtual float getSpillWeightScaleFactor(const TargetRegisterClass *RC) const
Get the scale factor of spill weight for this register class.
bool regmaskSubsetEqual(const uint32_t *mask0, const uint32_t *mask1) const
Return true if all bits that are set in mask mask0 are also set in mask1.
TypeSize getRegSizeInBits(const TargetRegisterClass &RC) const
Return the size in bits of a register from class RC.
virtual const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID) const
Return a mask of call-preserved registers for the given calling convention on the current function.
virtual Register lookThruSingleUseCopyChain(Register SrcReg, const MachineRegisterInfo *MRI) const
Find the original SrcReg unless it is the target of a copy-like operation, in which case we chain bac...
LaneBitmask getSubRegIndexLaneMask(unsigned SubIdx) const
Return a bitmask representing the parts of a register that are covered by SubIdx.
bool checkAllSuperRegsMarked(const BitVector &RegisterSet, ArrayRef< MCPhysReg > Exceptions=ArrayRef< MCPhysReg >()) const
Returns true if for every register in the set all super registers are part of the set as well.
const TargetRegisterClass * getAllocatableClass(const TargetRegisterClass *RC) const
Return the maximal subclass of the given register class that is allocatable or NULL.
virtual Register lookThruCopyLike(Register SrcReg, const MachineRegisterInfo *MRI) const
Returns the original SrcReg unless it is the target of a copy-like operation, in which case we chain ...
const TargetRegisterClass * getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA, const TargetRegisterClass *RCB, unsigned SubB, unsigned &PreA, unsigned &PreB) const
Find a common super-register class if it exists.
unsigned getSubRegIdxSize(unsigned Idx) const
Get the size of the bit range covered by a sub-register index.
static void dumpReg(Register Reg, unsigned SubRegIndex=0, const TargetRegisterInfo *TRI=nullptr)
Debugging helper: dump register in human readable form to dbgs() stream.
virtual bool shouldRealignStack(const MachineFunction &MF) const
True if storage within the function requires the stack pointer to be aligned more than the normal cal...
TargetRegisterInfo(const TargetRegisterInfoDesc *ID, regclass_iterator RCB, regclass_iterator RCE, const char *const *SRINames, const SubRegCoveredBits *SubIdxRanges, const LaneBitmask *SRILaneMasks, LaneBitmask CoveringLanes, const RegClassInfo *const RCIs, const MVT::SimpleValueType *const RCVTLists, unsigned Mode=0)
DIExpression * prependOffsetExpression(const DIExpression *Expr, unsigned PrependFlags, const StackOffset &Offset) const
Prepends a DWARF expression for Offset to DIExpression Expr.
const TargetRegisterClass * findCommonRegClass(const TargetRegisterClass *DefRC, unsigned DefSubReg, const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const
Find a common register class that can accomodate both the source and destination operands of a copy-l...
const TargetRegisterClass * getCommonMinimalPhysRegClass(MCRegister Reg1, MCRegister Reg2, MVT VT=MVT::Other) const
Returns the common Register Class of two physical registers of the given type, picking the most sub r...
virtual bool isCalleeSavedPhysReg(MCRegister PhysReg, const MachineFunction &MF) const
This is a wrapper around getCallPreservedMask().
unsigned getSubRegIdxOffset(unsigned Idx) const
Get the offset of the bit range covered by a sub-register index.
virtual const TargetRegisterClass * getMatchingSuperRegClass(const TargetRegisterClass *A, const TargetRegisterClass *B, unsigned Idx) const
Return a subclass of the specified register class A so that each register in it has a sub-register of...
virtual void getOffsetOpcodes(const StackOffset &Offset, SmallVectorImpl< uint64_t > &Ops) const
Gets the DWARF expression opcodes for Offset.
BitVector getAllocatableSet(const MachineFunction &MF, const TargetRegisterClass *RC=nullptr) const
Returns a bitset indexed by register number indicating if a register is allocatable or not.
virtual bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=nullptr, const LiveRegMatrix *Matrix=nullptr) const
Get a list of 'hint' registers that the register allocator should try first when allocating a physica...
const TargetRegisterClass * getCommonMinimalPhysRegClassLLT(MCRegister Reg1, MCRegister Reg2, LLT Ty=LLT()) const
Returns the common Register Class of two physical registers of the given type, picking the most sub r...
virtual const TargetInstrInfo * getInstrInfo() const
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
Definition VirtRegMap.h:91
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
LLVM_ABI void printLowerCase(StringRef String, raw_ostream &Out)
printLowerCase - Print each character as lowercase if it is uppercase.
LLVM_ABI Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:186
LLVM_ABI Printable printVRegOrUnit(unsigned VRegOrUnit, const TargetRegisterInfo *TRI)
Create Printable object to print virtual registers and physical registers on a raw_ostream.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1877
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:853
#define N
constexpr bool any() const
Definition LaneBitmask.h:53
unsigned getNumLanes() const
Definition LaneBitmask.h:76
Extra information, not in MCRegisterDesc, about registers.
SubRegCoveredBits - Emitted by tablegen: bit range covered by a subreg index, -1 in any being invalid...