aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Passes/PassBuilder.cpp
diff options
context:
space:
mode:
authorpaperchalice <liujunchang97@outlook.com>2024-03-16 12:14:30 +0800
committerGitHub <noreply@github.com>2024-03-16 12:14:30 +0800
commit5a3cc7ba24c564a19a7812efd79ecd224b8193f5 (patch)
tree75f3438db6de181a760c029edd3d00df8c2df1e7 /llvm/lib/Passes/PassBuilder.cpp
parent426e6945897afbec01c042bec4771522a2aac176 (diff)
downloadllvm-5a3cc7ba24c564a19a7812efd79ecd224b8193f5.zip
llvm-5a3cc7ba24c564a19a7812efd79ecd224b8193f5.tar.gz
llvm-5a3cc7ba24c564a19a7812efd79ecd224b8193f5.tar.bz2
[PassBuilder] Expose parametrized passes related functions (#85357)
Some targets have passes with parameters, e.g. ARM, AMDGPU and MIPS. For example, AMDGPU has a pass `AMDGPUAtomicOptimizerPass` which need a `ScanOption`, this commit enables the syntax like `-passes=amdgpu-atomic-optimizer<strategy=dpp>` for backend passes.
Diffstat (limited to 'llvm/lib/Passes/PassBuilder.cpp')
-rw-r--r--llvm/lib/Passes/PassBuilder.cpp57
1 files changed, 6 insertions, 51 deletions
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 4d1eb10..0204730 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -503,15 +503,6 @@ static std::optional<int> parseDevirtPassName(StringRef Name) {
return Count;
}
-static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
- if (!Name.consume_front(PassName))
- return false;
- // normal pass name w/o parameters == default parameters
- if (Name.empty())
- return true;
- return Name.starts_with("<") && Name.ends_with(">");
-}
-
static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
return StringSwitch<std::optional<OptimizationLevel>>(S)
.Case("O0", OptimizationLevel::O0)
@@ -525,42 +516,6 @@ static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
namespace {
-/// This performs customized parsing of pass name with parameters.
-///
-/// We do not need parametrization of passes in textual pipeline very often,
-/// yet on a rare occasion ability to specify parameters right there can be
-/// useful.
-///
-/// \p Name - parameterized specification of a pass from a textual pipeline
-/// is a string in a form of :
-/// PassName '<' parameter-list '>'
-///
-/// Parameter list is being parsed by the parser callable argument, \p Parser,
-/// It takes a string-ref of parameters and returns either StringError or a
-/// parameter list in a form of a custom parameters type, all wrapped into
-/// Expected<> template class.
-///
-template <typename ParametersParseCallableT>
-auto parsePassParameters(ParametersParseCallableT &&Parser, StringRef Name,
- StringRef PassName) -> decltype(Parser(StringRef{})) {
- using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
-
- StringRef Params = Name;
- if (!Params.consume_front(PassName)) {
- assert(false &&
- "unable to strip pass name from parametrized pass specification");
- }
- if (!Params.empty() &&
- (!Params.consume_front("<") || !Params.consume_back(">"))) {
- assert(false && "invalid format for parametrized pass name");
- }
-
- Expected<ParametersT> Result = Parser(Params);
- assert((Result || Result.template errorIsA<StringError>()) &&
- "Pass parameter parser can only return StringErrors.");
- return Result;
-}
-
/// Parser of parameters for HardwareLoops pass.
Expected<HardwareLoopOptions> parseHardwareLoopOptions(StringRef Params) {
HardwareLoopOptions HardwareLoopOpts;
@@ -1196,7 +1151,7 @@ static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
if (Name == NAME) \
return true;
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
- if (checkParametrizedPassName(Name, NAME)) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
return true;
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1225,7 +1180,7 @@ static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
if (Name == NAME) \
return true;
#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
- if (checkParametrizedPassName(Name, NAME)) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
return true;
#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1252,7 +1207,7 @@ static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
if (Name == NAME) \
return true;
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
- if (checkParametrizedPassName(Name, NAME)) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
return true;
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1293,7 +1248,7 @@ static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
if (parseRepeatPassName(Name))
return true;
- if (checkParametrizedPassName(Name, "lnicm")) {
+ if (PassBuilder::checkParametrizedPassName(Name, "lnicm")) {
UseMemorySSA = true;
return true;
}
@@ -1315,7 +1270,7 @@ static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
if (parseRepeatPassName(Name))
return true;
- if (checkParametrizedPassName(Name, "licm")) {
+ if (PassBuilder::checkParametrizedPassName(Name, "licm")) {
UseMemorySSA = true;
return true;
}
@@ -1324,7 +1279,7 @@ static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
if (Name == NAME) \
return true;
#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
- if (checkParametrizedPassName(Name, NAME)) \
+ if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
return true;
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \