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; 32c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen uint8_t MinCost; 33c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen uint16_t LastCostChange; 3439b5c0c049a19c7a7feffc9506da07923cc136e4Jakob Stoklund Olesen OwningArrayPtr<MCPhysReg> Order; 35491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 36c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen RCInfo() 37c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen : Tag(0), NumRegs(0), ProperSubClass(false), MinCost(0), 38c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen LastCostChange(0) {} 39c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen 4039b5c0c049a19c7a7feffc9506da07923cc136e4Jakob Stoklund Olesen operator ArrayRef<MCPhysReg>() const { 4139b5abf507b43da6b92f68b86406e0015ead18e9Frits van Bommel return makeArrayRef(Order.get(), NumRegs); 42491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 43491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen }; 44491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 45491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Brief cached information for each register class. 46491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen OwningArrayPtr<RCInfo> RegClass; 47491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 48491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Tag changes whenever cached information needs to be recomputed. An RCInfo 49491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // entry is valid when its tag matches. 50491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned Tag; 51491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 52491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const MachineFunction *MF; 53491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 54491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 55491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Callee saved registers of last MF. Assumed to be valid until the next 56491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // runOnFunction() call. 57015f228861ef9b337366f92f637d4e8d624bb006Craig Topper const uint16_t *CalleeSaved; 58491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 59491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Map register number to CalleeSaved index + 1; 606edf90b8a7168e53409d161fb8b285094c4c9182Jakob Stoklund Olesen SmallVector<uint8_t, 4> CSRNum; 61491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 62491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Reserved registers in the current MF. 63491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen BitVector Reserved; 64491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 651f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick OwningArrayPtr<unsigned> PSetLimits; 661f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick 67491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Compute all information about RC. 68491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void compute(const TargetRegisterClass *RC) const; 69491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 70491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen // Return an up-to-date RCInfo for RC. 71491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &get(const TargetRegisterClass *RC) const { 72491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen const RCInfo &RCI = RegClass[RC->getID()]; 73491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (Tag != RCI.Tag) 74491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen compute(RC); 75491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return RCI; 76491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 77491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 78491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesenpublic: 79491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen RegisterClassInfo(); 80491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 81491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// runOnFunction - Prepare to answer questions about MF. This must be called 82491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// before any other methods are used. 83491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen void runOnMachineFunction(const MachineFunction &MF); 84491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 85491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getNumAllocatableRegs - Returns the number of actually allocatable 86491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers in RC in the current function. 87491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getNumAllocatableRegs(const TargetRegisterClass *RC) const { 88491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC).NumRegs; 89491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 90491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 91491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getOrder - Returns the preferred allocation order for RC. The order 92491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// contains no reserved registers, and registers that alias callee saved 93491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// registers come last. 9439b5c0c049a19c7a7feffc9506da07923cc136e4Jakob Stoklund Olesen ArrayRef<MCPhysReg> getOrder(const TargetRegisterClass *RC) const { 95491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return get(RC); 96491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 97491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 98f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// isProperSubClass - Returns true if RC has a legal super-class with more 99f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// allocatable registers. 100f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// 101f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// Register classes like GR32_NOSP are not proper sub-classes because %esp 102f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// is not allocatable. Similarly, tGPR is not a proper sub-class in Thumb 103f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen /// mode because the GPR super-class is not legal. 104f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen bool isProperSubClass(const TargetRegisterClass *RC) const { 105f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen return get(RC).ProperSubClass; 106f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen } 107f39031b360f135ece3bdc86151804dd1f3f51733Jakob Stoklund Olesen 108491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// getLastCalleeSavedAlias - Returns the last callee saved register that 109491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen /// overlaps PhysReg, or 0 if Reg doesn't overlap a CSR. 110491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen unsigned getLastCalleeSavedAlias(unsigned PhysReg) const { 111491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen assert(TargetRegisterInfo::isPhysicalRegister(PhysReg)); 112491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen if (unsigned N = CSRNum[PhysReg]) 113491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return CalleeSaved[N-1]; 114491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen return 0; 115491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen } 116c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen 117c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// Get the minimum register cost in RC's allocation order. 118c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// This is the smallest value returned by TRI->getCostPerUse(Reg) for all 119c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// the registers in getOrder(RC). 120c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen unsigned getMinCost(const TargetRegisterClass *RC) { 121c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen return get(RC).MinCost; 122c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen } 123c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen 124c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// Get the position of the last cost change in getOrder(RC). 125c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// 126c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// All registers in getOrder(RC).slice(getLastCostChange(RC)) will have the 127c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen /// same cost according to TRI->getCostPerUse(). 128c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen unsigned getLastCostChange(const TargetRegisterClass *RC) { 129c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen return get(RC).LastCostChange; 130c7a275245f501e2f68a55af05c75bc9b6b50ec84Jakob Stoklund Olesen } 1311f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick 1321f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick /// Get the register unit limit for the given pressure set index. 1331f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick /// 1341f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick /// RegisterClassInfo adjusts this limit for reserved registers. 1351f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick unsigned getRegPressureSetLimit(unsigned Idx) const { 1361f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick if (!PSetLimits[Idx]) 1371f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick PSetLimits[Idx] = computePSetLimit(Idx); 1381f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick return PSetLimits[Idx]; 1391f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick } 1401f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick 1411f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trickprotected: 1421f8b48ab3262bd5623ecbda7b0c024884e8169d3Andrew Trick unsigned computePSetLimit(unsigned Idx) const; 143491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen}; 144491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen} // end namespace llvm 145491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen 146491a13691d3b30b8288dfc6e01ad6a58f69a4ce6Jakob Stoklund Olesen#endif 147