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