1//===- RegAllocPBQP.h -------------------------------------------*- 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 defines the PBQPBuilder interface, for classes which build PBQP
11// instances to represent register allocation problems, and the RegAllocPBQP
12// interface.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CODEGEN_PBQPRACONSTRAINT_H
17#define LLVM_CODEGEN_PBQPRACONSTRAINT_H
18
19#include <algorithm>
20#include <memory>
21#include <vector>
22
23namespace llvm {
24
25namespace PBQP {
26namespace RegAlloc {
27
28// Forward declare PBQP graph class.
29class PBQPRAGraph;
30
31} // end namespace RegAlloc
32} // end namespace PBQP
33
34using PBQPRAGraph = PBQP::RegAlloc::PBQPRAGraph;
35
36/// @brief Abstract base for classes implementing PBQP register allocation
37///        constraints (e.g. Spill-costs, interference, coalescing).
38class PBQPRAConstraint {
39public:
40  virtual ~PBQPRAConstraint() = 0;
41  virtual void apply(PBQPRAGraph &G) = 0;
42
43private:
44  virtual void anchor();
45};
46
47/// @brief PBQP register allocation constraint composer.
48///
49///   Constraints added to this list will be applied, in the order that they are
50/// added, to the PBQP graph.
51class PBQPRAConstraintList : public PBQPRAConstraint {
52public:
53  void apply(PBQPRAGraph &G) override {
54    for (auto &C : Constraints)
55      C->apply(G);
56  }
57
58  void addConstraint(std::unique_ptr<PBQPRAConstraint> C) {
59    if (C)
60      Constraints.push_back(std::move(C));
61  }
62
63private:
64  std::vector<std::unique_ptr<PBQPRAConstraint>> Constraints;
65
66  void anchor() override;
67};
68
69} // end namespace llvm
70
71#endif // LLVM_CODEGEN_PBQPRACONSTRAINT_H
72