diff options
Diffstat (limited to 'polly/lib/CodeGen/CodegenCleanup.cpp')
-rw-r--r-- | polly/lib/CodeGen/CodegenCleanup.cpp | 121 |
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) |