From 80bfef5ce19b46e20f5a9904110ca955c2dd84d8 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Thu, 9 Oct 2014 18:36:59 +0000 Subject: [PATCH] [PBQP] Add missing headers from r219421. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219425 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/PBQPRAConstraint.h | 69 ++++++++++++++++++++++++ lib/Target/AArch64/AArch64PBQPRegAlloc.h | 38 +++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 include/llvm/CodeGen/PBQPRAConstraint.h create mode 100644 lib/Target/AArch64/AArch64PBQPRegAlloc.h diff --git a/include/llvm/CodeGen/PBQPRAConstraint.h b/include/llvm/CodeGen/PBQPRAConstraint.h new file mode 100644 index 00000000000..8f66bfacb1b --- /dev/null +++ b/include/llvm/CodeGen/PBQPRAConstraint.h @@ -0,0 +1,69 @@ +//===-- RegAllocPBQP.h ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the PBQPBuilder interface, for classes which build PBQP +// instances to represent register allocation problems, and the RegAllocPBQP +// interface. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_PBQPRACONSTRAINT_H +#define LLVM_CODEGEN_PBQPRACONSTRAINT_H + +#include +#include + +namespace llvm { +namespace PBQP { +namespace RegAlloc { +// Forward declare PBQP graph class. +class PBQPRAGraph; +} +} + +class LiveIntervals; +class MachineBlockFrequencyInfo; +class MachineFunction; +class TargetRegisterInfo; + +typedef PBQP::RegAlloc::PBQPRAGraph PBQPRAGraph; + +/// @brief Abstract base for classes implementing PBQP register allocation +/// constraints (e.g. Spill-costs, interference, coalescing). +class PBQPRAConstraint { +public: + virtual ~PBQPRAConstraint() = 0; + virtual void apply(PBQPRAGraph &G) = 0; +private: + virtual void anchor(); +}; + +/// @brief PBQP register allocation constraint composer. +/// +/// Constraints added to this list will be applied, in the order that they are +/// added, to the PBQP graph. +class PBQPRAConstraintList : public PBQPRAConstraint { +public: + void apply(PBQPRAGraph &G) override { + for (auto &C : Constraints) + C->apply(G); + } + + void addConstraint(std::unique_ptr C) { + if (C) + Constraints.push_back(std::move(C)); + } +private: + std::vector> Constraints; + virtual void anchor(); +}; + +} + +#endif /* LLVM_CODEGEN_PBQPRACONSTRAINT_H */ diff --git a/lib/Target/AArch64/AArch64PBQPRegAlloc.h b/lib/Target/AArch64/AArch64PBQPRegAlloc.h new file mode 100644 index 00000000000..4bd780cd0eb --- /dev/null +++ b/lib/Target/AArch64/AArch64PBQPRegAlloc.h @@ -0,0 +1,38 @@ +//===-- AArch64PBQPRegAlloc.h - AArch64 specific PBQP constraints -------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64PBQPREGALOC_H +#define LLVM_LIB_TARGET_AARCH64_AARCH64PBQPREGALOC_H + +#include "llvm/ADT/SetVector.h" +#include "llvm/CodeGen/PBQPRAConstraint.h" + +namespace llvm { + +class A57PBQPConstraints : public PBQPRAConstraint { +public: + + // Add A57 specific constraints to the PBQP graph. + void apply(PBQPRAGraph &G) override; + +private: + SmallSetVector Chains; + + // Add the accumulator chaining constraint, inside the chain, i.e. so that + // parity(Rd) == parity(Ra). + // \return true if a constraint was added + bool addIntraChainConstraint(PBQPRAGraph &G, unsigned Rd, unsigned Ra); + + // Add constraints between existing chains + void addInterChainConstraint(PBQPRAGraph &G, unsigned Rd, unsigned Ra); +}; + +} + +#endif // LLVM_LIB_TARGET_AARCH64_AARCH64PBQPREGALOC_H