LLVM 20.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(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default),
26 cl::desc("Enable regalloc advisor mode"),
28 clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default,
29 "default", "Default"),
30 clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release,
31 "release", "precompiled"),
32 clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development,
33 "development", "for training"),
35 RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy, "dummy",
36 "prioritize low virtual register numbers for test and debug")));
37
40 "Regalloc priority policy", false, true)
41
42namespace {
43class DefaultPriorityAdvisorAnalysis final
45public:
46 DefaultPriorityAdvisorAnalysis(bool NotAsRequested)
47 : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Default),
48 NotAsRequested(NotAsRequested) {}
49
50 // support for isa<> and dyn_cast.
51 static bool classof(const RegAllocPriorityAdvisorAnalysis *R) {
52 return R->getAdvisorMode() == AdvisorMode::Default;
53 }
54
55private:
56 void getAnalysisUsage(AnalysisUsage &AU) const override {
59 }
60 std::unique_ptr<RegAllocPriorityAdvisor>
61 getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override {
62 return std::make_unique<DefaultPriorityAdvisor>(
63 MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI());
64 }
65 bool doInitialization(Module &M) override {
66 if (NotAsRequested)
67 M.getContext().emitError("Requested regalloc priority advisor analysis "
68 "could be created. Using default");
70 }
71 const bool NotAsRequested;
72};
73
74class DummyPriorityAdvisorAnalysis final
76public:
77 DummyPriorityAdvisorAnalysis()
78 : RegAllocPriorityAdvisorAnalysis(AdvisorMode::Dummy) {}
79
80 // support for isa<> and dyn_cast.
81 static bool classof(const RegAllocPriorityAdvisorAnalysis *R) {
82 return R->getAdvisorMode() == AdvisorMode::Dummy;
83 }
84
85private:
86 void getAnalysisUsage(AnalysisUsage &AU) const override {
89 }
90
91 std::unique_ptr<RegAllocPriorityAdvisor>
92 getAdvisor(const MachineFunction &MF, const RAGreedy &RA) override {
93 return std::make_unique<DummyPriorityAdvisor>(
94 MF, RA, &getAnalysis<SlotIndexesWrapperPass>().getSI());
95 }
96};
97
98} // namespace
99
101 Pass *Ret = nullptr;
102 switch (Mode) {
103 case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default:
104 Ret = new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ false);
105 break;
106 case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy:
107 Ret = new DummyPriorityAdvisorAnalysis();
108 break;
109 case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development:
110#if defined(LLVM_HAVE_TFLITE)
112#endif
113 break;
114 case RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release:
116 break;
117 }
118 if (Ret)
119 return Ret;
120 return new DefaultPriorityAdvisorAnalysis(/*NotAsRequested*/ true);
121}
122
123StringRef RegAllocPriorityAdvisorAnalysis::getPassName() const {
124 switch (getAdvisorMode()) {
126 return "Default Regalloc Priority Advisor";
128 return "Release mode Regalloc Priority Advisor";
130 return "Development mode Regalloc Priority Advisor";
132 return "Dummy Regalloc Priority Advisor";
133 }
134 llvm_unreachable("Unknown advisor kind");
135}
136
138 const RAGreedy &RA,
139 SlotIndexes *const Indexes)
140 : RA(RA), LIS(RA.getLiveIntervals()), VRM(RA.getVirtRegMap()),
141 MRI(&VRM->getRegInfo()), TRI(MF.getSubtarget().getRegisterInfo()),
142 RegClassInfo(RA.getRegClassInfo()), Indexes(Indexes),
143 RegClassPriorityTrumpsGlobalness(
144 RA.getRegClassPriorityTrumpsGlobalness()),
145 ReverseLocalAssignment(RA.getReverseLocalAssignment()) {}
unsigned const MachineRegisterInfo * MRI
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:686
Module.h This file contains the declarations for the Module class.
unsigned const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:38
static cl::opt< RegAllocPriorityAdvisorAnalysis::AdvisorMode > Mode("regalloc-enable-priority-advisor", cl::Hidden, cl::init(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Development, "development", "for training"), clEnumValN(RegAllocPriorityAdvisorAnalysis::AdvisorMode::Dummy, "dummy", "prioritize low virtual register numbers for test and debug")))
SI optimize exec mask operations pre RA
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:94
virtual bool doInitialization(Module &)
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
Definition: Pass.h:119
virtual std::unique_ptr< RegAllocPriorityAdvisor > getAdvisor(const MachineFunction &MF, const RAGreedy &RA)=0
Get an advisor for the given context (i.e. machine function, etc)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
RegAllocPriorityAdvisor(const RegAllocPriorityAdvisor &)=delete
SlotIndexes pass.
Definition: SlotIndexes.h:297
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
#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:711
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
RegAllocPriorityAdvisorAnalysis * createReleaseModePriorityAdvisor()
RegAllocPriorityAdvisorAnalysis * createDevelopmentModePriorityAdvisor()
Pass * callDefaultCtor< RegAllocPriorityAdvisorAnalysis >()
Specialization for the API used by the analysis infrastructure to create an instance of the priority ...