LLVM 22.0.0git
RegAllocPriorityAdvisor.cpp
Go to the documentation of this file.
1//===- RegAllocPriorityAdvisor.cpp - live ranges priority advisor ---------===//
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// Implementation of the default priority advisor and of the Analysis pass.
10//
11//===----------------------------------------------------------------------===//
12
14#include "RegAllocGreedy.h"
17#include "llvm/IR/Module.h"
19#include "llvm/Pass.h"
20
21using namespace llvm;
22
24 "regalloc-enable-priority-advisor", cl::Hidden,
25 cl::init(RegAllocPriorityAdvisorProvider::AdvisorMode::Default),
26 cl::desc("Enable regalloc advisor mode"),
28 clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Default,
29 "default", "Default"),
30 clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Release,
31 "release", "precompiled"),
32 clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Development,
33 "development", "for training"),
35 RegAllocPriorityAdvisorProvider::AdvisorMode::Dummy, "dummy",
36 "prioritize low virtual register numbers for test and debug")));
37
40 "Regalloc priority policy", false, true)
41
42namespace {
43
44class DefaultPriorityAdvisorProvider final
46public:
47 DefaultPriorityAdvisorProvider(bool NotAsRequested, LLVMContext &Ctx)
48 : RegAllocPriorityAdvisorProvider(AdvisorMode::Default) {
49 if (NotAsRequested)
50 Ctx.emitError("Requested regalloc priority advisor analysis "
51 "could be created. Using default");
52 }
53
54 // support for isa<> and dyn_cast.
55 static bool classof(const RegAllocPriorityAdvisorProvider *R) {
56 return R->getAdvisorMode() == AdvisorMode::Default;
57 }
58
59 std::unique_ptr<RegAllocPriorityAdvisor>
60 getAdvisor(const MachineFunction &MF, const RAGreedy &RA,
61 SlotIndexes &SI) override {
62 return std::make_unique<DefaultPriorityAdvisor>(MF, RA, &SI);
63 }
64};
65
66class DummyPriorityAdvisorProvider final
68public:
69 DummyPriorityAdvisorProvider()
70 : RegAllocPriorityAdvisorProvider(AdvisorMode::Dummy) {}
71
72 static bool classof(const RegAllocPriorityAdvisorProvider *R) {
73 return R->getAdvisorMode() == AdvisorMode::Dummy;
74 }
75
76 std::unique_ptr<RegAllocPriorityAdvisor>
77 getAdvisor(const MachineFunction &MF, const RAGreedy &RA,
78 SlotIndexes &SI) override {
79 return std::make_unique<DummyPriorityAdvisor>(MF, RA, &SI);
80 }
81};
82
83class DefaultPriorityAdvisorAnalysisLegacy final
85public:
86 DefaultPriorityAdvisorAnalysisLegacy(bool NotAsRequested)
87 : RegAllocPriorityAdvisorAnalysisLegacy(AdvisorMode::Default),
88 NotAsRequested(NotAsRequested) {}
89
90 // support for isa<> and dyn_cast.
91 static bool classof(const RegAllocPriorityAdvisorAnalysisLegacy *R) {
92 return R->getAdvisorMode() == AdvisorMode::Default;
93 }
94
95private:
96 void getAnalysisUsage(AnalysisUsage &AU) const override {
99 }
100
101 bool doInitialization(Module &M) override {
102 Provider.reset(
103 new DefaultPriorityAdvisorProvider(NotAsRequested, M.getContext()));
104 return false;
105 }
106
107 const bool NotAsRequested;
108};
109
110class DummyPriorityAdvisorAnalysis final
112public:
114 DummyPriorityAdvisorAnalysis()
115 : RegAllocPriorityAdvisorAnalysisLegacy(AdvisorMode::Dummy) {}
116
117 // support for isa<> and dyn_cast.
118 static bool classof(const RegAllocPriorityAdvisorAnalysisLegacy *R) {
119 return R->getAdvisorMode() == AdvisorMode::Dummy;
120 }
121
122private:
123 void getAnalysisUsage(AnalysisUsage &AU) const override {
126 }
127
128 bool doInitialization(Module &M) override {
129 Provider.reset(new DummyPriorityAdvisorProvider());
130 return false;
131 }
132};
133
134} // namespace
135
136void RegAllocPriorityAdvisorAnalysis::initializeProvider(LLVMContext &Ctx) {
137 if (Provider)
138 return;
139 switch (Mode) {
141 Provider.reset(new DummyPriorityAdvisorProvider());
142 return;
144 Provider.reset(
145 new DefaultPriorityAdvisorProvider(/*NotAsRequested=*/false, Ctx));
146 return;
148#if defined(LLVM_HAVE_TFLITE)
150#else
151 Provider.reset(
152 new DefaultPriorityAdvisorProvider(/*NotAsRequested=*/true, Ctx));
153#endif
154 return;
157 return;
158 }
159}
160
161AnalysisKey RegAllocPriorityAdvisorAnalysis::Key;
162
166 // Lazily initialize the provider.
167 initializeProvider(MF.getFunction().getContext());
168 // The requiring analysis will construct the advisor.
169 return Result{Provider.get()};
170}
171
172template <>
174 Pass *Ret = nullptr;
175 switch (Mode) {
177 Ret = new DefaultPriorityAdvisorAnalysisLegacy(/*NotAsRequested*/ false);
178 break;
180#if defined(LLVM_HAVE_TFLITE)
182#endif
183 break;
186 break;
188 Ret = new DummyPriorityAdvisorAnalysis();
189 break;
190 }
191 if (Ret)
192 return Ret;
193 return new DefaultPriorityAdvisorAnalysisLegacy(/*NotAsRequested*/ true);
194}
195
196StringRef RegAllocPriorityAdvisorAnalysisLegacy::getPassName() const {
197 switch (getAdvisorMode()) {
198 case AdvisorMode::Default:
199 return "Default Regalloc Priority Advisor";
200 case AdvisorMode::Release:
201 return "Release mode Regalloc Priority Advisor";
202 case AdvisorMode::Development:
203 return "Development mode Regalloc Priority Advisor";
204 case AdvisorMode::Dummy:
205 return "Dummy Regalloc Priority Advisor";
206 }
207 llvm_unreachable("Unknown advisor kind");
208}
209
211 const RAGreedy &RA,
212 SlotIndexes *const Indexes)
213 : RA(RA), LIS(RA.getLiveIntervals()), VRM(RA.getVirtRegMap()),
214 MRI(&VRM->getRegInfo()), TRI(MF.getSubtarget().getRegisterInfo()),
215 RegClassInfo(RA.getRegClassInfo()), Indexes(Indexes),
216 RegClassPriorityTrumpsGlobalness(
217 RA.getRegClassPriorityTrumpsGlobalness()),
218 ReverseLocalAssignment(RA.getReverseLocalAssignment()) {}
unsigned const MachineRegisterInfo * MRI
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
Module.h This file contains the declarations for the Module class.
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:56
static cl::opt< RegAllocPriorityAdvisorProvider::AdvisorMode > Mode("regalloc-enable-priority-advisor", cl::Hidden, cl::init(RegAllocPriorityAdvisorProvider::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Development, "development", "for training"), clEnumValN(RegAllocPriorityAdvisorProvider::AdvisorMode::Dummy, "dummy", "prioritize low virtual register numbers for test and debug")))
SI optimize exec mask operations pre RA
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:359
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
Function & getFunction()
Return the LLVM function that this machine code represents.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:99
virtual bool doInitialization(Module &)
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
Definition: Pass.h:128
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Common provider for getting the priority advisor and logging rewards.
virtual std::unique_ptr< RegAllocPriorityAdvisor > getAdvisor(const MachineFunction &MF, const RAGreedy &RA, SlotIndexes &SI)=0
RegAllocPriorityAdvisor(const RegAllocPriorityAdvisor &)=delete
SlotIndexes pass.
Definition: SlotIndexes.h:298
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
RegAllocPriorityAdvisorAnalysisLegacy * createReleaseModePriorityAdvisorAnalysis()
RegAllocPriorityAdvisorAnalysisLegacy * createDevelopmentModePriorityAdvisorAnalysis()
Pass * callDefaultCtor< RegAllocPriorityAdvisorAnalysisLegacy >()
Specialization for the API used by the analysis infrastructure to create an instance of the priority ...
LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider * createDevelopmentModePriorityAdvisorProvider(LLVMContext &Ctx)
LLVM_ATTRIBUTE_RETURNS_NONNULL RegAllocPriorityAdvisorProvider * createReleaseModePriorityAdvisorProvider()
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:29