Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Kruse <llvm-project@meinersbur.de>2021-05-14 01:09:55 +0300
committerMichael Kruse <llvm-project@meinersbur.de>2021-05-14 20:55:03 +0300
commit5aafcb2b440fb71a026e9c74101f272caecf08b0 (patch)
tree779dd104727b960b60cb2d092f4d3099faf0185b /polly/lib/Support
parente82db87fb102f01b0895b074e56568025c659575 (diff)
[Polly] Add support for -polly-position=early with the NPM.
This required support for the canonicalization passes, inlcuding porting RewriteByReferenceParams to the NPM. For some reason, the legacy pass pipeline with -polly-position=early did not run the CodePreparation pass. This was fixed as well.
Diffstat (limited to 'polly/lib/Support')
-rw-r--r--polly/lib/Support/RegisterPasses.cpp75
1 files changed, 64 insertions, 11 deletions
diff --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp
index 1c8703f16521..d8fe5efdd9f3 100644
--- a/polly/lib/Support/RegisterPasses.cpp
+++ b/polly/lib/Support/RegisterPasses.cpp
@@ -263,7 +263,7 @@ void initializePollyPasses(PassRegistry &Registry) {
initializeScopInlinerPass(Registry);
initializeScopInfoRegionPassPass(Registry);
initializeScopInfoWrapperPassPass(Registry);
- initializeRewriteByrefParamsPass(Registry);
+ initializeRewriteByrefParamsWrapperPassPass(Registry);
initializeCodegenCleanupPass(Registry);
initializeFlattenSchedulePass(Registry);
initializeForwardOpTreeWrapperPassPass(Registry);
@@ -429,6 +429,7 @@ registerPollyEarlyAsPossiblePasses(const llvm::PassManagerBuilder &Builder,
return;
registerCanonicalicationPasses(PM);
+ PM.add(polly::createCodePreparationPass());
registerPollyPasses(PM, EnableForOpt);
}
@@ -466,13 +467,17 @@ registerPollyScalarOptimizerLatePasses(const llvm::PassManagerBuilder &Builder,
PM.add(createCodegenCleanupPass());
}
-static void buildDefaultPollyPipeline(FunctionPassManager &PM,
- PassBuilder::OptimizationLevel Level) {
- bool EnableForOpt =
- shouldEnablePollyForOptimization() && Level.isOptimizingForSpeed();
- if (!shouldEnablePollyForDiagnostic() && !EnableForOpt)
- return;
-
+/// Add the pass sequence required for Polly to the New Pass Manager.
+///
+/// @param PM The pass manager itself.
+/// @param Level The optimization level. Used for the cleanup of Polly's
+/// output.
+/// @param EnableForOpt Whether to add Polly IR transformations. If False, only
+/// the analysis passes are added, skipping Polly itself.
+/// The IR may still be modified.
+static void buildCommonPollyPipeline(FunctionPassManager &PM,
+ PassBuilder::OptimizationLevel Level,
+ bool EnableForOpt) {
PassBuilder PB;
ScopPassManager SPM;
@@ -583,6 +588,43 @@ static void buildDefaultPollyPipeline(FunctionPassManager &PM,
PM.addPass(llvm::CFGPrinterPass());
}
+static void buildEarlyPollyPipeline(ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ bool EnableForOpt =
+ shouldEnablePollyForOptimization() && Level.isOptimizingForSpeed();
+ if (!shouldEnablePollyForDiagnostic() && !EnableForOpt)
+ return;
+
+ FunctionPassManager FPM = buildCanonicalicationPassesForNPM(MPM, Level);
+
+ if (DumpBefore)
+ report_fatal_error("Option -polly-dump-before not supported with NPM",
+ false);
+ if (!DumpBeforeFile.empty())
+ report_fatal_error("Option -polly-dump-before-file not supported with NPM",
+ false);
+
+ buildCommonPollyPipeline(FPM, Level, EnableForOpt);
+ MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
+}
+
+static void buildLatePollyPipeline(FunctionPassManager &PM,
+ PassBuilder::OptimizationLevel Level) {
+ bool EnableForOpt =
+ shouldEnablePollyForOptimization() && Level.isOptimizingForSpeed();
+ if (!shouldEnablePollyForDiagnostic() && !EnableForOpt)
+ return;
+
+ if (DumpBefore)
+ report_fatal_error("Option -polly-dump-before not supported with NPM",
+ false);
+ if (!DumpBeforeFile.empty())
+ report_fatal_error("Option -polly-dump-before-file not supported with NPM",
+ false);
+
+ buildCommonPollyPipeline(PM, Level, EnableForOpt);
+}
+
/// Register Polly to be available as an optimizer
///
///
@@ -776,9 +818,20 @@ void registerPollyPasses(PassBuilder &PB) {
return parseTopLevelPipeline(MPM, PIC, Pipeline);
});
- if (PassPosition != POSITION_BEFORE_VECTORIZER)
- report_fatal_error("Option -polly-position not supported with NPM", false);
- PB.registerVectorizerStartEPCallback(buildDefaultPollyPipeline);
+ switch (PassPosition) {
+ case POSITION_EARLY:
+ PB.registerPipelineStartEPCallback(buildEarlyPollyPipeline);
+ break;
+ case POSITION_AFTER_LOOPOPT:
+ report_fatal_error(
+ "Option -polly-position=after-loopopt not supported with NPM", false);
+ break;
+ case POSITION_BEFORE_VECTORIZER:
+ PB.registerVectorizerStartEPCallback(buildLatePollyPipeline);
+ break;
+ default:
+ llvm_unreachable("Unknown -polly-position option");
+ }
}
} // namespace polly