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