33#include " mlir/Conversion/AffineToStandard/AffineToStandard.h"
44#include " mlir/Conversion/BufferizationToMemRef/BufferizationToMemRef.h"
55#include " mlir/Conversion/ConvertToLLVM/ToLLVMPass.h"
6+ #include " mlir/Conversion/OpenMPToLLVM/ConvertOpenMPToLLVM.h"
67#include " mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
8+ #include " mlir/Conversion/SCFToOpenMP/SCFToOpenMP.h"
79#include " mlir/Dialect/Affine/Passes.h"
810#include " mlir/Dialect/Arith/Transforms/Passes.h"
911#include " mlir/Dialect/Bufferization/Transforms/FuncBufferizableOpInterfaceImpl.h"
@@ -41,6 +43,7 @@ void oneShotBufferize(OpPassManager &manager) {
4143 manager.addPass (createCanonicalizerPass ());
4244}
4345
46+ template <bool allowOpenMP>
4447void polyToLLVMPipelineBuilder (OpPassManager &manager) {
4548 manager.addPass (zkir::poly::createPolyToField ());
4649 manager.addPass (zkir::field::createPrimeFieldToModArith ());
@@ -49,9 +52,11 @@ void polyToLLVMPipelineBuilder(OpPassManager &manager) {
4952
5053 // Linalg
5154 manager.addNestedPass <FuncOp>(createConvertElementwiseToLinalgPass ());
55+ manager.addNestedPass <FuncOp>(createLinalgElementwiseOpFusionPass ());
5256 // Needed to lower affine.map and affine.apply
5357 manager.addNestedPass <FuncOp>(affine::createAffineExpandIndexOpsPass ());
5458 manager.addNestedPass <FuncOp>(affine::createSimplifyAffineStructuresPass ());
59+ manager.addPass (affine::createAffineParallelize ());
5560 manager.addPass (createLowerAffinePass ());
5661 manager.addNestedPass <FuncOp>(memref::createExpandOpsPass ());
5762 manager.addNestedPass <FuncOp>(memref::createExpandStridedMetadataPass ());
@@ -61,7 +66,7 @@ void polyToLLVMPipelineBuilder(OpPassManager &manager) {
6166
6267 // Linalg must be bufferized before it can be lowered
6368 // But lowering to loops also re-introduces affine.apply, so re-lower that
64- manager.addNestedPass <FuncOp>(createConvertLinalgToLoopsPass ());
69+ manager.addNestedPass <FuncOp>(createConvertLinalgToParallelLoopsPass ());
6570 manager.addPass (createLowerAffinePass ());
6671 manager.addPass (createBufferizationToMemRefPass ());
6772
@@ -73,13 +78,17 @@ void polyToLLVMPipelineBuilder(OpPassManager &manager) {
7378
7479 // ToLLVM
7580 manager.addPass (arith::createArithExpandOpsPass ());
81+ if constexpr (allowOpenMP) {
82+ manager.addPass (createConvertSCFToOpenMPPass ());
83+ }
7684 manager.addPass (createConvertSCFToCFPass ());
7785 manager.addNestedPass <FuncOp>(memref::createExpandStridedMetadataPass ());
7886
7987 // expand strided metadata will create affine map. Needed to lower affine.map
8088 // and affine.apply
8189 manager.addNestedPass <FuncOp>(affine::createAffineExpandIndexOpsPass ());
8290 manager.addNestedPass <FuncOp>(affine::createSimplifyAffineStructuresPass ());
91+ manager.addPass (affine::createAffineParallelize ());
8392 manager.addPass (createLowerAffinePass ());
8493 manager.addPass (createConvertToLLVMPass ());
8594
@@ -90,4 +99,7 @@ void polyToLLVMPipelineBuilder(OpPassManager &manager) {
9099 manager.addPass (createSymbolDCEPass ());
91100}
92101
102+ template void polyToLLVMPipelineBuilder<false >(mlir::OpPassManager &manager);
103+ template void polyToLLVMPipelineBuilder<true >(mlir::OpPassManager &manager);
104+
93105} // namespace mlir::zkir::pipelines
0 commit comments