Home | History | Annotate | Line # | Download | only in CodeGen
      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:
     52   void apply(PBQPRAGraph &G) override {
     53     for (auto &C : Constraints)
     54       C->apply(G);
     55   }
     56 
     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