41 struct NoOpModulePass {
47 struct NoOpModuleAnalysis {
49 Result run(
Module &) {
return Result(); }
51 static void *
ID() {
return (
void *)&PassID; }
56 char NoOpModuleAnalysis::PassID;
59 struct NoOpCGSCCPass {
67 struct NoOpCGSCCAnalysis {
71 static void *
ID() {
return (
void *)&PassID; }
76 char NoOpCGSCCAnalysis::PassID;
79 struct NoOpFunctionPass {
85 struct NoOpFunctionAnalysis {
87 Result run(
Function &) {
return Result(); }
89 static void *
ID() {
return (
void *)&PassID; }
94 char NoOpFunctionAnalysis::PassID;
99 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
100 MAM.registerPass(CREATE_PASS);
101 #include "PassRegistry.def"
105 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
106 CGAM.registerPass(CREATE_PASS);
107 #include "PassRegistry.def"
111 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
112 FAM.registerPass(CREATE_PASS);
113 #include "PassRegistry.def"
118 #define MODULE_PASS(NAME, CREATE_PASS) if (Name == NAME) return true;
119 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
120 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
122 #include "PassRegistry.def"
129 #define CGSCC_PASS(NAME, CREATE_PASS) if (Name == NAME) return true;
130 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
131 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
133 #include "PassRegistry.def"
139 #define FUNCTION_PASS(NAME, CREATE_PASS) if (Name == NAME) return true;
140 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
141 if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
143 #include "PassRegistry.def"
149 #define MODULE_PASS(NAME, CREATE_PASS) \
150 if (Name == NAME) { \
151 MPM.addPass(CREATE_PASS); \
154 #define MODULE_ANALYSIS(NAME, CREATE_PASS) \
155 if (Name == "require<" NAME ">") { \
156 MPM.addPass(RequireAnalysisPass<decltype(CREATE_PASS)>()); \
159 if (Name == "invalidate<" NAME ">") { \
160 MPM.addPass(InvalidateAnalysisPass<decltype(CREATE_PASS)>()); \
163 #include "PassRegistry.def"
169 #define CGSCC_PASS(NAME, CREATE_PASS) \
170 if (Name == NAME) { \
171 CGPM.addPass(CREATE_PASS); \
174 #define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
175 if (Name == "require<" NAME ">") { \
176 CGPM.addPass(RequireAnalysisPass<decltype(CREATE_PASS)>()); \
179 if (Name == "invalidate<" NAME ">") { \
180 CGPM.addPass(InvalidateAnalysisPass<decltype(CREATE_PASS)>()); \
183 #include "PassRegistry.def"
190 #define FUNCTION_PASS(NAME, CREATE_PASS) \
191 if (Name == NAME) { \
192 FPM.addPass(CREATE_PASS); \
195 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
196 if (Name == "require<" NAME ">") { \
197 FPM.addPass(RequireAnalysisPass<decltype(CREATE_PASS)>()); \
200 if (Name == "invalidate<" NAME ">") { \
201 FPM.addPass(InvalidateAnalysisPass<decltype(CREATE_PASS)>()); \
204 #include "PassRegistry.def"
219 PipelineText = PipelineText.
substr(strlen(
"function("));
220 if (!parseFunctionPassPipeline(NestedFPM, PipelineText, VerifyEachPass,
222 PipelineText.
empty())
224 assert(PipelineText[0] ==
')');
225 PipelineText = PipelineText.
substr(1);
228 FPM.
addPass(std::move(NestedFPM));
232 if (!parseFunctionPassName(FPM, PipelineText.
substr(0, End)))
237 PipelineText = PipelineText.
substr(End);
240 if (PipelineText.
empty() || PipelineText[0] ==
')')
243 assert(PipelineText[0] ==
',');
244 PipelineText = PipelineText.
substr(1);
258 PipelineText = PipelineText.
substr(strlen(
"cgscc("));
259 if (!parseCGSCCPassPipeline(NestedCGPM, PipelineText, VerifyEachPass,
261 PipelineText.
empty())
263 assert(PipelineText[0] ==
')');
264 PipelineText = PipelineText.
substr(1);
267 CGPM.
addPass(std::move(NestedCGPM));
268 }
else if (PipelineText.
startswith(
"function(")) {
272 PipelineText = PipelineText.
substr(strlen(
"function("));
273 if (!parseFunctionPassPipeline(NestedFPM, PipelineText, VerifyEachPass,
275 PipelineText.
empty())
277 assert(PipelineText[0] ==
')');
278 PipelineText = PipelineText.
substr(1);
285 if (!parseCGSCCPassName(CGPM, PipelineText.
substr(0, End)))
289 PipelineText = PipelineText.
substr(End);
292 if (PipelineText.
empty() || PipelineText[0] ==
')')
295 assert(PipelineText[0] ==
',');
296 PipelineText = PipelineText.
substr(1);
310 PipelineText = PipelineText.
substr(strlen(
"module("));
311 if (!parseModulePassPipeline(NestedMPM, PipelineText, VerifyEachPass,
313 PipelineText.
empty())
315 assert(PipelineText[0] ==
')');
316 PipelineText = PipelineText.
substr(1);
319 MPM.
addPass(std::move(NestedMPM));
320 }
else if (PipelineText.
startswith(
"cgscc(")) {
324 PipelineText = PipelineText.
substr(strlen(
"cgscc("));
325 if (!parseCGSCCPassPipeline(NestedCGPM, PipelineText, VerifyEachPass,
327 PipelineText.
empty())
329 assert(PipelineText[0] ==
')');
330 PipelineText = PipelineText.
substr(1);
335 }
else if (PipelineText.
startswith(
"function(")) {
339 PipelineText = PipelineText.
substr(strlen(
"function("));
340 if (!parseFunctionPassPipeline(NestedFPM, PipelineText, VerifyEachPass,
342 PipelineText.
empty())
344 assert(PipelineText[0] ==
')');
345 PipelineText = PipelineText.
substr(1);
352 if (!parseModulePassName(MPM, PipelineText.
substr(0, End)))
357 PipelineText = PipelineText.
substr(End);
360 if (PipelineText.
empty() || PipelineText[0] ==
')')
363 assert(PipelineText[0] ==
',');
364 PipelineText = PipelineText.
substr(1);
372 StringRef PipelineText,
bool VerifyEachPass,
377 if (parseModulePassPipeline(MPM, PipelineText, VerifyEachPass, DebugLogging))
378 return PipelineText.
empty();
385 "Already handled all module pipeline options.");
391 if (!parseCGSCCPassPipeline(CGPM, PipelineText, VerifyEachPass,
393 !PipelineText.
empty())
403 if (!parseFunctionPassPipeline(FPM, PipelineText, VerifyEachPass,
405 !PipelineText.
empty())
This file provides the interface for the pass responsible for both simplifying and canonicalizing the...
Interfaces for registering analysis passes, producing common pass manager configurations, and parsing of pass pipelines.
A Module instance is used to store all the information related to an LLVM module. ...
This file provides the primary interface to the instcombine pass.
Implements a lazy call graph analysis and related passes for the new pass manager.
void registerModuleAnalyses(ModuleAnalysisManager &MAM)
Registers all available module analysis passes.
StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
ModuleToPostOrderCGSCCPassAdaptor< CGSCCPassT > createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
CGSCCToFunctionPassAdaptor< FunctionPassT > createCGSCCToFunctionPassAdaptor(FunctionPassT Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
This file provides the interface for a simple, fast CSE pass.
static bool isFunctionPassName(StringRef Name)
An abstract set of preserved analyses following a transformation pass run.
ModuleToFunctionPassAdaptor< FunctionPassT > createModuleToFunctionPassAdaptor(FunctionPassT Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
void registerFunctionAnalyses(FunctionAnalysisManager &FAM)
Registers all available function analysis passes.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
static bool isModulePassName(StringRef Name)
bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
bool parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText, bool VerifyEachPass=true, bool DebugLogging=false)
Parse a textual pass pipeline description into a ModulePassManager.
Manages a sequence of passes over units of IR.
static bool isCGSCCPassName(StringRef Name)
The header file for the LowerExpectIntrinsic pass as used by the new pass manager.
size_t find_first_of(char C, size_t From=0) const
Find the first character in the string that is C, or npos if not found.
This header provides classes for managing passes over SCCs of the call graph.
This file defines passes to print out IR in various granularities.
void registerCGSCCAnalyses(CGSCCAnalysisManager &CGAM)
Registers all available CGSCC analysis passes.
An SCC of the call graph.
StringRef - Represent a constant reference to a string, i.e.
A generic analysis pass manager with lazy running and caching of results.
This header defines various interfaces for pass management in LLVM.
bool empty() const
empty - Check if the string is empty.