summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/CodegenCleanup.cpp
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2015-11-26 12:36:25 +0000
committerMichael Kruse <llvm@meinersbur.de>2015-11-26 12:36:25 +0000
commit4c86a1d97b9361490c385cb521746a5ed7c270ec (patch)
tree630e3034ce7a0a1d3243412e0c5af1ef2f319fd8 /polly/lib/CodeGen/CodegenCleanup.cpp
parentcba170e4d0c7b82c29e66a45a4a9db7617b1ee44 (diff)
downloadbcm5719-llvm-4c86a1d97b9361490c385cb521746a5ed7c270ec.tar.gz
bcm5719-llvm-4c86a1d97b9361490c385cb521746a5ed7c270ec.zip
IR cleanup after CodeGeneration
Re-run canonicalization passes after Polly's code generation. The set of passes currently added here are nearly all the passes between --polly-position=early and --polly-position=before-vectorizer, i.e. all passes that would usually run after Polly. In order to run these only if Polly actually modified the code, we add a function attribute "polly-optimzed" to a function that contains generated code. The cleanup pass is skipped if the function does not have this attribute. There is no support by the (legacy) PassManager to run passes only under some conditions. One could have wrapped all transformation passes to run only when CodeGeneration changed the code, but the analyses would run anyway. This patch creates an independent pass manager. The disadvantages are that all analyses have to re-run even if preserved and it does not honor compiler switches like the PassManagerBuilder does. Differential Revision: http://reviews.llvm.org/D14333 llvm-svn: 254150
Diffstat (limited to 'polly/lib/CodeGen/CodegenCleanup.cpp')
-rw-r--r--polly/lib/CodeGen/CodegenCleanup.cpp121
1 files changed, 121 insertions, 0 deletions
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)
OpenPOWER on IntegriCloud