LLVM: lib/CodeGen/RegAllocPriorityAdvisor.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

20

21using namespace llvm;

22

24 "regalloc-enable-priority-advisor", cl::Hidden,

26 cl::desc("Enable regalloc advisor mode"),

29 "default", "Default"),

31 "release", "precompiled"),

33 "development", "for training"),

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)

49 if (NotAsRequested)

50 Ctx.emitError("Requested regalloc priority advisor analysis "

51 "could be created. Using default");

52 }

53

54

56 return R->getAdvisorMode() == AdvisorMode::Default;

57 }

58

59 std::unique_ptr

62 return std::make_unique(MF, RA, &SI);

63 }

64};

65

66class DummyPriorityAdvisorProvider final

68public:

69 DummyPriorityAdvisorProvider()

71

73 return R->getAdvisorMode() == AdvisorMode::Dummy;

74 }

75

76 std::unique_ptr

79 return std::make_unique(MF, RA, &SI);

80 }

81};

82

83class DefaultPriorityAdvisorAnalysisLegacy final

85public:

86 DefaultPriorityAdvisorAnalysisLegacy(bool NotAsRequested)

88 NotAsRequested(NotAsRequested) {}

89

90

92 return R->getAdvisorMode() == AdvisorMode::Default;

93 }

94

95private:

99 }

100

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()

116

117

119 return R->getAdvisorMode() == AdvisorMode::Dummy;

120 }

121

122private:

126 }

127

129 Provider.reset(new DummyPriorityAdvisorProvider());

130 return false;

131 }

132};

133

134}

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(false, Ctx));

146 return;

148#if defined(LLVM_HAVE_TFLITE)

150#else

151 Provider.reset(

152 new DefaultPriorityAdvisorProvider(true, Ctx));

153#endif

154 return;

157 return;

158 }

159}

160

161AnalysisKey RegAllocPriorityAdvisorAnalysis::Key;

162

166

168

169 return Result{Provider.get()};

170}

171

172template <>

174 Pass *Ret = nullptr;

175 switch (Mode) {

177 Ret = new DefaultPriorityAdvisorAnalysisLegacy( 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( true);

194}

195

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 }

208}

209

213 : RA(RA), LIS(RA.getLiveIntervals()), VRM(RA.getVirtRegMap()),

214 MRI(&VRM->getRegInfo()), TRI(MF.getSubtarget().getRegisterInfo()),

217 RA.getRegClassPriorityTrumpsGlobalness()),

#define clEnumValN(ENUMVAL, FLAGNAME, DESC)

Module.h This file contains the declarations for the Module class.

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))

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

Represent the analysis usage information of a pass.

AnalysisUsage & addRequired()

LLVMContext & getContext() const

getContext - Return a reference to the LLVMContext associated with this function.

This is an important class for using LLVM in a threaded context.

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.

Pass interface - Implemented by all 'passes'.

virtual bool doInitialization(Module &)

doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...

virtual StringRef getPassName() const

getPassName - Return a nice clean name for a pass.

void getAnalysisUsage(AnalysisUsage &AU) const override

getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...

AdvisorMode getAdvisorMode() const

RegAllocPriorityAdvisorProvider::AdvisorMode AdvisorMode

RegAllocPriorityAdvisorAnalysisLegacy(AdvisorMode Mode)

Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)

Definition RegAllocPriorityAdvisor.cpp:164

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

RegAllocPriorityAdvisorProvider(AdvisorMode Mode)

const RegisterClassInfo & RegClassInfo

MachineRegisterInfo *const MRI

RegAllocPriorityAdvisor(const RegAllocPriorityAdvisor &)=delete

const bool RegClassPriorityTrumpsGlobalness

const bool ReverseLocalAssignment

SlotIndexes *const Indexes

const TargetRegisterInfo *const TRI

StringRef - Represent a constant reference to a string, i.e.

#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 ...

initializer< Ty > init(const Ty &Val)

This is an optimization pass for GlobalISel generic memory operations.

RegAllocPriorityAdvisorAnalysisLegacy * createReleaseModePriorityAdvisorAnalysis()

RegAllocPriorityAdvisorAnalysisLegacy * createDevelopmentModePriorityAdvisorAnalysis()

AnalysisManager< MachineFunction > MachineFunctionAnalysisManager

Pass * callDefaultCtor< RegAllocPriorityAdvisorAnalysisLegacy >()

Specialization for the API used by the analysis infrastructure to create an instance of the priority ...

Definition RegAllocPriorityAdvisor.cpp:173

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...