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 20namespace llvm { 21 22class RegisterClassInfo; 23class VirtRegMap; 24 25class AllocationOrder { 26 const unsigned *Begin; 27 const unsigned *End; 28 const unsigned *Pos; 29 const RegisterClassInfo &RCI; 30 unsigned Hint; 31 bool OwnedBegin; 32public: 33 34 /// AllocationOrder - Create a new AllocationOrder for VirtReg. 35 /// @param VirtReg Virtual register to allocate for. 36 /// @param VRM Virtual register map for function. 37 /// @param RegClassInfo Information about reserved and allocatable registers. 38 AllocationOrder(unsigned VirtReg, 39 const VirtRegMap &VRM, 40 const RegisterClassInfo &RegClassInfo); 41 42 ~AllocationOrder(); 43 44 /// next - Return the next physical register in the allocation order, or 0. 45 /// It is safe to call next again after it returned 0. 46 /// It will keep returning 0 until rewind() is called. 47 unsigned next() { 48 // First take the hint. 49 if (!Pos) { 50 Pos = Begin; 51 if (Hint) 52 return Hint; 53 } 54 // Then look at the order from TRI. 55 while (Pos != End) { 56 unsigned Reg = *Pos++; 57 if (Reg != Hint) 58 return Reg; 59 } 60 return 0; 61 } 62 63 /// rewind - Start over from the beginning. 64 void rewind() { Pos = 0; } 65 66 /// isHint - Return true if PhysReg is a preferred register. 67 bool isHint(unsigned PhysReg) const { return PhysReg == Hint; } 68}; 69 70} // end namespace llvm 71 72#endif 73