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 
22 using namespace llvm;
23 using namespace polly;
24 
25 static cl::opt<bool>
26     PollyInliner("polly-run-inliner",
27                  cl::desc("Run an early inliner pass before Polly"), cl::Hidden,
28                  cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
29 
30 void polly::registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM) {
31   PM.add(llvm::createPromoteMemoryToRegisterPass());
32   PM.add(llvm::createInstructionCombiningPass());
33   PM.add(llvm::createCFGSimplificationPass());
34   PM.add(llvm::createTailCallEliminationPass());
35   PM.add(llvm::createCFGSimplificationPass());
36   PM.add(llvm::createReassociatePass());
37   PM.add(llvm::createLoopRotatePass());
38   if (PollyInliner) {
39     PM.add(llvm::createFunctionInliningPass(200));
40     PM.add(llvm::createCFGSimplificationPass());
41     PM.add(llvm::createInstructionCombiningPass());
42     PM.add(createBarrierNoopPass());
43   }
44   PM.add(llvm::createInstructionCombiningPass());
45   PM.add(llvm::createIndVarSimplifyPass());
46   PM.add(polly::createCodePreparationPass());
47 }
48 
49 namespace {
50 class PollyCanonicalize : public ModulePass {
51   PollyCanonicalize(const PollyCanonicalize &) = delete;
52   const PollyCanonicalize &operator=(const PollyCanonicalize &) = delete;
53 
54 public:
55   static char ID;
56 
57   explicit PollyCanonicalize() : ModulePass(ID) {}
58   ~PollyCanonicalize();
59 
60   /// @name FunctionPass interface.
61   //@{
62   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
63   virtual void releaseMemory();
64   virtual bool runOnModule(Module &M);
65   virtual void print(raw_ostream &OS, const Module *) const;
66   //@}
67 };
68 } // namespace
69 
70 PollyCanonicalize::~PollyCanonicalize() {}
71 
72 void PollyCanonicalize::getAnalysisUsage(AnalysisUsage &AU) const {}
73 
74 void PollyCanonicalize::releaseMemory() {}
75 
76 bool PollyCanonicalize::runOnModule(Module &M) {
77   legacy::PassManager PM;
78   registerCanonicalicationPasses(PM);
79   PM.run(M);
80 
81   return true;
82 }
83 
84 void PollyCanonicalize::print(raw_ostream &OS, const Module *) const {}
85 
86 char PollyCanonicalize::ID = 0;
87 
88 Pass *polly::createPollyCanonicalizePass() { return new PollyCanonicalize(); }
89 
90 INITIALIZE_PASS_BEGIN(PollyCanonicalize, "polly-canonicalize",
91                       "Polly - Run canonicalization passes", false, false)
92 INITIALIZE_PASS_END(PollyCanonicalize, "polly-canonicalize",
93                     "Polly - Run canonicalization passes", false, false)
94