1 //===-- llvm/CodeGen/AllocationOrder.h - Allocation Order -*- C++ -*-------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements an allocation order for virtual registers. 11 // 12 // The preferred allocation order for a virtual register depends on allocation 13 // hints and target hooks. The AllocationOrder class encapsulates all of that. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CODEGEN_ALLOCATIONORDER_H 18 #define LLVM_CODEGEN_ALLOCATIONORDER_H 19 20 namespace llvm { 21 22 class BitVector; 23 class VirtRegMap; 24 25 class AllocationOrder { 26 const unsigned *Begin; 27 const unsigned *End; 28 const unsigned *Pos; 29 const BitVector &Reserved; 30 unsigned Hint; 31 public: 32 33 /// AllocationOrder - Create a new AllocationOrder for VirtReg. 34 /// @param VirtReg Virtual register to allocate for. 35 /// @param VRM Virtual register map for function. 36 /// @param ReservedRegs Set of reserved registers as returned by 37 /// TargetRegisterInfo::getReservedRegs(). 38 AllocationOrder(unsigned VirtReg, 39 const VirtRegMap &VRM, 40 const BitVector &ReservedRegs); 41 42 /// next - Return the next physical register in the allocation order, or 0. 43 /// It is safe to call next again after it returned 0. 44 /// It will keep returning 0 until rewind() is called. 45 unsigned next(); 46 47 /// rewind - Start over from the beginning. 48 void rewind() { Pos = 0; } 49 50 /// isHint - Return true if PhysReg is a preferred register. 51 bool isHint(unsigned PhysReg) const { return PhysReg == Hint; } 52 }; 53 54 } // end namespace llvm 55 56 #endif 57