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/LinkAllPasses.h"
17 #include "polly/Canonicalization.h"
18 #include "llvm/Transforms/Scalar.h"
19 
20 using namespace llvm;
21 using namespace polly;
22 
23 void polly::registerCanonicalicationPasses(llvm::PassManagerBase &PM,
24                                            bool SCEVCodegen) {
25   PM.add(llvm::createPromoteMemoryToRegisterPass());
26   PM.add(llvm::createInstructionCombiningPass());
27   PM.add(llvm::createCFGSimplificationPass());
28   PM.add(llvm::createTailCallEliminationPass());
29   PM.add(llvm::createCFGSimplificationPass());
30   PM.add(llvm::createReassociatePass());
31   PM.add(llvm::createLoopRotatePass());
32   PM.add(llvm::createInstructionCombiningPass());
33 
34   if (!SCEVCodegen)
35     PM.add(polly::createIndVarSimplifyPass());
36 
37   PM.add(polly::createCodePreparationPass());
38 }
39 
40 namespace {
41 class PollyCanonicalize : public ModulePass {
42   PollyCanonicalize(const PollyCanonicalize &) LLVM_DELETED_FUNCTION;
43   const PollyCanonicalize &
44   operator=(const PollyCanonicalize &) LLVM_DELETED_FUNCTION;
45 
46 public:
47   static char ID;
48 
49   explicit PollyCanonicalize() : ModulePass(ID) {}
50   ~PollyCanonicalize();
51 
52   /// @name FunctionPass interface.
53   //@{
54   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
55   virtual void releaseMemory();
56   virtual bool runOnModule(Module &M);
57   virtual void print(raw_ostream &OS, const Module *) const;
58   //@}
59 };
60 }
61 
62 PollyCanonicalize::~PollyCanonicalize() {}
63 
64 void PollyCanonicalize::getAnalysisUsage(AnalysisUsage &AU) const {}
65 
66 void PollyCanonicalize::releaseMemory() {}
67 
68 bool PollyCanonicalize::runOnModule(Module &M) {
69   PassManager PM;
70   registerCanonicalicationPasses(PM);
71   PM.run(M);
72 
73   return true;
74 }
75 
76 void PollyCanonicalize::print(raw_ostream &OS, const Module *) const {}
77 
78 char PollyCanonicalize::ID = 0;
79 
80 Pass *polly::createPollyCanonicalizePass() { return new PollyCanonicalize(); }
81 
82 INITIALIZE_PASS_BEGIN(PollyCanonicalize, "polly-canonicalize",
83                       "Polly - Run canonicalization passes", false, false)
84 INITIALIZE_PASS_END(PollyCanonicalize, "polly-canonicalize",
85                     "Polly - Run canonicalization passes", false, false)
86