1 //===- llvm/CodeGen/PBQPRAConstraint.h --------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the PBQPBuilder interface, for classes which build PBQP 10 // instances to represent register allocation problems, and the RegAllocPBQP 11 // interface. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_PBQPRACONSTRAINT_H 16 #define LLVM_CODEGEN_PBQPRACONSTRAINT_H 17 18 #include <algorithm> 19 #include <memory> 20 #include <vector> 21 22 namespace llvm { 23 24 namespace PBQP { 25 namespace RegAlloc { 26 27 // Forward declare PBQP graph class. 28 class PBQPRAGraph; 29 30 } // end namespace RegAlloc 31 } // end namespace PBQP 32 33 using PBQPRAGraph = PBQP::RegAlloc::PBQPRAGraph; 34 35 /// Abstract base for classes implementing PBQP register allocation 36 /// constraints (e.g. Spill-costs, interference, coalescing). 37 class PBQPRAConstraint { 38 public: 39 virtual ~PBQPRAConstraint() = 0; 40 virtual void apply(PBQPRAGraph &G) = 0; 41 42 private: 43 virtual void anchor(); 44 }; 45 46 /// PBQP register allocation constraint composer. 47 /// 48 /// Constraints added to this list will be applied, in the order that they are 49 /// added, to the PBQP graph. 50 class PBQPRAConstraintList : public PBQPRAConstraint { 51 public: apply(PBQPRAGraph & G)52 void apply(PBQPRAGraph &G) override { 53 for (auto &C : Constraints) 54 C->apply(G); 55 } 56 addConstraint(std::unique_ptr<PBQPRAConstraint> C)57 void addConstraint(std::unique_ptr<PBQPRAConstraint> C) { 58 if (C) 59 Constraints.push_back(std::move(C)); 60 } 61 62 private: 63 std::vector<std::unique_ptr<PBQPRAConstraint>> Constraints; 64 65 void anchor() override; 66 }; 67 68 } // end namespace llvm 69 70 #endif // LLVM_CODEGEN_PBQPRACONSTRAINT_H 71