1c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===-- llvm/CodeGen/AllocationOrder.h - Allocation Order -*- C++ -*-------===// 2c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 3c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 4c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 5c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 6c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 7c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 8c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 9c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 10c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// This file implements an allocation order for virtual registers. 11c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 12c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// The preferred allocation order for a virtual register depends on allocation 13c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// hints and target hooks. The AllocationOrder class encapsulates all of that. 14c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen// 15c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 16c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 17c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen#ifndef LLVM_CODEGEN_ALLOCATIONORDER_H 18c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen#define LLVM_CODEGEN_ALLOCATIONORDER_H 19c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 20c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesennamespace llvm { 21c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 225f2316a3b55f88dab2190212210770180a32aa95Jakob Stoklund Olesenclass RegisterClassInfo; 23c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesenclass VirtRegMap; 24c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 25c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesenclass AllocationOrder { 26c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen const unsigned *Begin; 27c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen const unsigned *End; 28c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen const unsigned *Pos; 295f2316a3b55f88dab2190212210770180a32aa95Jakob Stoklund Olesen const RegisterClassInfo &RCI; 30c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen unsigned Hint; 31a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen bool OwnedBegin; 32c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesenpublic: 33c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 34c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// AllocationOrder - Create a new AllocationOrder for VirtReg. 35c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// @param VirtReg Virtual register to allocate for. 36c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// @param VRM Virtual register map for function. 3710c6fdcd111d447de79613495219af8de3a2fb7eJakob Stoklund Olesen /// @param RegClassInfo Information about reserved and allocatable registers. 38c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen AllocationOrder(unsigned VirtReg, 39c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen const VirtRegMap &VRM, 405f2316a3b55f88dab2190212210770180a32aa95Jakob Stoklund Olesen const RegisterClassInfo &RegClassInfo); 41c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 42a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen ~AllocationOrder(); 43a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen 44c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// next - Return the next physical register in the allocation order, or 0. 45c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// It is safe to call next again after it returned 0. 46c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// It will keep returning 0 until rewind() is called. 47a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen unsigned next() { 48a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen // First take the hint. 49a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen if (!Pos) { 50a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen Pos = Begin; 51a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen if (Hint) 52a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen return Hint; 53a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen } 54a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen // Then look at the order from TRI. 55a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen while (Pos != End) { 56a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen unsigned Reg = *Pos++; 57a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen if (Reg != Hint) 58a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen return Reg; 59a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen } 60a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen return 0; 61a46a100945c839a9b9baa6da0dcafafcd42d1085Jakob Stoklund Olesen } 62c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 63c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen /// rewind - Start over from the beginning. 64c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen void rewind() { Pos = 0; } 65c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 6657f1e2cee06f9b57995727d786aeb1031c5376bdJakob Stoklund Olesen /// isHint - Return true if PhysReg is a preferred register. 6757f1e2cee06f9b57995727d786aeb1031c5376bdJakob Stoklund Olesen bool isHint(unsigned PhysReg) const { return PhysReg == Hint; } 68c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen}; 69c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 70c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen} // end namespace llvm 71c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen 72c9672cb8bea13fcbcbdb1cf26708d831c034c089Jakob Stoklund Olesen#endif 73