@@ -488,6 +488,12 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
488
488
#define CGSCC_ANALYSIS (NAME, CREATE_PASS ) \
489
489
PIC->addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
490
490
#include " PassRegistry.def"
491
+
492
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
493
+ PIC->addClassToPassName (PASS_NAME::name (), NAME);
494
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
495
+ PIC->addClassToPassName (PASS_NAME::name (), NAME);
496
+ #include " llvm/CodeGen/MachinePassRegistry.def"
491
497
}
492
498
}
493
499
@@ -523,6 +529,17 @@ void PassBuilder::registerFunctionAnalyses(FunctionAnalysisManager &FAM) {
523
529
C (FAM);
524
530
}
525
531
532
+ void PassBuilder::registerMachineFunctionAnalyses (
533
+ MachineFunctionAnalysisManager &MFAM) {
534
+
535
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
536
+ MFAM.registerPass ([&] { return PASS_NAME (); });
537
+ #include " llvm/CodeGen/MachinePassRegistry.def"
538
+
539
+ for (auto &C : MachineFunctionAnalysisRegistrationCallbacks)
540
+ C (MFAM);
541
+ }
542
+
526
543
void PassBuilder::registerLoopAnalyses (LoopAnalysisManager &LAM) {
527
544
#define LOOP_ANALYSIS (NAME, CREATE_PASS ) \
528
545
LAM.registerPass ([&] { return CREATE_PASS; });
@@ -1877,6 +1894,33 @@ Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
1877
1894
inconvertibleErrorCode ());
1878
1895
}
1879
1896
1897
+ Error PassBuilder::parseMachinePass (MachineFunctionPassManager &MFPM,
1898
+ const PipelineElement &E) {
1899
+ StringRef Name = E.Name ;
1900
+ if (!E.InnerPipeline .empty ())
1901
+ return make_error<StringError>(" invalid pipeline" ,
1902
+ inconvertibleErrorCode ());
1903
+
1904
+ #define MACHINE_MODULE_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
1905
+ if (Name == NAME) { \
1906
+ MFPM.addPass (PASS_NAME ()); \
1907
+ return Error::success (); \
1908
+ }
1909
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
1910
+ if (Name == NAME) { \
1911
+ MFPM.addPass (PASS_NAME ()); \
1912
+ return Error::success (); \
1913
+ }
1914
+ #include " llvm/CodeGen/MachinePassRegistry.def"
1915
+
1916
+ for (auto &C : MachinePipelineParsingCallbacks)
1917
+ if (C (Name, MFPM))
1918
+ return Error::success ();
1919
+ return make_error<StringError>(
1920
+ formatv (" unknown machine pass '{0}'" , Name).str (),
1921
+ inconvertibleErrorCode ());
1922
+ }
1923
+
1880
1924
bool PassBuilder::parseAAPassName (AAManager &AA, StringRef Name) {
1881
1925
#define MODULE_ALIAS_ANALYSIS (NAME, CREATE_PASS ) \
1882
1926
if (Name == NAME) { \
@@ -1898,6 +1942,15 @@ bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
1898
1942
return false ;
1899
1943
}
1900
1944
1945
+ Error PassBuilder::parseMachinePassPipeline (
1946
+ MachineFunctionPassManager &MFPM, ArrayRef<PipelineElement> Pipeline) {
1947
+ for (const auto &Element : Pipeline) {
1948
+ if (auto Err = parseMachinePass (MFPM, Element))
1949
+ return Err;
1950
+ }
1951
+ return Error::success ();
1952
+ }
1953
+
1901
1954
Error PassBuilder::parseLoopPassPipeline (LoopPassManager &LPM,
1902
1955
ArrayRef<PipelineElement> Pipeline) {
1903
1956
for (const auto &Element : Pipeline) {
@@ -2057,6 +2110,20 @@ Error PassBuilder::parsePassPipeline(LoopPassManager &CGPM,
2057
2110
return Error::success ();
2058
2111
}
2059
2112
2113
+ Error PassBuilder::parsePassPipeline (MachineFunctionPassManager &MFPM,
2114
+ StringRef PipelineText) {
2115
+ auto Pipeline = parsePipelineText (PipelineText);
2116
+ if (!Pipeline || Pipeline->empty ())
2117
+ return make_error<StringError>(
2118
+ formatv (" invalid machine pass pipeline '{0}'" , PipelineText).str (),
2119
+ inconvertibleErrorCode ());
2120
+
2121
+ if (auto Err = parseMachinePassPipeline (MFPM, *Pipeline))
2122
+ return Err;
2123
+
2124
+ return Error::success ();
2125
+ }
2126
+
2060
2127
Error PassBuilder::parseAAPipeline (AAManager &AA, StringRef PipelineText) {
2061
2128
// If the pipeline just consists of the word 'default' just replace the AA
2062
2129
// manager with our default one.
@@ -2151,6 +2218,21 @@ void PassBuilder::printPassNames(raw_ostream &OS) {
2151
2218
OS << " Loop analyses:\n " ;
2152
2219
#define LOOP_ANALYSIS (NAME, CREATE_PASS ) printPassName(NAME, OS);
2153
2220
#include " PassRegistry.def"
2221
+
2222
+ OS << " Machine module passes (WIP):\n " ;
2223
+ #define MACHINE_MODULE_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
2224
+ printPassName (NAME, OS);
2225
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2226
+
2227
+ OS << " Machine function passes (WIP):\n " ;
2228
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
2229
+ printPassName (NAME, OS);
2230
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2231
+
2232
+ OS << " Machine function analyses (WIP):\n " ;
2233
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
2234
+ printPassName (NAME, OS);
2235
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2154
2236
}
2155
2237
2156
2238
void PassBuilder::registerParseTopLevelPipelineCallback (
0 commit comments