diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -2407,7 +2407,7 @@ #define FUNCTION_PASS(NAME, CREATE_PASS) \ if (Name == NAME) \ return true; -#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) \ return true; #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \ @@ -2431,7 +2431,7 @@ #define LOOP_PASS(NAME, CREATE_PASS) \ if (Name == NAME) \ return true; -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) \ return true; #define LOOP_ANALYSIS(NAME, CREATE_PASS) \ @@ -2621,7 +2621,7 @@ MPM.addPass(createModuleToFunctionPassAdaptor(CREATE_PASS)); \ return Error::success(); \ } -#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2635,7 +2635,7 @@ createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \ return Error::success(); \ } -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2728,7 +2728,7 @@ CGPM.addPass(createCGSCCToFunctionPassAdaptor(CREATE_PASS)); \ return Error::success(); \ } -#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2742,7 +2742,7 @@ createFunctionToLoopPassAdaptor(CREATE_PASS, false, false))); \ return Error::success(); \ } -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2813,7 +2813,7 @@ FPM.addPass(CREATE_PASS); \ return Error::success(); \ } -#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2842,7 +2842,7 @@ FPM.addPass(createFunctionToLoopPassAdaptor(CREATE_PASS, false, false)); \ return Error::success(); \ } -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -2900,7 +2900,7 @@ LPM.addPass(CREATE_PASS); \ return Error::success(); \ } -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \ +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ if (checkParametrizedPassName(Name, NAME)) { \ auto Params = parsePassParameters(PARSER, Name, NAME); \ if (!Params) \ @@ -3160,6 +3160,10 @@ static void printPassName(StringRef PassName, raw_ostream &OS) { OS << " " << PassName << "\n"; } +static void printPassName(StringRef PassName, StringRef Params, + raw_ostream &OS) { + OS << " " << PassName << "<" << Params << ">\n"; +} void PassBuilder::printPassNames(raw_ostream &OS) { // TODO: print pass descriptions when they are available @@ -3188,6 +3192,11 @@ #define FUNCTION_PASS(NAME, CREATE_PASS) printPassName(NAME, OS); #include "PassRegistry.def" + OS << "Function passes with params:\n"; +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ + printPassName(NAME, PARAMS, OS); +#include "PassRegistry.def" + OS << "Function analyses:\n"; #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS); #include "PassRegistry.def" @@ -3200,6 +3209,11 @@ #define LOOP_PASS(NAME, CREATE_PASS) printPassName(NAME, OS); #include "PassRegistry.def" + OS << "Loop passes with params:\n"; +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) \ + printPassName(NAME, PARAMS, OS); +#include "PassRegistry.def" + OS << "Loop analyses:\n"; #define LOOP_ANALYSIS(NAME, CREATE_PASS) printPassName(NAME, OS); #include "PassRegistry.def" diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -331,43 +331,65 @@ #undef FUNCTION_PASS #ifndef FUNCTION_PASS_WITH_PARAMS -#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) +#define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) #endif FUNCTION_PASS_WITH_PARAMS("loop-unroll", [](LoopUnrollOptions Opts) { return LoopUnrollPass(Opts); }, - parseLoopUnrollOptions) + parseLoopUnrollOptions, + "O0;O1;O2;O3;full-unroll-max=N;" + "no-partial;partial;" + "no-peeling;peeling;" + "no-profile-peeling;profile-peeling;" + "no-runtime;runtime;" + "no-upperbound;upperbound") FUNCTION_PASS_WITH_PARAMS("msan", [](MemorySanitizerOptions Opts) { return MemorySanitizerPass(Opts); }, - parseMSanPassOptions) + parseMSanPassOptions, + "recover;kernel;track-origins=N") FUNCTION_PASS_WITH_PARAMS("simplify-cfg", [](SimplifyCFGOptions Opts) { return SimplifyCFGPass(Opts); }, - parseSimplifyCFGOptions) + parseSimplifyCFGOptions, + "no-forward-switch-cond;forward-switch-cond;" + "no-switch-to-lookup;switch-to-lookup;" + "no-keep-loops;keep-loops;" + "no-hoist-common-insts;hoist-common-insts;" + "no-sink-common-insts;sink-common-insts;" + "bonus-inst-threshold=N" + ) FUNCTION_PASS_WITH_PARAMS("loop-vectorize", [](LoopVectorizeOptions Opts) { return LoopVectorizePass(Opts); }, - parseLoopVectorizeOptions) + parseLoopVectorizeOptions, + "no-interleave-forced-only;interleave-forced-only;" + "no-vectorize-forced-only;vectorize-forced-only") FUNCTION_PASS_WITH_PARAMS("mldst-motion", [](MergedLoadStoreMotionOptions Opts) { return MergedLoadStoreMotionPass(Opts); }, - parseMergedLoadStoreMotionOptions) + parseMergedLoadStoreMotionOptions, + "no-split-footer-bb;split-footer-bb") FUNCTION_PASS_WITH_PARAMS("gvn", [](GVNOptions Opts) { return GVN(Opts); }, - parseGVNOptions) + parseGVNOptions, + "no-pre;pre;" + "no-load-pre;load-pre;" + "no-split-backedge-load-pre;split-backedge-load-pre;" + "no-memdep;memdep") FUNCTION_PASS_WITH_PARAMS("print", [](StackLifetime::LivenessType Type) { return StackLifetimePrinterPass(dbgs(), Type); }, - parseStackLifetimeOptions) + parseStackLifetimeOptions, + "may;must") #undef FUNCTION_PASS_WITH_PARAMS #ifndef LOOP_ANALYSIS @@ -414,11 +436,12 @@ #undef LOOP_PASS #ifndef LOOP_PASS_WITH_PARAMS -#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) +#define LOOP_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER, PARAMS) #endif LOOP_PASS_WITH_PARAMS("unswitch", - [](bool NonTrivial) { - return SimpleLoopUnswitchPass(NonTrivial); - }, - parseLoopUnswitchOptions) + [](bool NonTrivial) { + return SimpleLoopUnswitchPass(NonTrivial); + }, + parseLoopUnswitchOptions, + "no-nontrivial;nontrivial") #undef LOOP_PASS_WITH_PARAMS diff --git a/llvm/test/Other/print-passes.ll b/llvm/test/Other/print-passes.ll --- a/llvm/test/Other/print-passes.ll +++ b/llvm/test/Other/print-passes.ll @@ -12,11 +12,15 @@ ; CHECK: no-op-cgscc ; CHECK: Function passes: ; CHECK: no-op-function +; CHECK: Function passes with params: +; CHECK: loop-unroll ; CHECK: Function analyses: ; CHECK: no-op-function ; CHECK: Function alias analyses: ; CHECK: basic-aa ; CHECK: Loop passes: ; CHECK: no-op-loop +; CHECK: Loop passes with params: +; CHECK: unswitch ; CHECK: Loop analyses: ; CHECK: no-op-loop