diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h b/contrib/llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h new file mode 100644 index 000000000000..1e9fa967214c --- /dev/null +++ b/contrib/llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.h @@ -0,0 +1,96 @@ +//===- 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 |