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