RegisterClassInfo.h revision 39b5abf507b43da6b92f68b86406e0015ead18e9
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; 31491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen OwningArrayPtr<unsigned> Order; 32491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 33491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen RCInfo() : Tag(0), NumRegs(0) {} 34491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen operator ArrayRef<unsigned>() const { 3539b5abf507b43da6b92f68b86406e0015ead18e9Frits van Bommel return makeArrayRef(Order.get(), NumRegs); 36491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 37491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen }; 38491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 39491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Brief cached information for each register class. 40491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen OwningArrayPtr<RCInfo> RegClass; 41491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 42491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Tag changes whenever cached information needs to be recomputed. An RCInfo 43491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // entry is valid when its tag matches. 44491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned Tag; 45491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 46491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const MachineFunction *MF; 47491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 48491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 49491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Callee saved registers of last MF. Assumed to be valid until the next 50491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // runOnFunction() call. 51491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const unsigned *CalleeSaved; 52491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 53491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Map register number to CalleeSaved index + 1; 546edf90b8a7168e53409d161fb8b285094c4c9182Jakob Stoklund Olesen SmallVector<uint8_t, 4> CSRNum; 55491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 56491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Reserved registers in the current MF. 57491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen BitVector Reserved; 58491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 59491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Compute all information about RC. 60491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void compute(const TargetRegisterClass *RC) const; 61491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 62491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Return an up-to-date RCInfo for RC. 63491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &get(const TargetRegisterClass *RC) const { 64491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &RCI = RegClass[RC->getID()]; 65491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (Tag != RCI.Tag) 66491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen compute(RC); 67491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return RCI; 68491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 69491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 70491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesenpublic: 71491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen RegisterClassInfo(); 72491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 73491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// runOnFunction - Prepare to answer questions about MF. This must be called 74491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// before any other methods are used. 75491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void runOnMachineFunction(const MachineFunction &MF); 76491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 77491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getNumAllocatableRegs - Returns the number of actually allocatable 78491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers in RC in the current function. 79491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getNumAllocatableRegs(const TargetRegisterClass *RC) const { 80491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC).NumRegs; 81491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 82491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 83491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getOrder - Returns the preferred allocation order for RC. The order 84491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// contains no reserved registers, and registers that alias callee saved 85491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers come last. 86491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen ArrayRef<unsigned> getOrder(const TargetRegisterClass *RC) const { 87491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC); 88491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 89491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 90491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getLastCalleeSavedAlias - Returns the last callee saved register that 91491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// overlaps PhysReg, or 0 if Reg doesn't overlap a CSR. 92491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getLastCalleeSavedAlias(unsigned PhysReg) const { 93491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen assert(TargetRegisterInfo::isPhysicalRegister(PhysReg)); 94491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (unsigned N = CSRNum[PhysReg]) 95491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return CalleeSaved[N-1]; 96491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return 0; 97491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 98448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen 99448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// isReserved - Returns true when PhysReg is a reserved register. 100448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 101448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// Reserved registers may belong to an allocatable register class, but the 102448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// target has explicitly requested that they are not used. 103448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 104448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen bool isReserved(unsigned PhysReg) const { 105448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen return Reserved.test(PhysReg); 106448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen } 107448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen 108448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// isAllocatable - Returns true when PhysReg belongs to an allocatable 109448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// register class and it hasn't been reserved. 110448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// 111448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// Allocatable registers may show up in the allocation order of some virtual 112448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// register, so a register allocator needs to track its liveness and 113448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen /// availability. 114448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen bool isAllocatable(unsigned PhysReg) const { 115a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return TRI->isInAllocatableClass(PhysReg) && !isReserved(PhysReg); 116448ab3ab395ffc9e7fc04d2d6afb41fcac74070dJakob Stoklund Olesen } 117491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen}; 118491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen} // end namespace llvm 119491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 120491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#endif 121491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 122