summaryrefslogtreecommitdiffstats
path: root/polly/lib
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib')
-rw-r--r--polly/lib/CMakeLists.txt1
-rw-r--r--polly/lib/Canonicalization.cpp86
-rw-r--r--polly/lib/RegisterPasses.cpp27
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());
OpenPOWER on IntegriCloud