diff options
author | Michael Kruse <llvm-project@meinersbur.de> | 2021-05-14 01:09:55 +0300 |
---|---|---|
committer | Michael Kruse <llvm-project@meinersbur.de> | 2021-05-14 20:55:03 +0300 |
commit | 5aafcb2b440fb71a026e9c74101f272caecf08b0 (patch) | |
tree | 779dd104727b960b60cb2d092f4d3099faf0185b /polly/lib/Support | |
parent | e82db87fb102f01b0895b074e56568025c659575 (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.cpp | 75 |
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 |