summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/CodeGen/CodegenCleanup.h17
-rw-r--r--polly/lib/CMakeLists.txt1
-rw-r--r--polly/lib/CodeGen/CodeGeneration.cpp6
-rw-r--r--polly/lib/CodeGen/CodegenCleanup.cpp121
-rw-r--r--polly/lib/Support/RegisterPasses.cpp6
5 files changed, 149 insertions, 2 deletions
diff --git a/polly/include/polly/CodeGen/CodegenCleanup.h b/polly/include/polly/CodeGen/CodegenCleanup.h
new file mode 100644
index 00000000000..779532f8a1f
--- /dev/null
+++ b/polly/include/polly/CodeGen/CodegenCleanup.h
@@ -0,0 +1,17 @@
+#ifndef POLLY_CODEGENCLEANUP_H
+#define POLLY_CODEGENCLEANUP_H
+
+namespace llvm {
+class FunctionPass;
+class PassRegistry;
+}
+
+namespace polly {
+llvm::FunctionPass *createCodegenCleanupPass();
+}
+
+namespace llvm {
+void initializeCodegenCleanupPass(llvm::PassRegistry &);
+}
+
+#endif
diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt
index fe51bd47d9a..51c28248a40 100644
--- a/polly/lib/CMakeLists.txt
+++ b/polly/lib/CMakeLists.txt
@@ -37,6 +37,7 @@ add_polly_library(Polly
CodeGen/IRBuilder.cpp
CodeGen/Utils.cpp
CodeGen/RuntimeDebugBuilder.cpp
+ CodeGen/CodegenCleanup.cpp
${GPGPU_CODEGEN_FILES}
Exchange/JSONExporter.cpp
Support/GICHelper.cpp
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index 1f2f0c021ec..55c42ce0a8b 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -176,6 +176,12 @@ public:
assert(!verifyGeneratedFunction(S, *EnteringBB->getParent()) &&
"Verification of generated function failed");
+
+ // Mark the function such that we run additional cleanup passes on this
+ // function (e.g. mem2reg to rediscover phi nodes).
+ Function *F = EnteringBB->getParent();
+ F->addFnAttr("polly-optimized");
+
return true;
}
diff --git a/polly/lib/CodeGen/CodegenCleanup.cpp b/polly/lib/CodeGen/CodegenCleanup.cpp
new file mode 100644
index 00000000000..932a3e62a4f
--- /dev/null
+++ b/polly/lib/CodeGen/CodegenCleanup.cpp
@@ -0,0 +1,121 @@
+#include "polly/CodeGen/CodegenCleanup.h"
+
+#include "llvm/Analysis/CFLAliasAnalysis.h"
+#include "llvm/Analysis/ScopedNoAliasAA.h"
+#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/PassInfo.h"
+#include "llvm/PassRegistry.h"
+#include "llvm/PassSupport.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Transforms/Scalar.h"
+#define DEBUG_TYPE "polly-cleanup"
+
+using namespace llvm;
+using namespace polly;
+
+namespace {
+
+class CodegenCleanup : public FunctionPass {
+private:
+ CodegenCleanup(const CodegenCleanup &) = delete;
+ const CodegenCleanup &operator=(const CodegenCleanup &) = delete;
+
+ llvm::legacy::FunctionPassManager *FPM;
+
+public:
+ static char ID;
+ explicit CodegenCleanup() : FunctionPass(ID), FPM(nullptr) {}
+
+ /// @name FunctionPass interface
+ //@{
+ virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {}
+
+ virtual bool doInitialization(Module &M) override {
+ assert(!FPM);
+
+ FPM = new llvm::legacy::FunctionPassManager(&M);
+
+ // TODO: How to make parent passes discoverable?
+ // TODO: Should be sensitive to compiler options in PassManagerBuilder, to
+ // which wo do not have access here.
+ FPM->add(createCFLAAWrapperPass());
+ FPM->add(createScopedNoAliasAAWrapperPass());
+ FPM->add(createTypeBasedAAWrapperPass());
+ FPM->add(createAAResultsWrapperPass());
+
+ // TODO: These are non-conditional passes that run between
+ // EP_ModuleOptimizerEarly and EP_VectorizerStart just to ensure we do not
+ // miss any optimization that would have run after Polly with
+ // -polly-position=early. This can probably be reduced to a more compact set
+ // of passes.
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createScalarReplAggregatesPass());
+ FPM->add(createEarlyCSEPass());
+ FPM->add(createInstructionCombiningPass());
+ FPM->add(createJumpThreadingPass());
+ FPM->add(createCorrelatedValuePropagationPass());
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createInstructionCombiningPass());
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createReassociatePass());
+ FPM->add(createLoopRotatePass());
+ FPM->add(createLICMPass());
+ FPM->add(createLoopUnswitchPass());
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createInstructionCombiningPass());
+ FPM->add(createIndVarSimplifyPass());
+ FPM->add(createLoopIdiomPass());
+ FPM->add(createLoopDeletionPass());
+ FPM->add(createLoopInterchangePass());
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createSimpleLoopUnrollPass());
+ FPM->add(createMergedLoadStoreMotionPass());
+ FPM->add(createMemCpyOptPass());
+ FPM->add(createBitTrackingDCEPass());
+ FPM->add(createInstructionCombiningPass());
+ FPM->add(createJumpThreadingPass());
+ FPM->add(createCorrelatedValuePropagationPass());
+ FPM->add(createDeadStoreEliminationPass());
+ FPM->add(createLICMPass());
+ FPM->add(createLoopRerollPass());
+ FPM->add(createLoadCombinePass());
+ FPM->add(createAggressiveDCEPass());
+ FPM->add(createCFGSimplificationPass());
+ FPM->add(createInstructionCombiningPass());
+
+ return FPM->doInitialization();
+ }
+
+ virtual bool doFinalization(Module &M) override {
+ bool Result = FPM->doFinalization();
+
+ delete FPM;
+ FPM = nullptr;
+
+ return Result;
+ }
+
+ virtual bool runOnFunction(llvm::Function &F) override {
+ if (!F.hasFnAttribute("polly-optimized")) {
+ DEBUG(dbgs() << F.getName()
+ << ": Skipping cleanup because Polly did not optimize it.");
+ return false;
+ }
+
+ DEBUG(dbgs() << F.getName() << ": Running codegen cleanup...");
+ return FPM->run(F);
+ }
+ //@}
+};
+
+char CodegenCleanup::ID;
+}
+
+FunctionPass *polly::createCodegenCleanupPass() { return new CodegenCleanup(); }
+
+INITIALIZE_PASS_BEGIN(CodegenCleanup, "polly-cleanup",
+ "Polly - Cleanup after code generation", false, false)
+INITIALIZE_PASS_END(CodegenCleanup, "polly-cleanup",
+ "Polly - Cleanup after code generation", false, false)
diff --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp
index c6bbb77e705..e2f33490162 100644
--- a/polly/lib/Support/RegisterPasses.cpp
+++ b/polly/lib/Support/RegisterPasses.cpp
@@ -22,6 +22,7 @@
#include "polly/RegisterPasses.h"
#include "polly/Canonicalization.h"
#include "polly/CodeGen/CodeGeneration.h"
+#include "polly/CodeGen/CodegenCleanup.h"
#include "polly/DependenceInfo.h"
#include "polly/LinkAllPasses.h"
#include "polly/Options.h"
@@ -153,6 +154,7 @@ void initializePollyPasses(PassRegistry &Registry) {
initializePollyCanonicalizePass(Registry);
initializeScopDetectionPass(Registry);
initializeScopInfoPass(Registry);
+ initializeCodegenCleanupPass(Registry);
}
/// @brief Register Polly passes such that they form a polyhedral optimizer.
@@ -263,7 +265,7 @@ registerPollyLoopOptimizerEndPasses(const llvm::PassManagerBuilder &Builder,
PM.add(polly::createCodePreparationPass());
polly::registerPollyPasses(PM);
- // TODO: Add some cleanup passes
+ PM.add(createCodegenCleanupPass());
}
static void
@@ -277,7 +279,7 @@ registerPollyScalarOptimizerLatePasses(const llvm::PassManagerBuilder &Builder,
PM.add(polly::createCodePreparationPass());
polly::registerPollyPasses(PM);
- // TODO: Add some cleanup passes
+ PM.add(createCodegenCleanupPass());
}
/// @brief Register Polly to be available as an optimizer
OpenPOWER on IntegriCloud