1 //===---- Canonicalization.cpp - Run canonicalization passes --------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Run the set of default canonicalization passes. 11 // 12 // This pass is mainly used for debugging. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "polly/Canonicalization.h" 17 #include "polly/LinkAllPasses.h" 18 #include "polly/Options.h" 19 #include "llvm/Transforms/IPO.h" 20 #include "llvm/Transforms/Scalar.h" 21 #include "llvm/Transforms/Utils.h" 22 23 using namespace llvm; 24 using namespace polly; 25 26 static cl::opt<bool> 27 PollyInliner("polly-run-inliner", 28 cl::desc("Run an early inliner pass before Polly"), cl::Hidden, 29 cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); 30 31 void polly::registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM) { 32 bool UseMemSSA = true; 33 PM.add(polly::createRewriteByrefParamsPass()); 34 PM.add(llvm::createPromoteMemoryToRegisterPass()); 35 PM.add(llvm::createEarlyCSEPass(UseMemSSA)); 36 PM.add(llvm::createInstructionCombiningPass()); 37 PM.add(llvm::createCFGSimplificationPass()); 38 PM.add(llvm::createTailCallEliminationPass()); 39 PM.add(llvm::createCFGSimplificationPass()); 40 PM.add(llvm::createReassociatePass()); 41 PM.add(llvm::createLoopRotatePass()); 42 if (PollyInliner) { 43 PM.add(llvm::createFunctionInliningPass(200)); 44 PM.add(llvm::createPromoteMemoryToRegisterPass()); 45 PM.add(llvm::createCFGSimplificationPass()); 46 PM.add(llvm::createInstructionCombiningPass()); 47 PM.add(createBarrierNoopPass()); 48 } 49 PM.add(llvm::createInstructionCombiningPass()); 50 PM.add(llvm::createIndVarSimplifyPass()); 51 PM.add(polly::createCodePreparationPass()); 52 } 53 54 namespace { 55 class PollyCanonicalize : public ModulePass { 56 PollyCanonicalize(const PollyCanonicalize &) = delete; 57 const PollyCanonicalize &operator=(const PollyCanonicalize &) = delete; 58 59 public: 60 static char ID; 61 62 explicit PollyCanonicalize() : ModulePass(ID) {} 63 ~PollyCanonicalize(); 64 65 /// @name FunctionPass interface. 66 //@{ 67 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 68 virtual void releaseMemory(); 69 virtual bool runOnModule(Module &M); 70 virtual void print(raw_ostream &OS, const Module *) const; 71 //@} 72 }; 73 } // namespace 74 75 PollyCanonicalize::~PollyCanonicalize() {} 76 77 void PollyCanonicalize::getAnalysisUsage(AnalysisUsage &AU) const {} 78 79 void PollyCanonicalize::releaseMemory() {} 80 81 bool PollyCanonicalize::runOnModule(Module &M) { 82 legacy::PassManager PM; 83 registerCanonicalicationPasses(PM); 84 PM.run(M); 85 86 return true; 87 } 88 89 void PollyCanonicalize::print(raw_ostream &OS, const Module *) const {} 90 91 char PollyCanonicalize::ID = 0; 92 93 Pass *polly::createPollyCanonicalizePass() { return new PollyCanonicalize(); } 94 95 INITIALIZE_PASS_BEGIN(PollyCanonicalize, "polly-canonicalize", 96 "Polly - Run canonicalization passes", false, false) 97 INITIALIZE_PASS_END(PollyCanonicalize, "polly-canonicalize", 98 "Polly - Run canonicalization passes", false, false) 99