1
- #ifndef POlYGEIST_PASSES
1
+ #ifndef POLYGEIST_PASSES
2
2
#define POLYGEIST_PASSES
3
3
4
4
include "mlir/Pass/PassBase.td"
5
+ include "mlir/Rewrite/PassUtil.td"
5
6
6
7
def AffineCFG : Pass<"affine-cfg"> {
7
8
let summary = "Replace scf.if and similar with affine.if";
8
9
let constructor = "mlir::polygeist::replaceAffineCFGPass()";
9
10
}
10
11
11
- def Mem2Reg : Pass<"mem2reg"> {
12
+ def PolygeistMem2Reg : Pass<"polygeist- mem2reg"> {
12
13
let summary = "Replace scf.if and similar with affine.if";
13
- let constructor = "mlir::polygeist::createMem2RegPass ()";
14
+ let constructor = "mlir::polygeist::createPolygeistMem2RegPass ()";
14
15
}
15
16
16
17
def SCFParallelLoopUnroll : Pass<"scf-parallel-loop-unroll"> {
17
18
let summary = "Unroll and interleave scf parallel loops";
18
- let dependentDialects =
19
- ["::mlir::scf::SCFDialect"];
19
+ let dependentDialects = [
20
+ "scf::SCFDialect",
21
+ "arith::ArithDialect",
22
+ ];
20
23
let constructor = "mlir::polygeist::createSCFParallelLoopUnrollPass()";
21
24
let options = [
22
25
Option<"unrollFactor", "unrollFactor", "int", /*default=*/"2", "Unroll factor">
@@ -37,8 +40,10 @@ def LowerAlternatives : Pass<"lower-alternatives", "mlir::ModuleOp"> {
37
40
38
41
def ConvertCudaRTtoCPU : Pass<"convert-cudart-to-cpu", "mlir::ModuleOp"> {
39
42
let summary = "Lower cudart functions to cpu versions";
40
- let dependentDialects =
41
- ["memref::MemRefDialect", "func::FuncDialect", "LLVM::LLVMDialect"];
43
+ let dependentDialects = [
44
+ "memref::MemRefDialect", "func::FuncDialect", "LLVM::LLVMDialect",
45
+ "cf::ControlFlowDialect",
46
+ ];
42
47
let constructor = "mlir::polygeist::createConvertCudaRTtoCPUPass()";
43
48
}
44
49
@@ -64,8 +69,14 @@ def ConvertCudaRTtoHipRT : Pass<"convert-cudart-to-gpu", "mlir::ModuleOp"> {
64
69
65
70
def ParallelLower : Pass<"parallel-lower", "mlir::ModuleOp"> {
66
71
let summary = "Lower gpu launch op to parallel ops";
67
- let dependentDialects =
68
- ["memref::MemRefDialect", "func::FuncDialect", "LLVM::LLVMDialect"];
72
+ let dependentDialects = [
73
+ "scf::SCFDialect",
74
+ "polygeist::PolygeistDialect",
75
+ "cf::ControlFlowDialect",
76
+ "memref::MemRefDialect",
77
+ "func::FuncDialect",
78
+ "LLVM::LLVMDialect",
79
+ ];
69
80
let constructor = "mlir::polygeist::createParallelLowerPass()";
70
81
}
71
82
@@ -87,7 +98,7 @@ def SCFCPUify : Pass<"cpuify"> {
87
98
def ConvertParallelToGPU1 : Pass<"convert-parallel-to-gpu1"> {
88
99
let summary = "Convert parallel loops to gpu";
89
100
let constructor = "mlir::polygeist::createConvertParallelToGPUPass1()";
90
- let dependentDialects = ["func::FuncDialect", "LLVM::LLVMDialect", "memref::MemRefDialect"];
101
+ let dependentDialects = ["func::FuncDialect", "LLVM::LLVMDialect", "memref::MemRefDialect", "gpu::GPUDialect" ];
91
102
let options = [
92
103
Option<"arch", "arch", "std::string", /*default=*/"\"sm_60\"", "Target GPU architecture">
93
104
];
@@ -96,7 +107,13 @@ def ConvertParallelToGPU1 : Pass<"convert-parallel-to-gpu1"> {
96
107
def ConvertParallelToGPU2 : Pass<"convert-parallel-to-gpu2"> {
97
108
let summary = "Convert parallel loops to gpu";
98
109
let constructor = "mlir::polygeist::createConvertParallelToGPUPass2()";
99
- let dependentDialects = ["func::FuncDialect", "LLVM::LLVMDialect", "memref::MemRefDialect"];
110
+ let dependentDialects = ["func::FuncDialect", "LLVM::LLVMDialect", "memref::MemRefDialect", "gpu::GPUDialect"];
111
+ }
112
+
113
+ def ConvertToOpaquePtrPass : Pass<"convert-to-opaque-ptr"> {
114
+ let summary = "Convert typed llvm pointers to opaque";
115
+ let constructor = "mlir::polygeist::createConvertToOpaquePtrPass()";
116
+ let dependentDialects = ["LLVM::LLVMDialect"];
100
117
}
101
118
102
119
def MergeGPUModulesPass : Pass<"merge-gpu-modules", "mlir::ModuleOp"> {
@@ -111,6 +128,7 @@ def InnerSerialization : Pass<"inner-serialize"> {
111
128
let dependentDialects =
112
129
["memref::MemRefDialect", "func::FuncDialect", "LLVM::LLVMDialect"];
113
130
}
131
+
114
132
def Serialization : Pass<"serialize"> {
115
133
let summary = "remove scf.barrier";
116
134
let constructor = "mlir::polygeist::createSerializationPass()";
@@ -127,18 +145,28 @@ def SCFBarrierRemovalContinuation : InterfacePass<"barrier-removal-continuation"
127
145
def SCFRaiseToAffine : Pass<"raise-scf-to-affine"> {
128
146
let summary = "Raise SCF to affine";
129
147
let constructor = "mlir::polygeist::createRaiseSCFToAffinePass()";
130
- let dependentDialects = ["AffineDialect"];
148
+ let dependentDialects = [
149
+ "affine::AffineDialect",
150
+ "scf::SCFDialect",
151
+ ];
131
152
}
132
153
133
154
def SCFCanonicalizeFor : Pass<"canonicalize-scf-for"> {
134
155
let summary = "Run some additional canonicalization for scf::for";
135
156
let constructor = "mlir::polygeist::createCanonicalizeForPass()";
157
+ let dependentDialects = [
158
+ "scf::SCFDialect",
159
+ "math::MathDialect",
160
+ ];
136
161
}
137
162
138
163
def ForBreakToWhile : Pass<"for-break-to-while"> {
139
164
let summary = "Rewrite scf.for(scf.if) to scf.while";
140
165
let constructor = "mlir::polygeist::createForBreakToWhilePass()";
141
- let dependentDialects = ["arith::ArithDialect"];
166
+ let dependentDialects = [
167
+ "arith::ArithDialect",
168
+ "cf::ControlFlowDialect",
169
+ ];
142
170
}
143
171
144
172
def ParallelLICM : Pass<"parallel-licm"> {
@@ -149,11 +177,48 @@ def ParallelLICM : Pass<"parallel-licm"> {
149
177
def OpenMPOptPass : Pass<"openmp-opt"> {
150
178
let summary = "Optimize OpenMP";
151
179
let constructor = "mlir::polygeist::createOpenMPOptPass()";
180
+ let dependentDialects = [
181
+ "memref::MemRefDialect",
182
+ "omp::OpenMPDialect",
183
+ "LLVM::LLVMDialect",
184
+ ];
185
+ }
186
+
187
+ def PolygeistCanonicalize : Pass<"canonicalize-polygeist"> {
188
+ let constructor = "mlir::polygeist::createPolygeistCanonicalizePass()";
189
+ let dependentDialects = [
190
+ "func::FuncDialect",
191
+ "LLVM::LLVMDialect",
192
+ "memref::MemRefDialect",
193
+ "gpu::GPUDialect",
194
+ "arith::ArithDialect",
195
+ "cf::ControlFlowDialect",
196
+ "scf::SCFDialect",
197
+ "polygeist::PolygeistDialect",
198
+ ];
199
+ let options = [
200
+ Option<"topDownProcessingEnabled", "top-down", "bool",
201
+ /*default=*/"true",
202
+ "Seed the worklist in general top-down order">,
203
+ Option<"enableRegionSimplification", "region-simplify", "bool",
204
+ /*default=*/"true",
205
+ "Perform control flow optimizations to the region tree">,
206
+ Option<"maxIterations", "max-iterations", "int64_t",
207
+ /*default=*/"10",
208
+ "Max. iterations between applying patterns / simplifying regions">,
209
+ Option<"maxNumRewrites", "max-num-rewrites", "int64_t", /*default=*/"-1",
210
+ "Max. number of pattern rewrites within an iteration">,
211
+ Option<"testConvergence", "test-convergence", "bool", /*default=*/"false",
212
+ "Test only: Fail pass on non-convergence to detect cyclic pattern">
213
+ ] # RewritePassUtils.options;
152
214
}
153
215
154
216
def LoopRestructure : Pass<"loop-restructure"> {
155
217
let constructor = "mlir::polygeist::createLoopRestructurePass()";
156
- let dependentDialects = ["::mlir::scf::SCFDialect"];
218
+ let dependentDialects = [
219
+ "scf::SCFDialect",
220
+ "polygeist::PolygeistDialect",
221
+ ];
157
222
}
158
223
159
224
def RemoveTrivialUse : Pass<"trivialuse"> {
@@ -188,7 +253,16 @@ def ConvertPolygeistToLLVM : Pass<"convert-polygeist-to-llvm", "mlir::ModuleOp">
188
253
LLVM IR types.
189
254
}];
190
255
let constructor = "mlir::polygeist::createConvertPolygeistToLLVMPass()";
191
- let dependentDialects = ["LLVM::LLVMDialect"];
256
+ let dependentDialects = [
257
+ "polygeist::PolygeistDialect",
258
+ "func::FuncDialect",
259
+ "LLVM::LLVMDialect",
260
+ "memref::MemRefDialect",
261
+ "gpu::GPUDialect",
262
+ "arith::ArithDialect",
263
+ "cf::ControlFlowDialect",
264
+ "scf::SCFDialect",
265
+ ];
192
266
let options = [
193
267
Option<"useBarePtrCallConv", "use-bare-ptr-memref-call-conv", "bool",
194
268
/*default=*/"false",
0 commit comments