xref: /llvm-project/llvm/lib/CodeGen/RegAllocPriorityAdvisor.cpp (revision 11e482c4a32be6a315e5bf2ae7599cf10eb84836)
1ad8eb855SEric Wang //===- RegAllocPriorityAdvisor.cpp - live ranges priority advisor ---------===//
2ad8eb855SEric Wang //
3ad8eb855SEric Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ad8eb855SEric Wang // See https://llvm.org/LICENSE.txt for license information.
5ad8eb855SEric Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ad8eb855SEric Wang //
7ad8eb855SEric Wang //===----------------------------------------------------------------------===//
8ad8eb855SEric Wang //
9ad8eb855SEric Wang // Implementation of the default priority advisor and of the Analysis pass.
10ad8eb855SEric Wang //
11ad8eb855SEric Wang //===----------------------------------------------------------------------===//
12ad8eb855SEric Wang 
13ad8eb855SEric Wang #include "RegAllocPriorityAdvisor.h"
14ad8eb855SEric Wang #include "RegAllocGreedy.h"
15ad8eb855SEric Wang #include "llvm/CodeGen/MachineFunction.h"
16ad8eb855SEric Wang #include "llvm/CodeGen/VirtRegMap.h"
17d8a2d3f7SEric Wang #include "llvm/IR/Module.h"
18ad8eb855SEric Wang #include "llvm/InitializePasses.h"
19ad8eb855SEric Wang #include "llvm/Pass.h"
20ad8eb855SEric Wang 
21ad8eb855SEric Wang using namespace llvm;
22ad8eb855SEric Wang 
23d8a2d3f7SEric Wang static cl::opt<RegAllocPriorityAdvisorAnalysis::AdvisorMode> Mode(
24d8a2d3f7SEric Wang     "regalloc-enable-priority-advisor", cl::Hidden,
25d8a2d3f7SEric Wang     cl::init(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default),
26d8a2d3f7SEric Wang     cl::desc("Enable regalloc advisor mode"),
27d8a2d3f7SEric Wang     cl::values(
28d8a2d3f7SEric Wang         clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default,
29d8a2d3f7SEric Wang                    "default", "Default"),
30d8a2d3f7SEric Wang         clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release,
31d8a2d3f7SEric Wang                    "release", "precompiled"),
32d8a2d3f7SEric Wang         clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development,
33*11e482c4SMatt Arsenault                    "development", "for training"),
34*11e482c4SMatt Arsenault         clEnumValN(
35*11e482c4SMatt Arsenault             RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy, "dummy",
36*11e482c4SMatt Arsenault             "prioritize low virtual register numbers for test and debug")));
37d8a2d3f7SEric Wang 
38d8a2d3f7SEric Wang char RegAllocPriorityAdvisorAnalysis::ID = 0;
39d8a2d3f7SEric Wang INITIALIZE_PASS(RegAllocPriorityAdvisorAnalysis, "regalloc-priority",
40d8a2d3f7SEric Wang                 "Regalloc priority policy", false, true)
41d8a2d3f7SEric Wang 
42d8a2d3f7SEric Wang namespace {
43d8a2d3f7SEric Wang class DefaultPriorityAdvisorAnalysis final
44d8a2d3f7SEric Wang     : public RegAllocPriorityAdvisorAnalysis {
45d8a2d3f7SEric Wang public:
46d8a2d3f7SEric Wang   DefaultPriorityAdvisorAnalysis(bool NotAsRequested)
47d8a2d3f7SEric Wang       : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Default),
48d8a2d3f7SEric Wang         NotAsRequested(NotAsRequested) {}
49d8a2d3f7SEric Wang 
50d8a2d3f7SEric Wang   // support for isa<> and dyn_cast.
51d8a2d3f7SEric Wang   static bool classof(const RegAllocPriorityAdvisorAnalysis *R) {
52d8a2d3f7SEric Wang     return R->getAdvisorMode() == AdvisorMode::Default;
53d8a2d3f7SEric Wang   }
54d8a2d3f7SEric Wang 
55d8a2d3f7SEric Wang private:
56d8a2d3f7SEric Wang   void getAnalysisUsage(AnalysisUsage &AU) const override {
574010f894Spaperchalice     AU.addRequired<SlotIndexesWrapperPass>();
58d8a2d3f7SEric Wang     RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU);
59d8a2d3f7SEric Wang   }
60d8a2d3f7SEric Wang   std::unique_ptr<RegAllocPriorityAdvisor>
61d8a2d3f7SEric Wang   getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override {
62d8a2d3f7SEric Wang     return std::make_unique<DefaultPriorityAdvisor>(
634010f894Spaperchalice         MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI());
64d8a2d3f7SEric Wang   }
65d8a2d3f7SEric Wang   bool doInitialization(Module &M) override {
66d8a2d3f7SEric Wang     if (NotAsRequested)
67d8a2d3f7SEric Wang       M.getContext().emitError("Requested regalloc priority advisor analysis "
68d8a2d3f7SEric Wang                                "could be created. Using default");
69d8a2d3f7SEric Wang     return RegAllocPriorityAdvisorAnalysis::doInitialization(M);
70d8a2d3f7SEric Wang   }
71d8a2d3f7SEric Wang   const bool NotAsRequested;
72d8a2d3f7SEric Wang };
73*11e482c4SMatt Arsenault 
74*11e482c4SMatt Arsenault class DummyPriorityAdvisorAnalysis final
75*11e482c4SMatt Arsenault     : public RegAllocPriorityAdvisorAnalysis {
76*11e482c4SMatt Arsenault public:
77*11e482c4SMatt Arsenault   DummyPriorityAdvisorAnalysis()
78*11e482c4SMatt Arsenault       : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Dummy) {}
79*11e482c4SMatt Arsenault 
80*11e482c4SMatt Arsenault   // support for isa<> and dyn_cast.
81*11e482c4SMatt Arsenault   static bool classof(const RegAllocPriorityAdvisorAnalysis *R) {
82*11e482c4SMatt Arsenault     return R->getAdvisorMode() == AdvisorMode::Dummy;
83*11e482c4SMatt Arsenault   }
84*11e482c4SMatt Arsenault 
85*11e482c4SMatt Arsenault private:
86*11e482c4SMatt Arsenault   void getAnalysisUsage(AnalysisUsage &AU) const override {
87*11e482c4SMatt Arsenault     AU.addRequired<SlotIndexesWrapperPass>();
88*11e482c4SMatt Arsenault     RegAllocPriorityAdvisorAnalysis::getAnalysisUsage(AU);
89*11e482c4SMatt Arsenault   }
90*11e482c4SMatt Arsenault 
91*11e482c4SMatt Arsenault   std::unique_ptr<RegAllocPriorityAdvisor>
92*11e482c4SMatt Arsenault   getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override {
93*11e482c4SMatt Arsenault     return std::make_unique<DummyPriorityAdvisor>(
94*11e482c4SMatt Arsenault         MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI());
95*11e482c4SMatt Arsenault   }
96*11e482c4SMatt Arsenault };
97*11e482c4SMatt Arsenault 
98d8a2d3f7SEric Wang } // namespace
99d8a2d3f7SEric Wang 
100d8a2d3f7SEric Wang template <> Pass *llvm::callDefaultCtor<RegAllocPriorityAdvisorAnalysis>() {
101d8a2d3f7SEric Wang   Pass *Ret = nullptr;
102d8a2d3f7SEric Wang   switch (Mode) {
103d8a2d3f7SEric Wang   case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default:
104d8a2d3f7SEric Wang     Ret = new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ false);
105d8a2d3f7SEric Wang     break;
106*11e482c4SMatt Arsenault   case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy:
107*11e482c4SMatt Arsenault     Ret = new DummyPriorityAdvisorAnalysis();
108*11e482c4SMatt Arsenault     break;
109d8a2d3f7SEric Wang   case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development:
110edc83a15SKazu Hirata #if defined(LLVM_HAVE_TFLITE)
1115b26f4f0SEric Wang     Ret = createDevelopmentModePriorityAdvisor();
1125b26f4f0SEric Wang #endif
113d8a2d3f7SEric Wang     break;
114d8a2d3f7SEric Wang   case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release:
1155b26f4f0SEric Wang     Ret = createReleaseModePriorityAdvisor();
116d8a2d3f7SEric Wang     break;
117d8a2d3f7SEric Wang   }
118d8a2d3f7SEric Wang   if (Ret)
119d8a2d3f7SEric Wang     return Ret;
120d8a2d3f7SEric Wang   return new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ true);
121d8a2d3f7SEric Wang }
122d8a2d3f7SEric Wang 
123d8a2d3f7SEric Wang StringRef RegAllocPriorityAdvisorAnalysis::getPassName() const {
124d8a2d3f7SEric Wang   switch (getAdvisorMode()) {
125d8a2d3f7SEric Wang   case AdvisorMode::Default:
126d8a2d3f7SEric Wang     return "Default Regalloc Priority Advisor";
127d8a2d3f7SEric Wang   case AdvisorMode::Release:
128d8a2d3f7SEric Wang     return "Release mode Regalloc Priority Advisor";
129d8a2d3f7SEric Wang   case AdvisorMode::Development:
130d8a2d3f7SEric Wang     return "Development mode Regalloc Priority Advisor";
131*11e482c4SMatt Arsenault   case AdvisorMode::Dummy:
132*11e482c4SMatt Arsenault     return "Dummy Regalloc Priority Advisor";
133d8a2d3f7SEric Wang   }
134d8a2d3f7SEric Wang   llvm_unreachable("Unknown advisor kind");
135d8a2d3f7SEric Wang }
136d8a2d3f7SEric Wang 
137ad8eb855SEric Wang RegAllocPriorityAdvisor::RegAllocPriorityAdvisor(const MachineFunction &MF,
138d8a2d3f7SEric Wang                                                  const RAGreedy &RA,
139d8a2d3f7SEric Wang                                                  SlotIndexes *const Indexes)
140ad8eb855SEric Wang     : RA(RA), LIS(RA.getLiveIntervals()), VRM(RA.getVirtRegMap()),
141ad8eb855SEric Wang       MRI(&VRM->getRegInfo()), TRI(MF.getSubtarget().getRegisterInfo()),
142d8a2d3f7SEric Wang       RegClassInfo(RA.getRegClassInfo()), Indexes(Indexes),
143ad8eb855SEric Wang       RegClassPriorityTrumpsGlobalness(
144ad8eb855SEric Wang           RA.getRegClassPriorityTrumpsGlobalness()),
145ad8eb855SEric Wang       ReverseLocalAssignment(RA.getReverseLocalAssignment()) {}
146