1491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen//===-- RegisterClassInfo.h - Dynamic Register Class Info -*- C++ -*-------===// 2491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// 3491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 4491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// 5491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 6491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 7491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// 8491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 9491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// 10491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// This file implements the RegisterClassInfo class which provides dynamic 11491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// information about target register classes. Callee saved and reserved 12491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// registers depends on calling conventions and other dynamic information, so 13491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// some things cannot be determined statically. 14491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen// 15491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 16491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 17491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#ifndef LLVM_CODEGEN_REGISTERCLASSINFO_H 18491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#define LLVM_CODEGEN_REGISTERCLASSINFO_H 19491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 20491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 21491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#include "llvm/ADT/BitVector.h" 22491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#include "llvm/ADT/OwningPtr.h" 23491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h" 24491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 25491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesennamespace llvm { 26491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 27491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesenclass RegisterClassInfo { 28491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen struct RCInfo { 29491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned Tag; 30491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned NumRegs; 31f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen bool ProperSubClass; 32491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen OwningArrayPtr<unsigned> Order; 33491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 34f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen RCInfo() : Tag(0), NumRegs(0), ProperSubClass(false) {} 35491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen operator ArrayRef<unsigned>() const { 3639b5abf507b43da6b92f68b86406e0015ead18e9Frits van Bommel return makeArrayRef(Order.get(), NumRegs); 37491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 38491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen }; 39491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 40491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Brief cached information for each register class. 41491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen OwningArrayPtr<RCInfo> RegClass; 42491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 43491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Tag changes whenever cached information needs to be recomputed. An RCInfo 44491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // entry is valid when its tag matches. 45491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned Tag; 46491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 47491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const MachineFunction *MF; 48491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 49491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 50491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Callee saved registers of last MF. Assumed to be valid until the next 51491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // runOnFunction() call. 52015f228861ef9b337366f92f637d4e8d624bb006Craig Topper const uint16_t *CalleeSaved; 53491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 54491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Map register number to CalleeSaved index + 1; 556edf90b8a7168e53409d161fb8b285094c4c9182Jakob Stoklund Olesen SmallVector<uint8_t, 4> CSRNum; 56491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 57491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Reserved registers in the current MF. 58491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen BitVector Reserved; 59491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 60491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Compute all information about RC. 61491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void compute(const TargetRegisterClass *RC) const; 62491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 63491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Return an up-to-date RCInfo for RC. 64491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &get(const TargetRegisterClass *RC) const { 65491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &RCI = RegClass[RC->getID()]; 66491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (Tag != RCI.Tag) 67491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen compute(RC); 68491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return RCI; 69491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 70491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 71491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesenpublic: 72491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen RegisterClassInfo(); 73491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 74491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// runOnFunction - Prepare to answer questions about MF. This must be called 75491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// before any other methods are used. 76491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void runOnMachineFunction(const MachineFunction &MF); 77491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 78491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getNumAllocatableRegs - Returns the number of actually allocatable 79491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers in RC in the current function. 80491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getNumAllocatableRegs(const TargetRegisterClass *RC) const { 81491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC).NumRegs; 82491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 83491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 84491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getOrder - Returns the preferred allocation order for RC. The order 85491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// contains no reserved registers, and registers that alias callee saved 86491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers come last. 87491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen ArrayRef<unsigned> getOrder(const TargetRegisterClass *RC) const { 88491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC); 89491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 90491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 91f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// isProperSubClass - Returns true if RC has a legal super-class with more 92f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// allocatable registers. 93f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// 94f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// Register classes like GR32_NOSP are not proper sub-classes because %esp 95f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// is not allocatable. Similarly, tGPR is not a proper sub-class in Thumb 96f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// mode because the GPR super-class is not legal. 97f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen bool isProperSubClass(const TargetRegisterClass *RC) const { 98f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen return get(RC).ProperSubClass; 99f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen } 100f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen 101491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getLastCalleeSavedAlias - Returns the last callee saved register that 102491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// overlaps PhysReg, or 0 if Reg doesn't overlap a CSR. 103491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getLastCalleeSavedAlias(unsigned PhysReg) const { 104491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen assert(TargetRegisterInfo::isPhysicalRegister(PhysReg)); 105491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (unsigned N = CSRNum[PhysReg]) 106491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return CalleeSaved[N-1]; 107491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return 0; 108491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 109448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen 110448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// isReserved - Returns true when PhysReg is a reserved register. 111448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 112448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// Reserved registers may belong to an allocatable register class, but the 113448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// target has explicitly requested that they are not used. 114448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 115448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen bool isReserved(unsigned PhysReg) const { 116448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen return Reserved.test(PhysReg); 117448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen } 118448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen 119448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// isAllocatable - Returns true when PhysReg belongs to an allocatable 120448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// register class and it hasn't been reserved. 121448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 122448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// Allocatable registers may show up in the allocation order of some virtual 123448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// register, so a register allocator needs to track its liveness and 124448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// availability. 125448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen bool isAllocatable(unsigned PhysReg) const { 126a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return TRI->isInAllocatableClass(PhysReg) && !isReserved(PhysReg); 127448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen } 128491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen}; 129491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen} // end namespace llvm 130491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 131491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#endif 132491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 133