blob: 269b7a7b3a35d5cae61f651a7c5258628beccd72 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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