LLVM: include/llvm/Analysis/InlineAdvisor.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9#ifndef LLVM_ANALYSIS_INLINEADVISOR_H

10#define LLVM_ANALYSIS_INLINEADVISOR_H

11

17#include

18

19namespace llvm {

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

44

45

56

57

58

64

66

68

69

70

71

72

73

74

76public:

80

84 assert(Recorded && "InlineAdvice should have been informed of the "

85 "inliner's decision in all cases");

86 }

87

88

89

90

91

93

94

95

96

98

99

101 markRecorded();

103 }

104

105

107 markRecorded();

109 }

110

111

115

116protected:

121

123

126

127

128

129

134

135private:

136 void markRecorded() {

137 assert(!Recorded && "Recording should happen exactly once");

138 Recorded = true;

139 }

140 void recordInlineStatsIfNeeded();

141

142 bool Recorded = false;

143};

144

146public:

148 std::optional OIC,

151 OIC(OIC), EmitRemarks(EmitRemarks) {}

152

153private:

154 void recordUnsuccessfulInliningImpl(const InlineResult &Result) override;

155 void recordInliningWithCalleeDeletedImpl() override;

156 void recordInliningImpl() override;

157

158private:

160 std::optional OIC;

161 bool EmitRemarks;

162};

163

164

166public:

169

170

171

172

173

174

175

176

177

178

179

181 bool MandatoryOnly = false);

182

183

184

185

187

188

189

190

192

193

195 OS << "Unimplemented InlineAdvisor print\n";

196 }

197

198

202

203protected:

205 std::optional IC = std::nullopt);

208 bool Advice);

209

212 const std::optional IC;

215

217

218 static MandatoryInliningKind getMandatoryKind(CallBase &CB,

221

223

224private:

226};

227

228

229

230

232public:

236

237private:

238 std::unique_ptr getAdviceImpl(CallBase &CB) override;

239

241};

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

283public:

285

290

292 assert(Factory != nullptr &&

293 "The plugin advisor factory should not be a null pointer.");

294 }

295

299

302

303private:

305};

306

307

308

310public:

316 ModuleAnalysisManager::Invalidator &) {

317

318

320 return !PAC.preservedWhenStateless();

321 }

326

327 private:

330 std::unique_ptr Advisor;

331 };

332

334

335private:

336 static bool initializeIR2VecVocabIfRequested(Module &M,

338};

339

340

342 : public PassInfoMixin {

344

345public:

347

349

354};

355

356LLVM_ABI std::unique_ptr

358 std::function<bool(CallBase &)> GetDefaultAdvice);

359

360LLVM_ABI std::unique_ptr

362 std::function<bool(CallBase &)> GetDefaultAdvice);

363

364

365

366

367

368

369

370

371LLVM_ABI std::optional

375

376

380 const Function &Caller, bool IsMandatory,

382 const char *PassName = nullptr);

383

384

386 OptimizationRemarkEmitter &ORE, DebugLoc DLoc, const BasicBlock *Block,

387 const Function &Callee, const Function &Caller, const InlineCost &IC,

388 bool ForProfileContext = false, const char *PassName = nullptr);

389

390

392

393

395

396

398}

399#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

This header provides classes for managing passes over SCCs of the call graph.

This header defines various interfaces for pass management in LLVM.

Implements a lazy call graph analysis and related passes for the new pass manager.

Machine Check Debug Module

FunctionAnalysisManager FAM

ModuleAnalysisManager MAM

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 const char PassName[]

LLVM Basic Block Representation.

Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...

DefaultInlineAdvice(InlineAdvisor *Advisor, CallBase &CB, std::optional< InlineCost > OIC, OptimizationRemarkEmitter &ORE, bool EmitRemarks=true)

Definition InlineAdvisor.h:147

DefaultInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, InlineParams Params, InlineContext IC)

Definition InlineAdvisor.h:233

Calculate and dump ThinLTO specific inliner stats.

Function *const Callee

Definition InlineAdvisor.h:125

Function *const Caller

Caller and Callee are pre-inlining.

Definition InlineAdvisor.h:124

InlineAdvice(InlineAdvice &&)=delete

void recordUnsuccessfulInlining(const InlineResult &Result)

Call after the decision for a call site was to not inline.

Definition InlineAdvisor.h:100

InlineAdvice(const InlineAdvice &)=delete

virtual void recordInliningWithCalleeDeletedImpl()

Definition InlineAdvisor.h:118

void recordUnattemptedInlining()

Call to indicate inlining was not attempted.

Definition InlineAdvisor.h:106

const DebugLoc & getOriginalCallSiteDebugLoc() const

Definition InlineAdvisor.h:113

virtual void recordInliningImpl()

Definition InlineAdvisor.h:117

const BasicBlock *const Block

Definition InlineAdvisor.h:131

const BasicBlock * getOriginalCallSiteBasicBlock() const

Definition InlineAdvisor.h:114

LLVM_ABI void recordInlining()

Exactly one of the record* APIs must be called.

OptimizationRemarkEmitter & ORE

Definition InlineAdvisor.h:132

virtual void recordUnsuccessfulInliningImpl(const InlineResult &Result)

Definition InlineAdvisor.h:119

virtual ~InlineAdvice()

Definition InlineAdvisor.h:83

InlineAdvisor *const Advisor

Definition InlineAdvisor.h:122

LLVM_ABI InlineAdvice(InlineAdvisor *Advisor, CallBase &CB, OptimizationRemarkEmitter &ORE, bool IsInliningRecommended)

virtual void recordUnattemptedInliningImpl()

Definition InlineAdvisor.h:120

const DebugLoc DLoc

Definition InlineAdvisor.h:130

LLVM_ABI void recordInliningWithCalleeDeleted()

Call after inlining succeeded, and results in the callee being delete-able, meaning,...

bool isInliningRecommended() const

Get the inlining recommendation.

Definition InlineAdvisor.h:112

const bool IsInliningRecommended

Definition InlineAdvisor.h:133

static bool isRequired()

Definition InlineAdvisor.h:353

LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM)

InlineAdvisorAnalysisPrinterPass(raw_ostream &OS)

Definition InlineAdvisor.h:346

Result run(Module &M, ModuleAnalysisManager &MAM)

Definition InlineAdvisor.h:333

static LLVM_ABI AnalysisKey Key

Definition InlineAdvisor.h:311

InlineAdvisorAnalysis()=default

Interface for deciding whether to inline a call site or not.

Definition InlineAdvisor.h:165

const std::optional< InlineContext > IC

Definition InlineAdvisor.h:212

FunctionAnalysisManager & FAM

Definition InlineAdvisor.h:211

virtual void print(raw_ostream &OS) const

Support for printer pass.

Definition InlineAdvisor.h:194

MandatoryInliningKind

Definition InlineAdvisor.h:216

@ Always

Definition InlineAdvisor.h:216

@ Never

Definition InlineAdvisor.h:216

@ NotMandatory

Definition InlineAdvisor.h:216

const std::string AnnotatedInlinePassName

Definition InlineAdvisor.h:213

virtual std::unique_ptr< InlineAdvice > getMandatoryAdvice(CallBase &CB, bool Advice)

std::unique_ptr< ImportedFunctionsInliningStatistics > ImportedFunctionsStats

Definition InlineAdvisor.h:214

virtual void onPassEntry(LazyCallGraph::SCC *SCC=nullptr)

This must be called when the Inliner pass is entered, to allow the InlineAdvisor update internal stat...

Definition InlineAdvisor.h:186

const char * getAnnotatedInlinePassName() const

NOTE pass name is annotated only when inline advisor constructor provides InlineContext.

Definition InlineAdvisor.h:199

Module & M

Definition InlineAdvisor.h:210

virtual void onPassExit(LazyCallGraph::SCC *SCC=nullptr)

This must be called when the Inliner pass is exited, as function passes may be run subsequently.

Definition InlineAdvisor.h:191

friend class InlineAdvice

Definition InlineAdvisor.h:225

InlineAdvisor(InlineAdvisor &&)=delete

virtual std::unique_ptr< InlineAdvice > getAdviceImpl(CallBase &CB)=0

std::unique_ptr< InlineAdvice > getAdvice(CallBase &CB, bool MandatoryOnly=false)

Get an InlineAdvice containing a recommendation on whether to inline or not.

Represents the cost of inlining a function.

InlineResult is basically true or false.

An SCC of the call graph.

A lazily constructed view of the call graph of a module.

A Module instance is used to store all the information related to an LLVM module.

Result getResult()

Definition InlineAdvisor.h:301

PluginInlineAdvisorAnalysis(AdvisorFactory Factory)

Definition InlineAdvisor.h:291

InlineAdvisor *(* AdvisorFactory)(Module &M, FunctionAnalysisManager &FAM, InlineParams Params, InlineContext IC)

Definition InlineAdvisor.h:286

Result run(Module &M, ModuleAnalysisManager &MAM)

Definition InlineAdvisor.h:300

static LLVM_ABI AnalysisKey Key

Definition InlineAdvisor.h:284

A set of analyses that are preserved following a run of a transformation pass.

PreservedAnalysisChecker getChecker() const

Build a checker for this PreservedAnalyses and the specified analysis type.

This pass provides access to the codegen interfaces that are needed for IR-level transformations.

An efficient, type-erasing, non-owning reference to a callable.

This class implements an extremely fast bulk output stream that can only output to a stream.

This is an optimization pass for GlobalISel generic memory operations.

InlinePass

Definition InlineAdvisor.h:46

@ CGSCCInliner

Definition InlineAdvisor.h:48

@ AlwaysInliner

Definition InlineAdvisor.h:47

@ SampleProfileInliner

Definition InlineAdvisor.h:54

@ ModuleInliner

Definition InlineAdvisor.h:50

@ MLInliner

Definition InlineAdvisor.h:51

@ EarlyInliner

Definition InlineAdvisor.h:49

@ ReplaySampleProfileInliner

Definition InlineAdvisor.h:53

@ ReplayCGSCCInliner

Definition InlineAdvisor.h:52

LLVM_ABI void emitInlinedInto(OptimizationRemarkEmitter &ORE, DebugLoc DLoc, const BasicBlock *Block, const Function &Callee, const Function &Caller, bool IsMandatory, function_ref< void(OptimizationRemark &)> ExtraContext={}, const char *PassName=nullptr)

Emit ORE message.

LLVM_ABI std::string inlineCostStr(const InlineCost &IC)

Utility for extracting the inline cost message to a string.

InliningAdvisorMode

There are 4 scenarios we can use the InlineAdvisor:

Definition InlineAdvisor.h:43

@ Development

Definition InlineAdvisor.h:43

@ Release

Definition InlineAdvisor.h:43

LLVM_ABI std::optional< InlineCost > shouldInline(CallBase &CB, TargetTransformInfo &CalleeTTI, function_ref< InlineCost(CallBase &CB)> GetInlineCost, OptimizationRemarkEmitter &ORE, bool EnableDeferral=true)

Return the cost only if the inliner should attempt to inline at the given CallSite.

LLVM_ABI std::unique_ptr< InlineAdvisor > getDevelopmentModeAdvisor(Module &M, ModuleAnalysisManager &MAM, std::function< bool(CallBase &)> GetDefaultAdvice)

LLVM_ABI std::unique_ptr< InlineAdvisor > getReleaseModeAdvisor(Module &M, ModuleAnalysisManager &MAM, std::function< bool(CallBase &)> GetDefaultAdvice)

LLVM_ABI void setInlineRemark(CallBase &CB, StringRef Message)

Set the inline-remark attribute.

AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager

The CGSCC analysis manager.

LLVM_ABI std::string AnnotateInlinePassName(InlineContext IC)

ThinOrFullLTOPhase

This enumerates the LLVM full LTO or ThinLTO optimization phases.

LLVM_ABI void emitInlinedIntoBasedOnCost(OptimizationRemarkEmitter &ORE, DebugLoc DLoc, const BasicBlock *Block, const Function &Callee, const Function &Caller, const InlineCost &IC, bool ForProfileContext=false, const char *PassName=nullptr)

Emit ORE message based in cost (default heuristic).

LLVM_ABI void addLocationToRemarks(OptimizationRemark &Remark, DebugLoc DLoc)

Add location info to ORE message.

AnalysisManager< Function > FunctionAnalysisManager

Convenience typedef for the Function analysis manager.

@ Default

The result values are uniform if and only if all operands are uniform.

AnalysisManager< Module > ModuleAnalysisManager

Convenience typedef for the Module analysis manager.

A CRTP mix-in that provides informational APIs needed for analysis passes.

A special type used by analysis passes to provide an address that identifies that particular analysis...

Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...

Definition InlineAdvisor.h:313

LLVM_ABI bool tryCreate(InlineParams Params, InliningAdvisorMode Mode, const ReplayInlinerSettings &ReplaySettings, InlineContext IC)

InlineAdvisor * getAdvisor() const

Definition InlineAdvisor.h:325

Result(Module &M, ModuleAnalysisManager &MAM)

Definition InlineAdvisor.h:314

bool invalidate(Module &, const PreservedAnalyses &PA, ModuleAnalysisManager::Invalidator &)

Definition InlineAdvisor.h:315

Provides context on when an inline advisor is constructed in the pipeline (e.g., link phase,...

Definition InlineAdvisor.h:59

InlinePass Pass

Definition InlineAdvisor.h:62

ThinOrFullLTOPhase LTOPhase

Definition InlineAdvisor.h:60

Thresholds to tune inline cost analysis.

A CRTP mix-in to automatically provide informational APIs needed for passes.

Definition InlineAdvisor.h:296

AdvisorFactory Factory

Definition InlineAdvisor.h:297