1 //===- polly/LinkAllPasses.h ----------- Reference All Passes ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This header file pulls in all transformation and analysis passes for tools
10 // like opt and bugpoint that need this functionality.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef POLLY_LINKALLPASSES_H
15 #define POLLY_LINKALLPASSES_H
16 
17 #include "polly/CodeGen/PPCGCodeGeneration.h"
18 #include "polly/Config/config.h"
19 #include "polly/Support/DumpFunctionPass.h"
20 #include "polly/Support/DumpModulePass.h"
21 #include "llvm/ADT/StringRef.h"
22 #include <cstdlib>
23 
24 namespace llvm {
25 class Pass;
26 class PassRegistry;
27 } // namespace llvm
28 
29 namespace polly {
30 llvm::Pass *createCodePreparationPass();
31 llvm::Pass *createScopInlinerPass();
32 llvm::Pass *createDeadCodeElimWrapperPass();
33 llvm::Pass *createDependenceInfoPass();
34 llvm::Pass *createDependenceInfoWrapperPassPass();
35 llvm::Pass *createDOTOnlyPrinterPass();
36 llvm::Pass *createDOTOnlyViewerPass();
37 llvm::Pass *createDOTPrinterPass();
38 llvm::Pass *createDOTViewerPass();
39 llvm::Pass *createJSONExporterPass();
40 llvm::Pass *createJSONImporterPass();
41 llvm::Pass *createPollyCanonicalizePass();
42 llvm::Pass *createPolyhedralInfoPass();
43 llvm::Pass *createScopDetectionWrapperPassPass();
44 llvm::Pass *createScopInfoRegionPassPass();
45 llvm::Pass *createScopInfoWrapperPassPass();
46 llvm::Pass *createRewriteByrefParamsWrapperPass();
47 llvm::Pass *createIslAstInfoWrapperPassPass();
48 llvm::Pass *createCodeGenerationPass();
49 #ifdef GPU_CODEGEN
50 llvm::Pass *createPPCGCodeGenerationPass(GPUArch Arch = GPUArch::NVPTX64,
51                                          GPURuntime Runtime = GPURuntime::CUDA);
52 
53 llvm::Pass *
54 createManagedMemoryRewritePassPass(GPUArch Arch = GPUArch::NVPTX64,
55                                    GPURuntime Runtime = GPURuntime::CUDA);
56 #endif
57 llvm::Pass *createIslScheduleOptimizerWrapperPass();
58 llvm::Pass *createFlattenSchedulePass();
59 llvm::Pass *createForwardOpTreeWrapperPass();
60 llvm::Pass *createDeLICMWrapperPass();
61 llvm::Pass *createMaximalStaticExpansionPass();
62 llvm::Pass *createSimplifyWrapperPass(int);
63 llvm::Pass *createPruneUnprofitableWrapperPass();
64 
65 extern char &CodePreparationID;
66 } // namespace polly
67 
68 namespace {
69 struct PollyForcePassLinking {
PollyForcePassLinkingPollyForcePassLinking70   PollyForcePassLinking() {
71     // We must reference the passes in such a way that compilers will not
72     // delete it all as dead code, even with whole program optimization,
73     // yet is effectively a NO-OP. As the compiler isn't smart enough
74     // to know that getenv() never returns -1, this will do the job.
75     if (std::getenv("bar") != (char *)-1)
76       return;
77 
78     polly::createCodePreparationPass();
79     polly::createDeadCodeElimWrapperPass();
80     polly::createDependenceInfoPass();
81     polly::createDOTOnlyPrinterPass();
82     polly::createDOTOnlyViewerPass();
83     polly::createDOTPrinterPass();
84     polly::createDOTViewerPass();
85     polly::createJSONExporterPass();
86     polly::createJSONImporterPass();
87     polly::createScopDetectionWrapperPassPass();
88     polly::createScopInfoRegionPassPass();
89     polly::createPollyCanonicalizePass();
90     polly::createPolyhedralInfoPass();
91     polly::createRewriteByrefParamsWrapperPass();
92     polly::createIslAstInfoWrapperPassPass();
93     polly::createCodeGenerationPass();
94 #ifdef GPU_CODEGEN
95     polly::createPPCGCodeGenerationPass();
96     polly::createManagedMemoryRewritePassPass();
97 #endif
98     polly::createIslScheduleOptimizerWrapperPass();
99     polly::createMaximalStaticExpansionPass();
100     polly::createFlattenSchedulePass();
101     polly::createForwardOpTreeWrapperPass();
102     polly::createDeLICMWrapperPass();
103     polly::createDumpModuleWrapperPass("", true);
104     polly::createDumpFunctionWrapperPass("");
105     polly::createSimplifyWrapperPass(0);
106     polly::createPruneUnprofitableWrapperPass();
107   }
108 } PollyForcePassLinking; // Force link by creating a global definition.
109 } // namespace
110 
111 namespace llvm {
112 class PassRegistry;
113 void initializeCodePreparationPass(llvm::PassRegistry &);
114 void initializeScopInlinerPass(llvm::PassRegistry &);
115 void initializeDeadCodeElimWrapperPassPass(llvm::PassRegistry &);
116 void initializeJSONExporterPass(llvm::PassRegistry &);
117 void initializeJSONImporterPass(llvm::PassRegistry &);
118 void initializeIslAstInfoWrapperPassPass(llvm::PassRegistry &);
119 void initializeCodeGenerationPass(llvm::PassRegistry &);
120 void initializeRewriteByrefParamsWrapperPassPass(llvm::PassRegistry &);
121 #ifdef GPU_CODEGEN
122 void initializePPCGCodeGenerationPass(llvm::PassRegistry &);
123 void initializeManagedMemoryRewritePassPass(llvm::PassRegistry &);
124 #endif
125 void initializeIslScheduleOptimizerWrapperPassPass(llvm::PassRegistry &);
126 void initializeMaximalStaticExpanderPass(llvm::PassRegistry &);
127 void initializePollyCanonicalizePass(llvm::PassRegistry &);
128 void initializeFlattenSchedulePass(llvm::PassRegistry &);
129 void initializeForwardOpTreeWrapperPassPass(llvm::PassRegistry &);
130 void initializeDeLICMWrapperPassPass(llvm::PassRegistry &);
131 void initializeSimplifyWrapperPassPass(llvm::PassRegistry &);
132 void initializePruneUnprofitableWrapperPassPass(llvm::PassRegistry &);
133 } // namespace llvm
134 
135 #endif
136