diff options
Diffstat (limited to 'polly/lib')
-rw-r--r-- | polly/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | polly/lib/Canonicalization.cpp | 86 | ||||
-rw-r--r-- | polly/lib/RegisterPasses.cpp | 27 |
3 files changed, 90 insertions, 24 deletions
diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt index d82b0ce5c1f..dba1b85eb4e 100644 --- a/polly/lib/CMakeLists.txt +++ b/polly/lib/CMakeLists.txt @@ -24,6 +24,7 @@ set(LLVM_USED_LIBS ) add_polly_loadable_module(LLVMPolly + Canonicalization.cpp CodePreparation.cpp DeadCodeElimination.cpp IndependentBlocks.cpp diff --git a/polly/lib/Canonicalization.cpp b/polly/lib/Canonicalization.cpp new file mode 100644 index 00000000000..d6ce12f7e39 --- /dev/null +++ b/polly/lib/Canonicalization.cpp @@ -0,0 +1,86 @@ +//===---- Canonicalization.cpp - Run canonicalization passes ======-------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Run the set of default canonicalization passes. +// +// This pass is mainly used for debugging. +// +//===----------------------------------------------------------------------===// + +#include "polly/LinkAllPasses.h" +#include "polly/Canonicalization.h" +#include "llvm/Transforms/Scalar.h" + +using namespace llvm; +using namespace polly; + +void polly::registerCanonicalicationPasses(llvm::PassManagerBase &PM, + bool SCEVCodegen) { + PM.add(llvm::createPromoteMemoryToRegisterPass()); + PM.add(llvm::createPromoteMemoryToRegisterPass()); + PM.add(llvm::createInstructionCombiningPass()); + PM.add(llvm::createCFGSimplificationPass()); + PM.add(llvm::createTailCallEliminationPass()); + PM.add(llvm::createCFGSimplificationPass()); + PM.add(llvm::createReassociatePass()); + PM.add(llvm::createLoopRotatePass()); + PM.add(llvm::createInstructionCombiningPass()); + + if (!SCEVCodegen) + PM.add(polly::createIndVarSimplifyPass()); + + PM.add(polly::createCodePreparationPass()); +} + +namespace { +class PollyCanonicalize : public ModulePass { + PollyCanonicalize(const PollyCanonicalize &) LLVM_DELETED_FUNCTION; + const PollyCanonicalize & + operator=(const PollyCanonicalize &) LLVM_DELETED_FUNCTION; + +public: + static char ID; + + explicit PollyCanonicalize() : ModulePass(ID) {} + ~PollyCanonicalize(); + + /// @name FunctionPass interface. + //@{ + virtual void getAnalysisUsage(AnalysisUsage &AU) const; + virtual void releaseMemory(); + virtual bool runOnModule(Module &M); + virtual void print(raw_ostream &OS, const Module *) const; + //@} +}; +} + +PollyCanonicalize::~PollyCanonicalize() {} + +void PollyCanonicalize::getAnalysisUsage(AnalysisUsage &AU) const {} + +void PollyCanonicalize::releaseMemory() {} + +bool PollyCanonicalize::runOnModule(Module &M) { + PassManager PM; + registerCanonicalicationPasses(PM); + PM.run(M); + + return true; +} + +void PollyCanonicalize::print(raw_ostream &OS, const Module *) const {} + +char PollyCanonicalize::ID = 0; + +Pass *polly::createPollyCanonicalizePass() { return new PollyCanonicalize(); } + +INITIALIZE_PASS_BEGIN(PollyCanonicalize, "polly-canonicalize", + "Polly - Run canonicalization passes", false, false) +INITIALIZE_PASS_END(PollyCanonicalize, "polly-canonicalize", + "Polly - Run canonicalization passes", false, false) diff --git a/polly/lib/RegisterPasses.cpp b/polly/lib/RegisterPasses.cpp index 03dca9c0d78..5fd1960319b 100644 --- a/polly/lib/RegisterPasses.cpp +++ b/polly/lib/RegisterPasses.cpp @@ -20,6 +20,7 @@ //===----------------------------------------------------------------------===// #include "polly/RegisterPasses.h" +#include "polly/Canonicalization.h" #include "polly/CodeGen/BlockGenerators.h" #include "polly/CodeGen/Cloog.h" #include "polly/CodeGen/CodeGeneration.h" @@ -172,6 +173,7 @@ static void initializePollyPasses(PassRegistry &Registry) { initializePoccPass(Registry); #endif initializePollyIndVarSimplifyPass(Registry); + initializePollyCanonicalizePass(Registry); initializeScopDetectionPass(Registry); initializeScopInfoPass(Registry); initializeTempScopInfoPass(Registry); @@ -191,29 +193,6 @@ public: }; static StaticInitializer InitializeEverything; -/// @brief Schedule a set of canonicalization passes to prepare for Polly -/// -/// The set of optimization passes was partially taken/copied from the -/// set of default optimization passes in LLVM. It is used to bring the code -/// into a canonical form that simplifies the analysis and optimization passes -/// of Polly. The set of optimization passes scheduled here is probably not yet -/// optimal. TODO: Optimize the set of canonicalization passes. -static void registerCanonicalicationPasses(llvm::PassManagerBase &PM) { - PM.add(llvm::createPromoteMemoryToRegisterPass()); - PM.add(llvm::createInstructionCombiningPass()); - PM.add(llvm::createCFGSimplificationPass()); - PM.add(llvm::createTailCallEliminationPass()); - PM.add(llvm::createCFGSimplificationPass()); - PM.add(llvm::createReassociatePass()); - PM.add(llvm::createLoopRotatePass()); - PM.add(llvm::createInstructionCombiningPass()); - - if (!SCEVCodegen) - PM.add(polly::createIndVarSimplifyPass()); - - PM.add(polly::createCodePreparationPass()); -} - /// @brief Register Polly passes such that they form a polyhedral optimizer. /// /// The individual Polly passes are registered in the pass manager such that @@ -245,7 +224,7 @@ static void registerCanonicalicationPasses(llvm::PassManagerBase &PM) { /// code generator. For the moment, the CLooG code generator is enabled by /// default. static void registerPollyPasses(llvm::PassManagerBase &PM) { - registerCanonicalicationPasses(PM); + registerCanonicalicationPasses(PM, SCEVCodegen); PM.add(polly::createScopInfoPass()); |