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
106 unsigned SubIdx, const MachineRegisterInfo *MRI) {
107 return Printable([Reg, TRI, SubIdx, MRI](raw_ostream &OS) {
108 if (!Reg)
109 OS << "$noreg";
110 else if (Reg.isStack())
111 OS << "SS#" << Reg.stackSlotIndex();
112 else if (Reg.isVirtual()) {
113 StringRef Name = MRI ? MRI->getVRegName(Reg) : "";
114 if (Name != "") {
115 OS << '%' << Name;
116 } else {
117 OS << '%' << Reg.virtRegIndex();
118 }
119 } else if (!TRI)
120 OS << '$' << "physreg" << Reg.id();
121 else if (Reg < TRI->getNumRegs()) {
122 OS << '$';
123 printLowerCase(TRI->getName(Reg), OS);
124 } else
125 llvm_unreachable("Register kind is unsupported.");
126
127 if (SubIdx) {
128 if (TRI)
129 OS << ':' << TRI->getSubRegIndexName(SubIdx);
130 else
131 OS << ":sub(" << SubIdx << ')';
132 }
133 });
134}
135
137 return Printable([Unit, TRI](raw_ostream &OS) {
138 // Generic printout when TRI is missing.
139 if (!TRI) {
140 OS << "Unit~" << static_cast<unsigned>(Unit);
141 return;
142 }
143
144 // Check for invalid register units.
145 if (static_cast<unsigned>(Unit) >= TRI->getNumRegUnits()) {
146 OS << "BadUnit~" << static_cast<unsigned>(Unit);
147 return;
148 }
149
150 // Normal units have at least one root.
151 MCRegUnitRootIterator Roots(Unit, TRI);
152 assert(Roots.isValid() && "Unit has no roots.");
153 OS << TRI->getName(*Roots);
154 for (++Roots; Roots.isValid(); ++Roots)
155 OS << '~' << TRI->getName(*Roots);
156 });
157}
158
160 const TargetRegisterInfo *TRI) {
161 return Printable([VRegOrUnit, TRI](raw_ostream &OS) {
162 if (VRegOrUnit.isVirtualReg()) {
163 OS << '%' << VRegOrUnit.asVirtualReg().virtRegIndex();
164 } else {
165 OS << printRegUnit(VRegOrUnit.asMCRegUnit(), TRI);
166 }
167 });
168}
169
171 const MachineRegisterInfo &RegInfo,
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/// getAllocatableClass - Return the maximal subclass of the given register
187/// class that is alloctable, or NULL.
190 if (!RC || RC->isAllocatable())
191 return RC;
192
193 for (BitMaskClassIterator It(RC->getSubClassMask(), *this); It.isValid();
194 ++It) {
195 const TargetRegisterClass *SubRC = getRegClass(It.getID());
196 if (SubRC->isAllocatable())
197 return SubRC;
198 }
199 return nullptr;
200}
201
202template <typename TypeT>
203static const TargetRegisterClass *
205 TypeT Ty) {
206 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
207 assert(Reg.isPhysical() && "reg must be a physical register");
208
209 bool IsDefault = [&]() {
210 if constexpr (std::is_same_v<TypeT, MVT>)
211 return Ty == MVT::Other;
212 else
213 return !Ty.isValid();
214 }();
215
216 // Pick the most sub register class of the right type that contains
217 // this physreg.
218 const TargetRegisterClass *BestRC = nullptr;
219 for (const TargetRegisterClass *RC : TRI->regclasses()) {
220 if ((IsDefault || TRI->isTypeLegalForClass(*RC, Ty)) && RC->contains(Reg) &&
221 (!BestRC || BestRC->hasSubClass(RC)))
222 BestRC = RC;
223 }
224
225 if constexpr (std::is_same_v<TypeT, MVT>)
226 assert(BestRC && "Couldn't find the register class");
227 return BestRC;
228}
229
230template <typename TypeT>
231static const TargetRegisterClass *
233 MCRegister Reg2, TypeT Ty) {
234 static_assert(std::is_same_v<TypeT, MVT> || std::is_same_v<TypeT, LLT>);
235 assert(Reg1.isPhysical() && Reg2.isPhysical() &&
236 "Reg1/Reg2 must be a physical register");
237
238 bool IsDefault = [&]() {
239 if constexpr (std::is_same_v<TypeT, MVT>)
240 return Ty == MVT::Other;
241 else
242 return !Ty.isValid();
243 }();
244
245 // Pick the most sub register class of the right type that contains
246 // this physreg.
247 const TargetRegisterClass *BestRC = nullptr;
248 for (const TargetRegisterClass *RC : TRI->regclasses()) {
249 if ((IsDefault || TRI->isTypeLegalForClass(*RC, Ty)) &&
250 RC->contains(Reg1, Reg2) && (!BestRC || BestRC->hasSubClass(RC)))
251 BestRC = RC;
252 }
253
254 if constexpr (std::is_same_v<TypeT, MVT>)
255 assert(BestRC && "Couldn't find the register class");
256 return BestRC;
257}
258
261 return ::getMinimalPhysRegClass(this, Reg, VT);
262}
263
265 MCRegister Reg1, MCRegister Reg2, MVT VT) const {
266 return ::getCommonMinimalPhysRegClass(this, Reg1, Reg2, VT);
267}
268
271 return ::getMinimalPhysRegClass(this, Reg, Ty);
272}
273
275 MCRegister Reg1, MCRegister Reg2, LLT Ty) const {
276 return ::getCommonMinimalPhysRegClass(this, Reg1, Reg2, Ty);
277}
278
279/// getAllocatableSetForRC - Toggle the bits that represent allocatable
280/// registers for the specific register class.
282 const TargetRegisterClass *RC, BitVector &R){
283 assert(RC->isAllocatable() && "invalid for nonallocatable sets");
285 for (MCPhysReg PR : Order)
286 R.set(PR);
287}
288
290 const TargetRegisterClass *RC) const {
291 BitVector Allocatable(getNumRegs());
292 if (RC) {
293 // A register class with no allocatable subclass returns an empty set.
294 const TargetRegisterClass *SubClass = getAllocatableClass(RC);
295 if (SubClass)
296 getAllocatableSetForRC(MF, SubClass, Allocatable);
297 } else {
298 for (const TargetRegisterClass *C : regclasses())
299 if (C->isAllocatable())
300 getAllocatableSetForRC(MF, C, Allocatable);
301 }
302
303 // Mask out the reserved registers
304 const MachineRegisterInfo &MRI = MF.getRegInfo();
305 const BitVector &Reserved = MRI.getReservedRegs();
306 Allocatable.reset(Reserved);
307
308 return Allocatable;
309}
310
311static inline
313 const uint32_t *B,
314 const TargetRegisterInfo *TRI) {
315 for (unsigned I = 0, E = TRI->getNumRegClasses(); I < E; I += 32)
316 if (unsigned Common = *A++ & *B++)
317 return TRI->getRegClass(I + llvm::countr_zero(Common));
318 return nullptr;
319}
320
323 const TargetRegisterClass *B) const {
324 // First take care of the trivial cases.
325 if (A == B)
326 return A;
327 if (!A || !B)
328 return nullptr;
329
330 // Register classes are ordered topologically, so the largest common
331 // sub-class it the common sub-class with the smallest ID.
332 return firstCommonClass(A->getSubClassMask(), B->getSubClassMask(), this);
333}
334
337 const TargetRegisterClass *B,
338 unsigned Idx) const {
339 assert(A && B && "Missing register class");
340 assert(Idx && "Bad sub-register index");
341
342 // Find Idx in the list of super-register indices.
343 for (SuperRegClassIterator RCI(B, this); RCI.isValid(); ++RCI)
344 if (RCI.getSubReg() == Idx)
345 // The bit mask contains all register classes that are projected into B
346 // by Idx. Find a class that is also a sub-class of A.
347 return firstCommonClass(RCI.getMask(), A->getSubClassMask(), this);
348 return nullptr;
349}
350
352getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA,
353 const TargetRegisterClass *RCB, unsigned SubB,
354 unsigned &PreA, unsigned &PreB) const {
355 assert(RCA && SubA && RCB && SubB && "Invalid arguments");
356
357 // Search all pairs of sub-register indices that project into RCA and RCB
358 // respectively. This is quadratic, but usually the sets are very small. On
359 // most targets like X86, there will only be a single sub-register index
360 // (e.g., sub_16bit projecting into GR16).
361 //
362 // The worst case is a register class like DPR on ARM.
363 // We have indices dsub_0..dsub_7 projecting into that class.
364 //
365 // It is very common that one register class is a sub-register of the other.
366 // Arrange for RCA to be the larger register so the answer will be found in
367 // the first iteration. This makes the search linear for the most common
368 // case.
369 const TargetRegisterClass *BestRC = nullptr;
370 unsigned *BestPreA = &PreA;
371 unsigned *BestPreB = &PreB;
372 if (getRegSizeInBits(*RCA) < getRegSizeInBits(*RCB)) {
373 std::swap(RCA, RCB);
374 std::swap(SubA, SubB);
375 std::swap(BestPreA, BestPreB);
376 }
377
378 // Also terminate the search one we have found a register class as small as
379 // RCA.
380 unsigned MinSize = getRegSizeInBits(*RCA);
381
382 for (SuperRegClassIterator IA(RCA, this, true); IA.isValid(); ++IA) {
383 unsigned FinalA = composeSubRegIndices(IA.getSubReg(), SubA);
384 for (SuperRegClassIterator IB(RCB, this, true); IB.isValid(); ++IB) {
385 // Check if a common super-register class exists for this index pair.
386 const TargetRegisterClass *RC =
387 firstCommonClass(IA.getMask(), IB.getMask(), this);
388 if (!RC || getRegSizeInBits(*RC) < MinSize)
389 continue;
390
391 // The indexes must compose identically: PreA+SubA == PreB+SubB.
392 unsigned FinalB = composeSubRegIndices(IB.getSubReg(), SubB);
393 if (FinalA != FinalB)
394 continue;
395
396 // Is RC a better candidate than BestRC?
397 if (BestRC && getRegSizeInBits(*RC) >= getRegSizeInBits(*BestRC))
398 continue;
399
400 // Yes, RC is the smallest super-register seen so far.
401 BestRC = RC;
402 *BestPreA = IA.getSubReg();
403 *BestPreB = IB.getSubReg();
404
405 // Bail early if we reached MinSize. We won't find a better candidate.
406 if (getRegSizeInBits(*BestRC) == MinSize)
407 return BestRC;
408 }
409 }
410 return BestRC;
411}
412
414 const TargetRegisterClass *DefRC, unsigned DefSubReg,
415 const TargetRegisterClass *SrcRC, unsigned SrcSubReg) const {
416 // Same register class.
417 //
418 // When processing uncoalescable copies / bitcasts, it is possible we reach
419 // here with the same register class, but mismatched subregister indices.
420 if (DefRC == SrcRC && DefSubReg == SrcSubReg)
421 return DefRC;
422
423 // Both operands are sub registers. Check if they share a register class.
424 unsigned SrcIdx, DefIdx;
425 if (SrcSubReg && DefSubReg) {
426 return getCommonSuperRegClass(SrcRC, SrcSubReg, DefRC, DefSubReg, SrcIdx,
427 DefIdx);
428 }
429
430 // At most one of the register is a sub register, make it Src to avoid
431 // duplicating the test.
432 if (!SrcSubReg) {
433 std::swap(DefSubReg, SrcSubReg);
434 std::swap(DefRC, SrcRC);
435 }
436
437 // One of the register is a sub register, check if we can get a superclass.
438 if (SrcSubReg)
439 return getMatchingSuperRegClass(SrcRC, DefRC, SrcSubReg);
440
441 // Plain copy.
442 return getCommonSubClass(DefRC, SrcRC);
443}
444
446 const TargetRegisterClass *RC) const {
447 return 1.0;
448}
449
450// Compute target-independent register allocator hints to help eliminate copies.
452 Register VirtReg, ArrayRef<MCPhysReg> Order,
454 const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const {
455 const MachineRegisterInfo &MRI = MF.getRegInfo();
456 const std::pair<unsigned, SmallVector<Register, 4>> *Hints_MRI =
457 MRI.getRegAllocationHints(VirtReg);
458
459 if (!Hints_MRI)
460 return false;
461
462 SmallSet<Register, 32> HintedRegs;
463 // First hint may be a target hint.
464 bool Skip = (Hints_MRI->first != 0);
465 for (auto Reg : Hints_MRI->second) {
466 if (Skip) {
467 Skip = false;
468 continue;
469 }
470
471 // Target-independent hints are either a physical or a virtual register.
472 Register Phys = Reg;
473 if (VRM && Phys.isVirtual())
474 Phys = VRM->getPhys(Phys);
475
476 // Don't add the same reg twice (Hints_MRI may contain multiple virtual
477 // registers allocated to the same physreg).
478 if (!HintedRegs.insert(Phys).second)
479 continue;
480 // Check that Phys is a valid hint in VirtReg's register class.
481 if (!Phys.isPhysical())
482 continue;
483 if (MRI.isReserved(Phys))
484 continue;
485 // Check that Phys is in the allocation order. We shouldn't heed hints
486 // from VirtReg's register class if they aren't in the allocation order. The
487 // target probably has a reason for removing the register.
488 if (!is_contained(Order, Phys))
489 continue;
490
491 // All clear, tell the register allocator to prefer this register.
492 Hints.push_back(Phys.id());
493 }
494 return false;
495}
496
498 MCRegister PhysReg, const MachineFunction &MF) const {
499 if (!PhysReg)
500 return false;
501 const uint32_t *callerPreservedRegs =
503 if (callerPreservedRegs) {
504 assert(PhysReg.isPhysical() && "Expected physical register");
505 return (callerPreservedRegs[PhysReg.id() / 32] >> PhysReg.id() % 32) & 1;
506 }
507 return false;
508}
509
513
517
519 const uint32_t *mask1) const {
520 unsigned N = (getNumRegs()+31) / 32;
521 for (unsigned I = 0; I < N; ++I)
522 if ((mask0[I] & mask1[I]) != mask0[I])
523 return false;
524 return true;
525}
526
529 const MachineRegisterInfo &MRI) const {
530 const TargetRegisterClass *RC{};
531 if (Reg.isPhysical()) {
532 // The size is not directly available for physical registers.
533 // Instead, we need to access a register class that contains Reg and
534 // get the size of that register class.
535 RC = getMinimalPhysRegClass(Reg);
536 assert(RC && "Unable to deduce the register class");
537 return getRegSizeInBits(*RC);
538 }
539 LLT Ty = MRI.getType(Reg);
540 if (Ty.isValid())
541 return Ty.getSizeInBits();
542
543 // Since Reg is not a generic register, it may have a register class.
544 RC = MRI.getRegClass(Reg);
545 assert(RC && "Unable to deduce the register class");
546 return getRegSizeInBits(*RC);
547}
548
550 const TargetRegisterClass *RC, LaneBitmask LaneMask,
551 SmallVectorImpl<unsigned> &NeededIndexes) const {
552 SmallVector<unsigned, 8> PossibleIndexes;
553 unsigned BestIdx = 0;
554 unsigned BestCover = 0;
555
556 for (unsigned Idx = 1, E = getNumSubRegIndices(); Idx < E; ++Idx) {
557 // Is this index even compatible with the given class?
558 if (getSubClassWithSubReg(RC, Idx) != RC)
559 continue;
560 LaneBitmask SubRegMask = getSubRegIndexLaneMask(Idx);
561 // Early exit if we found a perfect match.
562 if (SubRegMask == LaneMask) {
563 BestIdx = Idx;
564 break;
565 }
566
567 // The index must not cover any lanes outside \p LaneMask.
568 if ((SubRegMask & ~LaneMask).any())
569 continue;
570
571 unsigned PopCount = SubRegMask.getNumLanes();
572 PossibleIndexes.push_back(Idx);
573 if (PopCount > BestCover) {
574 BestCover = PopCount;
575 BestIdx = Idx;
576 }
577 }
578
579 // Abort if we cannot possibly implement the COPY with the given indexes.
580 if (BestIdx == 0)
581 return false;
582
583 NeededIndexes.push_back(BestIdx);
584
585 // Greedy heuristic: Keep iterating keeping the best covering subreg index
586 // each time.
587 LaneBitmask LanesLeft = LaneMask & ~getSubRegIndexLaneMask(BestIdx);
588 while (LanesLeft.any()) {
589 unsigned BestIdx = 0;
590 int BestCover = std::numeric_limits<int>::min();
591 for (unsigned Idx : PossibleIndexes) {
592 LaneBitmask SubRegMask = getSubRegIndexLaneMask(Idx);
593 // Early exit if we found a perfect match.
594 if (SubRegMask == LanesLeft) {
595 BestIdx = Idx;
596 break;
597 }
598
599 // Do not cover already-covered lanes to avoid creating cycles
600 // in copy bundles (= bundle contains copies that write to the
601 // registers).
602 if ((SubRegMask & ~LanesLeft).any())
603 continue;
604
605 // Try to cover as many of the remaining lanes as possible.
606 const int Cover = (SubRegMask & LanesLeft).getNumLanes();
607 if (Cover > BestCover) {
608 BestCover = Cover;
609 BestIdx = Idx;
610 }
611 }
612
613 if (BestIdx == 0)
614 return false; // Impossible to handle
615
616 NeededIndexes.push_back(BestIdx);
617
618 LanesLeft &= ~getSubRegIndexLaneMask(BestIdx);
619 }
620
621 return BestIdx;
622}
623
624unsigned TargetRegisterInfo::getSubRegIdxSize(unsigned Idx) const {
625 assert(Idx && Idx < getNumSubRegIndices() &&
626 "This is not a subregister index");
627 return SubRegIdxRanges[HwMode * getNumSubRegIndices() + Idx].Size;
628}
629
630unsigned TargetRegisterInfo::getSubRegIdxOffset(unsigned Idx) const {
631 assert(Idx && Idx < getNumSubRegIndices() &&
632 "This is not a subregister index");
633 return SubRegIdxRanges[HwMode * getNumSubRegIndices() + Idx].Offset;
634}
635
638 const MachineRegisterInfo *MRI) const {
639 while (true) {
640 const MachineInstr *MI = MRI->getVRegDef(SrcReg);
641 if (!MI->isCopyLike())
642 return SrcReg;
643
644 Register CopySrcReg;
645 if (MI->isCopy())
646 CopySrcReg = MI->getOperand(1).getReg();
647 else {
648 assert(MI->isSubregToReg() && "Bad opcode for lookThruCopyLike");
649 CopySrcReg = MI->getOperand(2).getReg();
650 }
651
652 if (!CopySrcReg.isVirtual())
653 return CopySrcReg;
654
655 SrcReg = CopySrcReg;
656 }
657}
658
660 Register SrcReg, const MachineRegisterInfo *MRI) const {
661 while (true) {
662 const MachineInstr *MI = MRI->getVRegDef(SrcReg);
663 // Found the real definition, return it if it has a single use.
664 if (!MI->isCopyLike())
665 return MRI->hasOneNonDBGUse(SrcReg) ? SrcReg : Register();
666
667 Register CopySrcReg;
668 if (MI->isCopy())
669 CopySrcReg = MI->getOperand(1).getReg();
670 else {
671 assert(MI->isSubregToReg() && "Bad opcode for lookThruCopyLike");
672 CopySrcReg = MI->getOperand(2).getReg();
673 }
674
675 // Continue only if the next definition in the chain is for a virtual
676 // register that has a single use.
677 if (!CopySrcReg.isVirtual() || !MRI->hasOneNonDBGUse(CopySrcReg))
678 return Register();
679
680 SrcReg = CopySrcReg;
681 }
682}
683
686 assert(!Offset.getScalable() && "Scalable offsets are not handled");
688}
689
692 unsigned PrependFlags,
693 const StackOffset &Offset) const {
694 assert((PrependFlags &
697 "Unsupported prepend flag");
698 SmallVector<uint64_t, 16> OffsetExpr;
699 if (PrependFlags & DIExpression::DerefBefore)
700 OffsetExpr.push_back(dwarf::DW_OP_deref);
701 getOffsetOpcodes(Offset, OffsetExpr);
702 if (PrependFlags & DIExpression::DerefAfter)
703 OffsetExpr.push_back(dwarf::DW_OP_deref);
704 return DIExpression::prependOpcodes(Expr, OffsetExpr,
705 PrependFlags & DIExpression::StackValue,
706 PrependFlags & DIExpression::EntryValue);
707}
708
709#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
711void TargetRegisterInfo::dumpReg(Register Reg, unsigned SubRegIndex,
712 const TargetRegisterInfo *TRI) {
713 dbgs() << printReg(Reg, TRI, SubRegIndex) << "\n";
714}
715#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:57
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:40
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:411
BitVector & set()
Definition BitVector.h:370
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:41
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition MCRegister.h:72
constexpr unsigned id() const
Definition MCRegister.h:82
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:20
unsigned virtRegIndex() const
Convert a virtual register number to a 0-based index.
Definition Register.h:87
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr unsigned id() const
Definition Register.h:100
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
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:183
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:30
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
~TargetRegisterInfo() override
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
Wrapper class representing a virtual register or register unit.
Definition Register.h:181
constexpr bool isVirtualReg() const
Definition Register.h:197
constexpr MCRegUnit asMCRegUnit() const
Definition Register.h:201
constexpr Register asVirtualReg() const
Definition Register.h:206
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:532
LLVM_ABI void printLowerCase(StringRef String, raw_ostream &Out)
printLowerCase - Print each character as lowercase if it is uppercase.
LLVM_ABI Printable printRegUnit(MCRegUnit 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:202
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:1897
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printVRegOrUnit(VirtRegOrUnit VRegOrUnit, const TargetRegisterInfo *TRI)
Create Printable object to print virtual registers and physical registers on a raw_ostream.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:869
#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...