1 //===- RegAllocPriorityAdvisor.h - live ranges priority advisor -*- 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 #ifndef LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H 10 #define LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H 11 12 #include "RegAllocEvictionAdvisor.h" 13 #include "llvm/CodeGen/SlotIndexes.h" 14 #include "llvm/Pass.h" 15 16 namespace llvm { 17 18 class MachineFunction; 19 class VirtRegMap; 20 class RAGreedy; 21 22 /// Interface to the priority advisor, which is responsible for prioritizing 23 /// live ranges. 24 class RegAllocPriorityAdvisor { 25 public: 26 RegAllocPriorityAdvisor(const RegAllocPriorityAdvisor &) = delete; 27 RegAllocPriorityAdvisor(RegAllocPriorityAdvisor &&) = delete; 28 virtual ~RegAllocPriorityAdvisor() = default; 29 30 /// Find the priority value for a live range. A float value is used since ML 31 /// prefers it. 32 virtual unsigned getPriority(const LiveInterval &LI) const = 0; 33 34 RegAllocPriorityAdvisor(const MachineFunction &MF, const RAGreedy &RA, 35 SlotIndexes *const Indexes); 36 37 protected: 38 const RAGreedy &RA; 39 LiveIntervals *const LIS; 40 VirtRegMap *const VRM; 41 MachineRegisterInfo *const MRI; 42 const TargetRegisterInfo *const TRI; 43 const RegisterClassInfo &RegClassInfo; 44 SlotIndexes *const Indexes; 45 const bool RegClassPriorityTrumpsGlobalness; 46 const bool ReverseLocalAssignment; 47 }; 48 49 class DefaultPriorityAdvisor : public RegAllocPriorityAdvisor { 50 public: 51 DefaultPriorityAdvisor(const MachineFunction &MF, const RAGreedy &RA, 52 SlotIndexes *const Indexes) 53 : RegAllocPriorityAdvisor(MF, RA, Indexes) {} 54 55 private: 56 unsigned getPriority(const LiveInterval &LI) const override; 57 }; 58 59 class RegAllocPriorityAdvisorAnalysis : public ImmutablePass { 60 public: 61 enum class AdvisorMode : int { Default, Release, Development }; 62 63 RegAllocPriorityAdvisorAnalysis(AdvisorMode Mode) 64 : ImmutablePass(ID), Mode(Mode){}; 65 static char ID; 66 67 /// Get an advisor for the given context (i.e. machine function, etc) 68 virtual std::unique_ptr<RegAllocPriorityAdvisor> 69 getAdvisor(const MachineFunction &MF, const RAGreedy &RA) = 0; 70 AdvisorMode getAdvisorMode() const { return Mode; } 71 virtual void logRewardIfNeeded(const MachineFunction &MF, 72 llvm::function_ref<float()> GetReward){}; 73 74 protected: 75 // This analysis preserves everything, and subclasses may have additional 76 // requirements. 77 void getAnalysisUsage(AnalysisUsage &AU) const override { 78 AU.setPreservesAll(); 79 } 80 81 private: 82 StringRef getPassName() const override; 83 const AdvisorMode Mode; 84 }; 85 86 /// Specialization for the API used by the analysis infrastructure to create 87 /// an instance of the priority advisor. 88 template <> Pass *callDefaultCtor<RegAllocPriorityAdvisorAnalysis>(); 89 90 RegAllocPriorityAdvisorAnalysis *createReleaseModePriorityAdvisor(); 91 92 RegAllocPriorityAdvisorAnalysis *createDevelopmentModePriorityAdvisor(); 93 94 } // namespace llvm 95 96 #endif // LLVM_CODEGEN_REGALLOCPRIORITYADVISOR_H 97