| //===- RegAllocPriorityAdvisor.h - live ranges priority advisor -*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H | |
| #define LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H | |
| #include "RegAllocEvictionAdvisor.h" | |
| #include "llvm/CodeGen/SlotIndexes.h" | |
| #include "llvm/Pass.h" | |
| namespace llvm { | |
| class MachineFunction; | |
| class VirtRegMap; | |
| class RAGreedy; | |
| /// Interface to the priority advisor, which is responsible for prioritizing | |
| /// live ranges. | |
| class RegAllocPriorityAdvisor { | |
| public: | |
| RegAllocPriorityAdvisor(const RegAllocPriorityAdvisor &) = delete; | |
| RegAllocPriorityAdvisor(RegAllocPriorityAdvisor &&) = delete; | |
| virtual ~RegAllocPriorityAdvisor() = default; | |
| /// Find the priority value for a live range. A float value is used since ML | |
| /// prefers it. | |
| virtual unsigned getPriority(const LiveInterval &LI) const = 0; | |
| RegAllocPriorityAdvisor(const MachineFunction &MF, const RAGreedy &RA, | |
| SlotIndexes *const Indexes); | |
| protected: | |
| const RAGreedy &RA; | |
| LiveIntervals *const LIS; | |
| VirtRegMap *const VRM; | |
| MachineRegisterInfo *const MRI; | |
| const TargetRegisterInfo *const TRI; | |
| const RegisterClassInfo &RegClassInfo; | |
| SlotIndexes *const Indexes; | |
| const bool RegClassPriorityTrumpsGlobalness; | |
| const bool ReverseLocalAssignment; | |
| }; | |
| class DefaultPriorityAdvisor : public RegAllocPriorityAdvisor { | |
| public: | |
| DefaultPriorityAdvisor(const MachineFunction &MF, const RAGreedy &RA, | |
| SlotIndexes *const Indexes) | |
| : RegAllocPriorityAdvisor(MF, RA, Indexes) {} | |
| private: | |
| unsigned getPriority(const LiveInterval &LI) const override; | |
| }; | |
| class RegAllocPriorityAdvisorAnalysis : public ImmutablePass { | |
| public: | |
| enum class AdvisorMode : int { Default, Release, Development }; | |
| RegAllocPriorityAdvisorAnalysis(AdvisorMode Mode) | |
| : ImmutablePass(ID), Mode(Mode){}; | |
| static char ID; | |
| /// Get an advisor for the given context (i.e. machine function, etc) | |
| virtual std::unique_ptr<RegAllocPriorityAdvisor> | |
| getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; | |
| AdvisorMode getAdvisorMode() const { return Mode; } | |
| virtual void logRewardIfNeeded(const MachineFunction &MF, | |
| llvm::function_ref<float()> GetReward){}; | |
| protected: | |
| // This analysis preserves everything, and subclasses may have additional | |
| // requirements. | |
| void getAnalysisUsage(AnalysisUsage &AU) const override { | |
| AU.setPreservesAll(); | |
| } | |
| private: | |
| StringRef getPassName() const override; | |
| const AdvisorMode Mode; | |
| }; | |
| /// Specialization for the API used by the analysis infrastructure to create | |
| /// an instance of the priority advisor. | |
| template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis>(); | |
| RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor(); | |
| RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor(); | |
| } // namespace llvm | |
| #endif // LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H |