@@ -392,6 +392,12 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
392
392
#define CGSCC_ANALYSIS (NAME, CREATE_PASS ) \
393
393
PIC->addClassToPassName (decltype (CREATE_PASS)::name (), NAME);
394
394
#include " PassRegistry.def"
395
+
396
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
397
+ PIC->addClassToPassName (PASS_NAME::name (), NAME);
398
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
399
+ PIC->addClassToPassName (PASS_NAME::name (), NAME);
400
+ #include " llvm/CodeGen/MachinePassRegistry.def"
395
401
}
396
402
}
397
403
@@ -427,6 +433,17 @@ void PassBuilder::registerFunctionAnalyses(FunctionAnalysisManager &FAM) {
427
433
C (FAM);
428
434
}
429
435
436
+ void PassBuilder::registerMachineFunctionAnalyses (
437
+ MachineFunctionAnalysisManager &MFAM) {
438
+
439
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
440
+ MFAM.registerPass ([&] { return PASS_NAME (); });
441
+ #include " llvm/CodeGen/MachinePassRegistry.def"
442
+
443
+ for (auto &C : MachineFunctionAnalysisRegistrationCallbacks)
444
+ C (MFAM);
445
+ }
446
+
430
447
void PassBuilder::registerLoopAnalyses (LoopAnalysisManager &LAM) {
431
448
#define LOOP_ANALYSIS (NAME, CREATE_PASS ) \
432
449
LAM.registerPass ([&] { return CREATE_PASS; });
@@ -1781,6 +1798,33 @@ Error PassBuilder::parseLoopPass(LoopPassManager &LPM,
1781
1798
inconvertibleErrorCode ());
1782
1799
}
1783
1800
1801
+ Error PassBuilder::parseMachinePass (MachineFunctionPassManager &MFPM,
1802
+ const PipelineElement &E) {
1803
+ StringRef Name = E.Name ;
1804
+ if (!E.InnerPipeline .empty ())
1805
+ return make_error<StringError>(" invalid pipeline" ,
1806
+ inconvertibleErrorCode ());
1807
+
1808
+ #define MACHINE_MODULE_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
1809
+ if (Name == NAME) { \
1810
+ MFPM.addPass (PASS_NAME ()); \
1811
+ return Error::success (); \
1812
+ }
1813
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
1814
+ if (Name == NAME) { \
1815
+ MFPM.addPass (PASS_NAME ()); \
1816
+ return Error::success (); \
1817
+ }
1818
+ #include " llvm/CodeGen/MachinePassRegistry.def"
1819
+
1820
+ for (auto &C : MachinePipelineParsingCallbacks)
1821
+ if (C (Name, MFPM))
1822
+ return Error::success ();
1823
+ return make_error<StringError>(
1824
+ formatv (" unknown machine pass '{0}'" , Name).str (),
1825
+ inconvertibleErrorCode ());
1826
+ }
1827
+
1784
1828
bool PassBuilder::parseAAPassName (AAManager &AA, StringRef Name) {
1785
1829
#define MODULE_ALIAS_ANALYSIS (NAME, CREATE_PASS ) \
1786
1830
if (Name == NAME) { \
@@ -1802,6 +1846,15 @@ bool PassBuilder::parseAAPassName(AAManager &AA, StringRef Name) {
1802
1846
return false ;
1803
1847
}
1804
1848
1849
+ Error PassBuilder::parseMachinePassPipeline (
1850
+ MachineFunctionPassManager &MFPM, ArrayRef<PipelineElement> Pipeline) {
1851
+ for (const auto &Element : Pipeline) {
1852
+ if (auto Err = parseMachinePass (MFPM, Element))
1853
+ return Err;
1854
+ }
1855
+ return Error::success ();
1856
+ }
1857
+
1805
1858
Error PassBuilder::parseLoopPassPipeline (LoopPassManager &LPM,
1806
1859
ArrayRef<PipelineElement> Pipeline) {
1807
1860
for (const auto &Element : Pipeline) {
@@ -1961,6 +2014,20 @@ Error PassBuilder::parsePassPipeline(LoopPassManager &CGPM,
1961
2014
return Error::success ();
1962
2015
}
1963
2016
2017
+ Error PassBuilder::parsePassPipeline (MachineFunctionPassManager &MFPM,
2018
+ StringRef PipelineText) {
2019
+ auto Pipeline = parsePipelineText (PipelineText);
2020
+ if (!Pipeline || Pipeline->empty ())
2021
+ return make_error<StringError>(
2022
+ formatv (" invalid machine pass pipeline '{0}'" , PipelineText).str (),
2023
+ inconvertibleErrorCode ());
2024
+
2025
+ if (auto Err = parseMachinePassPipeline (MFPM, *Pipeline))
2026
+ return Err;
2027
+
2028
+ return Error::success ();
2029
+ }
2030
+
1964
2031
Error PassBuilder::parseAAPipeline (AAManager &AA, StringRef PipelineText) {
1965
2032
// If the pipeline just consists of the word 'default' just replace the AA
1966
2033
// manager with our default one.
@@ -2055,6 +2122,21 @@ void PassBuilder::printPassNames(raw_ostream &OS) {
2055
2122
OS << " Loop analyses:\n " ;
2056
2123
#define LOOP_ANALYSIS (NAME, CREATE_PASS ) printPassName(NAME, OS);
2057
2124
#include " PassRegistry.def"
2125
+
2126
+ OS << " Machine module passes (WIP):\n " ;
2127
+ #define MACHINE_MODULE_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
2128
+ printPassName (NAME, OS);
2129
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2130
+
2131
+ OS << " Machine function passes (WIP):\n " ;
2132
+ #define MACHINE_FUNCTION_PASS (NAME, PASS_NAME, CONSTRUCTOR ) \
2133
+ printPassName (NAME, OS);
2134
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2135
+
2136
+ OS << " Machine function analyses (WIP):\n " ;
2137
+ #define MACHINE_FUNCTION_ANALYSIS (NAME, PASS_NAME, CONSTRUCTOR ) \
2138
+ printPassName (NAME, OS);
2139
+ #include " llvm/CodeGen/MachinePassRegistry.def"
2058
2140
}
2059
2141
2060
2142
void PassBuilder::registerParseTopLevelPipelineCallback (
0 commit comments