Skip to content

Commit 5a3cc7b

Browse files
authored
[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.
1 parent 426e694 commit 5a3cc7b

File tree

2 files changed

+52
-51
lines changed

2 files changed

+52
-51
lines changed

llvm/include/llvm/Passes/PassBuilder.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,52 @@ class PassBuilder {
626626
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
627627
OptimizationLevel Level);
628628

629+
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
630+
if (!Name.consume_front(PassName))
631+
return false;
632+
// normal pass name w/o parameters == default parameters
633+
if (Name.empty())
634+
return true;
635+
return Name.starts_with("<") && Name.ends_with(">");
636+
}
637+
638+
/// This performs customized parsing of pass name with parameters.
639+
///
640+
/// We do not need parametrization of passes in textual pipeline very often,
641+
/// yet on a rare occasion ability to specify parameters right there can be
642+
/// useful.
643+
///
644+
/// \p Name - parameterized specification of a pass from a textual pipeline
645+
/// is a string in a form of :
646+
/// PassName '<' parameter-list '>'
647+
///
648+
/// Parameter list is being parsed by the parser callable argument, \p Parser,
649+
/// It takes a string-ref of parameters and returns either StringError or a
650+
/// parameter list in a form of a custom parameters type, all wrapped into
651+
/// Expected<> template class.
652+
///
653+
template <typename ParametersParseCallableT>
654+
static auto parsePassParameters(ParametersParseCallableT &&Parser,
655+
StringRef Name, StringRef PassName)
656+
-> decltype(Parser(StringRef{})) {
657+
using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
658+
659+
StringRef Params = Name;
660+
if (!Params.consume_front(PassName)) {
661+
llvm_unreachable(
662+
"unable to strip pass name from parametrized pass specification");
663+
}
664+
if (!Params.empty() &&
665+
(!Params.consume_front("<") || !Params.consume_back(">"))) {
666+
llvm_unreachable("invalid format for parametrized pass name");
667+
}
668+
669+
Expected<ParametersT> Result = Parser(Params);
670+
assert((Result || Result.template errorIsA<StringError>()) &&
671+
"Pass parameter parser can only return StringErrors.");
672+
return Result;
673+
}
674+
629675
private:
630676
// O1 pass pipeline
631677
FunctionPassManager

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 6 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -503,15 +503,6 @@ static std::optional<int> parseDevirtPassName(StringRef Name) {
503503
return Count;
504504
}
505505

506-
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
507-
if (!Name.consume_front(PassName))
508-
return false;
509-
// normal pass name w/o parameters == default parameters
510-
if (Name.empty())
511-
return true;
512-
return Name.starts_with("<") && Name.ends_with(">");
513-
}
514-
515506
static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
516507
return StringSwitch<std::optional<OptimizationLevel>>(S)
517508
.Case("O0", OptimizationLevel::O0)
@@ -525,42 +516,6 @@ static std::optional<OptimizationLevel> parseOptLevel(StringRef S) {
525516

526517
namespace {
527518

528-
/// This performs customized parsing of pass name with parameters.
529-
///
530-
/// We do not need parametrization of passes in textual pipeline very often,
531-
/// yet on a rare occasion ability to specify parameters right there can be
532-
/// useful.
533-
///
534-
/// \p Name - parameterized specification of a pass from a textual pipeline
535-
/// is a string in a form of :
536-
/// PassName '<' parameter-list '>'
537-
///
538-
/// Parameter list is being parsed by the parser callable argument, \p Parser,
539-
/// It takes a string-ref of parameters and returns either StringError or a
540-
/// parameter list in a form of a custom parameters type, all wrapped into
541-
/// Expected<> template class.
542-
///
543-
template <typename ParametersParseCallableT>
544-
auto parsePassParameters(ParametersParseCallableT &&Parser, StringRef Name,
545-
StringRef PassName) -> decltype(Parser(StringRef{})) {
546-
using ParametersT = typename decltype(Parser(StringRef{}))::value_type;
547-
548-
StringRef Params = Name;
549-
if (!Params.consume_front(PassName)) {
550-
assert(false &&
551-
"unable to strip pass name from parametrized pass specification");
552-
}
553-
if (!Params.empty() &&
554-
(!Params.consume_front("<") || !Params.consume_back(">"))) {
555-
assert(false && "invalid format for parametrized pass name");
556-
}
557-
558-
Expected<ParametersT> Result = Parser(Params);
559-
assert((Result || Result.template errorIsA<StringError>()) &&
560-
"Pass parameter parser can only return StringErrors.");
561-
return Result;
562-
}
563-
564519
/// Parser of parameters for HardwareLoops pass.
565520
Expected<HardwareLoopOptions> parseHardwareLoopOptions(StringRef Params) {
566521
HardwareLoopOptions HardwareLoopOpts;
@@ -1196,7 +1151,7 @@ static bool isModulePassName(StringRef Name, CallbacksT &Callbacks) {
11961151
if (Name == NAME) \
11971152
return true;
11981153
#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1199-
if (checkParametrizedPassName(Name, NAME)) \
1154+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
12001155
return true;
12011156
#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
12021157
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1225,7 +1180,7 @@ static bool isCGSCCPassName(StringRef Name, CallbacksT &Callbacks) {
12251180
if (Name == NAME) \
12261181
return true;
12271182
#define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1228-
if (checkParametrizedPassName(Name, NAME)) \
1183+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
12291184
return true;
12301185
#define CGSCC_ANALYSIS(NAME, CREATE_PASS) \
12311186
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1252,7 +1207,7 @@ static bool isFunctionPassName(StringRef Name, CallbacksT &Callbacks) {
12521207
if (Name == NAME) \
12531208
return true;
12541209
#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1255-
if (checkParametrizedPassName(Name, NAME)) \
1210+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
12561211
return true;
12571212
#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
12581213
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \
@@ -1293,7 +1248,7 @@ static bool isLoopNestPassName(StringRef Name, CallbacksT &Callbacks,
12931248
if (parseRepeatPassName(Name))
12941249
return true;
12951250

1296-
if (checkParametrizedPassName(Name, "lnicm")) {
1251+
if (PassBuilder::checkParametrizedPassName(Name, "lnicm")) {
12971252
UseMemorySSA = true;
12981253
return true;
12991254
}
@@ -1315,7 +1270,7 @@ static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
13151270
if (parseRepeatPassName(Name))
13161271
return true;
13171272

1318-
if (checkParametrizedPassName(Name, "licm")) {
1273+
if (PassBuilder::checkParametrizedPassName(Name, "licm")) {
13191274
UseMemorySSA = true;
13201275
return true;
13211276
}
@@ -1324,7 +1279,7 @@ static bool isLoopPassName(StringRef Name, CallbacksT &Callbacks,
13241279
if (Name == NAME) \
13251280
return true;
13261281
#define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
1327-
if (checkParametrizedPassName(Name, NAME)) \
1282+
if (PassBuilder::checkParametrizedPassName(Name, NAME)) \
13281283
return true;
13291284
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
13301285
if (Name == "require<" NAME ">" || Name == "invalidate<" NAME ">") \

0 commit comments

Comments
 (0)