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