Move Pass registration into polly library

This ensures that the polly passes get properly registered both, when using
polly as a loadable module and when directly linking it into clang/opt/bugpoint.

llvm-svn: 204255
This commit is contained in:
Tobias Grosser 2014-03-19 17:54:23 +00:00
parent 3a520a9373
commit 806e9fff60
3 changed files with 42 additions and 45 deletions

View File

@ -24,7 +24,5 @@ class PassManagerBase;
namespace polly {
void initializePollyPasses(llvm::PassRegistry &Registry);
void registerPollyPasses(llvm::PassManagerBase &PM);
bool shouldEnablePolly();
}
#endif

View File

@ -27,45 +27,4 @@ public:
}
};
static StaticInitializer InitializeEverything;
static void
registerPollyEarlyAsPossiblePasses(const llvm::PassManagerBuilder &Builder,
llvm::PassManagerBase &PM) {
if (!polly::shouldEnablePolly())
return;
polly::registerPollyPasses(PM);
}
/// @brief Register Polly to be available as an optimizer
///
/// We currently register Polly such that it runs as early as possible. This has
/// several implications:
///
/// 1) We need to schedule more canonicalization passes
///
/// As nothing is run before Polly, it is necessary to run a set of preparing
/// transformations before Polly to canonicalize the LLVM-IR and to allow
/// Polly to detect and understand the code.
///
/// 2) LICM and LoopIdiom pass have not yet been run
///
/// Loop invariant code motion as well as the loop idiom recognition pass make
/// it more difficult for Polly to transform code. LICM may introduce
/// additional data dependences that are hard to eliminate and the loop idiom
/// recognition pass may introduce calls to memset that we currently do not
/// understand. By running Polly early enough (meaning before these passes) we
/// avoid difficulties that may be introduced by these passes.
///
/// 3) We get the full -O3 optimization sequence after Polly
///
/// The LLVM-IR that is generated by Polly has been optimized on a high level,
/// but it may be rather inefficient on the lower/scalar level. By scheduling
/// Polly before all other passes, we have the full sequence of -O3
/// optimizations behind us, such that inefficiencies on the low level can
/// be optimized away.
static llvm::RegisterStandardPasses
RegisterPollyOptimizer(llvm::PassManagerBuilder::EP_EarlyAsPossible,
registerPollyEarlyAsPossiblePasses);
} // end of anonymous namespace.

View File

@ -210,7 +210,7 @@ void initializePollyPasses(PassRegistry &Registry) {
/// Polly supports both CLooG (http://www.cloog.org) as well as the isl internal
/// code generator. For the moment, the CLooG code generator is enabled by
/// default.
void registerPollyPasses(llvm::PassManagerBase &PM) {
static void registerPollyPasses(llvm::PassManagerBase &PM) {
registerCanonicalicationPasses(PM, SCEVCodegen);
PM.add(polly::createScopInfoPass());
@ -276,7 +276,7 @@ void registerPollyPasses(llvm::PassManagerBase &PM) {
PM.add(llvm::createCFGPrinterPass());
}
bool shouldEnablePolly() {
static bool shouldEnablePolly() {
if (PollyOnlyPrinter || PollyPrinter || PollyOnlyViewer || PollyViewer)
PollyTrackFailures = true;
@ -286,4 +286,44 @@ bool shouldEnablePolly() {
return PollyEnabled;
}
static void
registerPollyEarlyAsPossiblePasses(const llvm::PassManagerBuilder &Builder,
llvm::PassManagerBase &PM) {
if (!polly::shouldEnablePolly())
return;
polly::registerPollyPasses(PM);
}
/// @brief Register Polly to be available as an optimizer
///
/// We currently register Polly such that it runs as early as possible. This has
/// several implications:
///
/// 1) We need to schedule more canonicalization passes
///
/// As nothing is run before Polly, it is necessary to run a set of preparing
/// transformations before Polly to canonicalize the LLVM-IR and to allow
/// Polly to detect and understand the code.
///
/// 2) LICM and LoopIdiom pass have not yet been run
///
/// Loop invariant code motion as well as the loop idiom recognition pass make
/// it more difficult for Polly to transform code. LICM may introduce
/// additional data dependences that are hard to eliminate and the loop idiom
/// recognition pass may introduce calls to memset that we currently do not
/// understand. By running Polly early enough (meaning before these passes) we
/// avoid difficulties that may be introduced by these passes.
///
/// 3) We get the full -O3 optimization sequence after Polly
///
/// The LLVM-IR that is generated by Polly has been optimized on a high level,
/// but it may be rather inefficient on the lower/scalar level. By scheduling
/// Polly before all other passes, we have the full sequence of -O3
/// optimizations behind us, such that inefficiencies on the low level can
/// be optimized away.
static llvm::RegisterStandardPasses
RegisterPollyOptimizer(llvm::PassManagerBuilder::EP_EarlyAsPossible,
registerPollyEarlyAsPossiblePasses);
}