14c86a1d9SMichael Kruse #include "polly/CodeGen/CodegenCleanup.h"
24c86a1d9SMichael Kruse 
34c86a1d9SMichael Kruse #include "llvm/Analysis/CFLAliasAnalysis.h"
44c86a1d9SMichael Kruse #include "llvm/Analysis/ScopedNoAliasAA.h"
54c86a1d9SMichael Kruse #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
64c86a1d9SMichael Kruse #include "llvm/IR/Function.h"
74c86a1d9SMichael Kruse #include "llvm/IR/LegacyPassManager.h"
84c86a1d9SMichael Kruse #include "llvm/PassInfo.h"
94c86a1d9SMichael Kruse #include "llvm/PassRegistry.h"
104c86a1d9SMichael Kruse #include "llvm/PassSupport.h"
114c86a1d9SMichael Kruse #include "llvm/Support/Debug.h"
124c86a1d9SMichael Kruse #include "llvm/Transforms/Scalar.h"
134c86a1d9SMichael Kruse #define DEBUG_TYPE "polly-cleanup"
144c86a1d9SMichael Kruse 
154c86a1d9SMichael Kruse using namespace llvm;
164c86a1d9SMichael Kruse using namespace polly;
174c86a1d9SMichael Kruse 
184c86a1d9SMichael Kruse namespace {
194c86a1d9SMichael Kruse 
204c86a1d9SMichael Kruse class CodegenCleanup : public FunctionPass {
214c86a1d9SMichael Kruse private:
224c86a1d9SMichael Kruse   CodegenCleanup(const CodegenCleanup &) = delete;
234c86a1d9SMichael Kruse   const CodegenCleanup &operator=(const CodegenCleanup &) = delete;
244c86a1d9SMichael Kruse 
254c86a1d9SMichael Kruse   llvm::legacy::FunctionPassManager *FPM;
264c86a1d9SMichael Kruse 
274c86a1d9SMichael Kruse public:
284c86a1d9SMichael Kruse   static char ID;
294c86a1d9SMichael Kruse   explicit CodegenCleanup() : FunctionPass(ID), FPM(nullptr) {}
304c86a1d9SMichael Kruse 
314c86a1d9SMichael Kruse   /// @name FunctionPass interface
324c86a1d9SMichael Kruse   //@{
334c86a1d9SMichael Kruse   virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {}
344c86a1d9SMichael Kruse 
354c86a1d9SMichael Kruse   virtual bool doInitialization(Module &M) override {
364c86a1d9SMichael Kruse     assert(!FPM);
374c86a1d9SMichael Kruse 
384c86a1d9SMichael Kruse     FPM = new llvm::legacy::FunctionPassManager(&M);
394c86a1d9SMichael Kruse 
404c86a1d9SMichael Kruse     // TODO: How to make parent passes discoverable?
414c86a1d9SMichael Kruse     // TODO: Should be sensitive to compiler options in PassManagerBuilder, to
424c86a1d9SMichael Kruse     // which wo do not have access here.
434c86a1d9SMichael Kruse     FPM->add(createCFLAAWrapperPass());
444c86a1d9SMichael Kruse     FPM->add(createScopedNoAliasAAWrapperPass());
454c86a1d9SMichael Kruse     FPM->add(createTypeBasedAAWrapperPass());
464c86a1d9SMichael Kruse     FPM->add(createAAResultsWrapperPass());
474c86a1d9SMichael Kruse 
484c86a1d9SMichael Kruse     // TODO: These are non-conditional passes that run between
494c86a1d9SMichael Kruse     // EP_ModuleOptimizerEarly and EP_VectorizerStart just to ensure we do not
504c86a1d9SMichael Kruse     // miss any optimization that would have run after Polly with
514c86a1d9SMichael Kruse     // -polly-position=early. This can probably be reduced to a more compact set
524c86a1d9SMichael Kruse     // of passes.
534c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
54*6b4e9282SMichael Kruse     FPM->add(createSROAPass());
554c86a1d9SMichael Kruse     FPM->add(createEarlyCSEPass());
564c86a1d9SMichael Kruse     FPM->add(createInstructionCombiningPass());
574c86a1d9SMichael Kruse     FPM->add(createJumpThreadingPass());
584c86a1d9SMichael Kruse     FPM->add(createCorrelatedValuePropagationPass());
594c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
604c86a1d9SMichael Kruse     FPM->add(createInstructionCombiningPass());
614c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
624c86a1d9SMichael Kruse     FPM->add(createReassociatePass());
634c86a1d9SMichael Kruse     FPM->add(createLoopRotatePass());
644c86a1d9SMichael Kruse     FPM->add(createLICMPass());
654c86a1d9SMichael Kruse     FPM->add(createLoopUnswitchPass());
664c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
674c86a1d9SMichael Kruse     FPM->add(createInstructionCombiningPass());
684c86a1d9SMichael Kruse     FPM->add(createIndVarSimplifyPass());
694c86a1d9SMichael Kruse     FPM->add(createLoopIdiomPass());
704c86a1d9SMichael Kruse     FPM->add(createLoopDeletionPass());
714c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
724c86a1d9SMichael Kruse     FPM->add(createSimpleLoopUnrollPass());
734c86a1d9SMichael Kruse     FPM->add(createMergedLoadStoreMotionPass());
744c86a1d9SMichael Kruse     FPM->add(createMemCpyOptPass());
754c86a1d9SMichael Kruse     FPM->add(createBitTrackingDCEPass());
764c86a1d9SMichael Kruse     FPM->add(createInstructionCombiningPass());
774c86a1d9SMichael Kruse     FPM->add(createJumpThreadingPass());
784c86a1d9SMichael Kruse     FPM->add(createCorrelatedValuePropagationPass());
794c86a1d9SMichael Kruse     FPM->add(createDeadStoreEliminationPass());
804c86a1d9SMichael Kruse     FPM->add(createLICMPass());
814c86a1d9SMichael Kruse     FPM->add(createLoopRerollPass());
824c86a1d9SMichael Kruse     FPM->add(createAggressiveDCEPass());
834c86a1d9SMichael Kruse     FPM->add(createCFGSimplificationPass());
844c86a1d9SMichael Kruse     FPM->add(createInstructionCombiningPass());
854c86a1d9SMichael Kruse 
864c86a1d9SMichael Kruse     return FPM->doInitialization();
874c86a1d9SMichael Kruse   }
884c86a1d9SMichael Kruse 
894c86a1d9SMichael Kruse   virtual bool doFinalization(Module &M) override {
904c86a1d9SMichael Kruse     bool Result = FPM->doFinalization();
914c86a1d9SMichael Kruse 
924c86a1d9SMichael Kruse     delete FPM;
934c86a1d9SMichael Kruse     FPM = nullptr;
944c86a1d9SMichael Kruse 
954c86a1d9SMichael Kruse     return Result;
964c86a1d9SMichael Kruse   }
974c86a1d9SMichael Kruse 
984c86a1d9SMichael Kruse   virtual bool runOnFunction(llvm::Function &F) override {
994c86a1d9SMichael Kruse     if (!F.hasFnAttribute("polly-optimized")) {
1004c86a1d9SMichael Kruse       DEBUG(dbgs() << F.getName()
1014c86a1d9SMichael Kruse                    << ": Skipping cleanup because Polly did not optimize it.");
1024c86a1d9SMichael Kruse       return false;
1034c86a1d9SMichael Kruse     }
1044c86a1d9SMichael Kruse 
1054c86a1d9SMichael Kruse     DEBUG(dbgs() << F.getName() << ": Running codegen cleanup...");
1064c86a1d9SMichael Kruse     return FPM->run(F);
1074c86a1d9SMichael Kruse   }
1084c86a1d9SMichael Kruse   //@}
1094c86a1d9SMichael Kruse };
1104c86a1d9SMichael Kruse 
1114c86a1d9SMichael Kruse char CodegenCleanup::ID;
1124c86a1d9SMichael Kruse }
1134c86a1d9SMichael Kruse 
1144c86a1d9SMichael Kruse FunctionPass *polly::createCodegenCleanupPass() { return new CodegenCleanup(); }
1154c86a1d9SMichael Kruse 
1164c86a1d9SMichael Kruse INITIALIZE_PASS_BEGIN(CodegenCleanup, "polly-cleanup",
1174c86a1d9SMichael Kruse                       "Polly - Cleanup after code generation", false, false)
1184c86a1d9SMichael Kruse INITIALIZE_PASS_END(CodegenCleanup, "polly-cleanup",
1194c86a1d9SMichael Kruse                     "Polly - Cleanup after code generation", false, false)
120