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