//===- 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 getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; AdvisorMode getAdvisorMode() const { return Mode; } virtual void logRewardIfNeeded(const MachineFunction &MF, llvm::function_ref 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 *createReleaseModePriorityAdvisor(); RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor(); } // namespace llvm #endif // LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H