1 //===- RegisterClassInfo.h - Dynamic Register Class Info --------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the RegisterClassInfo class which provides dynamic
10 // information about target register classes. Callee saved and reserved
11 // registers depends on calling conventions and other dynamic information, so
12 // some things cannot be determined statically.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_CODEGEN_REGISTERCLASSINFO_H
17 #define LLVM_CODEGEN_REGISTERCLASSINFO_H
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/BitVector.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/CodeGen/TargetRegisterInfo.h"
23 #include "llvm/MC/MCRegisterInfo.h"
30 class RegisterClassInfo
{
34 bool ProperSubClass
= false;
36 uint16_t LastCostChange
= 0;
37 std::unique_ptr
<MCPhysReg
[]> Order
;
41 operator ArrayRef
<MCPhysReg
>() const {
42 return makeArrayRef(Order
.get(), NumRegs
);
46 // Brief cached information for each register class.
47 std::unique_ptr
<RCInfo
[]> RegClass
;
49 // Tag changes whenever cached information needs to be recomputed. An RCInfo
50 // entry is valid when its tag matches.
53 const MachineFunction
*MF
= nullptr;
54 const TargetRegisterInfo
*TRI
= nullptr;
56 // Callee saved registers of last MF. Assumed to be valid until the next
57 // runOnFunction() call.
58 // Used only to determine if an update was made to CalleeSavedAliases.
59 const MCPhysReg
*CalleeSavedRegs
= nullptr;
61 // Map register alias to the callee saved Register.
62 SmallVector
<MCPhysReg
, 4> CalleeSavedAliases
;
64 // Reserved registers in the current MF.
67 std::unique_ptr
<unsigned[]> PSetLimits
;
69 // Compute all information about RC.
70 void compute(const TargetRegisterClass
*RC
) const;
72 // Return an up-to-date RCInfo for RC.
73 const RCInfo
&get(const TargetRegisterClass
*RC
) const {
74 const RCInfo
&RCI
= RegClass
[RC
->getID()];
83 /// runOnFunction - Prepare to answer questions about MF. This must be called
84 /// before any other methods are used.
85 void runOnMachineFunction(const MachineFunction
&MF
);
87 /// getNumAllocatableRegs - Returns the number of actually allocatable
88 /// registers in RC in the current function.
89 unsigned getNumAllocatableRegs(const TargetRegisterClass
*RC
) const {
90 return get(RC
).NumRegs
;
93 /// getOrder - Returns the preferred allocation order for RC. The order
94 /// contains no reserved registers, and registers that alias callee saved
95 /// registers come last.
96 ArrayRef
<MCPhysReg
> getOrder(const TargetRegisterClass
*RC
) const {
100 /// isProperSubClass - Returns true if RC has a legal super-class with more
101 /// allocatable registers.
103 /// Register classes like GR32_NOSP are not proper sub-classes because %esp
104 /// is not allocatable. Similarly, tGPR is not a proper sub-class in Thumb
105 /// mode because the GPR super-class is not legal.
106 bool isProperSubClass(const TargetRegisterClass
*RC
) const {
107 return get(RC
).ProperSubClass
;
110 /// getLastCalleeSavedAlias - Returns the last callee saved register that
111 /// overlaps PhysReg, or 0 if Reg doesn't overlap a CalleeSavedAliases.
112 unsigned getLastCalleeSavedAlias(unsigned PhysReg
) const {
113 assert(Register::isPhysicalRegister(PhysReg
));
114 if (PhysReg
< CalleeSavedAliases
.size())
115 return CalleeSavedAliases
[PhysReg
];
119 /// Get the minimum register cost in RC's allocation order.
120 /// This is the smallest value returned by TRI->getCostPerUse(Reg) for all
121 /// the registers in getOrder(RC).
122 unsigned getMinCost(const TargetRegisterClass
*RC
) {
123 return get(RC
).MinCost
;
126 /// Get the position of the last cost change in getOrder(RC).
128 /// All registers in getOrder(RC).slice(getLastCostChange(RC)) will have the
129 /// same cost according to TRI->getCostPerUse().
130 unsigned getLastCostChange(const TargetRegisterClass
*RC
) {
131 return get(RC
).LastCostChange
;
134 /// Get the register unit limit for the given pressure set index.
136 /// RegisterClassInfo adjusts this limit for reserved registers.
137 unsigned getRegPressureSetLimit(unsigned Idx
) const {
138 if (!PSetLimits
[Idx
])
139 PSetLimits
[Idx
] = computePSetLimit(Idx
);
140 return PSetLimits
[Idx
];
144 unsigned computePSetLimit(unsigned Idx
) const;
147 } // end namespace llvm
149 #endif // LLVM_CODEGEN_REGISTERCLASSINFO_H