-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathtutorial-opt.cpp
More file actions
79 lines (67 loc) · 3.39 KB
/
tutorial-opt.cpp
File metadata and controls
79 lines (67 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "lib/Conversion/PolyToStandard/PolyToStandard.h"
#include "lib/Dialect/Noisy/NoisyDialect.h"
#include "lib/Dialect/Poly/PolyDialect.h"
#include "lib/Transform/Affine/Passes.h"
#include "lib/Transform/Arith/Passes.h"
#include "lib/Transform/Noisy/Passes.h"
#include "mlir/include/mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
#include "mlir/include/mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
#include "mlir/include/mlir/Conversion/FuncToLLVM/ConvertFuncToLLVMPass.h"
#include "mlir/include/mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
#include "mlir/include/mlir/Conversion/TensorToLinalg/TensorToLinalgPass.h"
#include "mlir/include/mlir/Dialect/Bufferization/Pipelines/Passes.h"
#include "mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.h"
#include "mlir/include/mlir/Dialect/Linalg/Passes.h"
#include "mlir/include/mlir/InitAllDialects.h"
#include "mlir/include/mlir/InitAllPasses.h"
#include "mlir/include/mlir/Pass/PassManager.h"
#include "mlir/include/mlir/Pass/PassRegistry.h"
#include "mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h"
#include "mlir/include/mlir/Transforms/Passes.h"
void polyToLLVMPipelineBuilder(mlir::OpPassManager &manager) {
// Poly
manager.addPass(mlir::tutorial::poly::createPolyToStandard());
manager.addPass(mlir::createCanonicalizerPass());
manager.addPass(mlir::createConvertElementwiseToLinalgPass());
manager.addPass(mlir::createConvertTensorToLinalgPass());
// One-shot bufferize, from
// https://mlir.llvm.org/docs/Bufferization/#ownership-based-buffer-deallocation
mlir::bufferization::OneShotBufferizePassOptions bufferizationOptions;
bufferizationOptions.bufferizeFunctionBoundaries = true;
manager.addPass(
mlir::bufferization::createOneShotBufferizePass(bufferizationOptions));
mlir::bufferization::BufferDeallocationPipelineOptions deallocationOptions;
mlir::bufferization::buildBufferDeallocationPipeline(manager,
deallocationOptions);
manager.addPass(mlir::createConvertLinalgToLoopsPass());
// Needed to lower memref.subview
// manager.addPass(mlir::memref::createExpandStridedMetadataPass());
manager.addPass(mlir::createSCFToControlFlowPass());
manager.addPass(mlir::createConvertControlFlowToLLVMPass());
manager.addPass(mlir::createArithToLLVMConversionPass());
manager.addPass(mlir::createConvertFuncToLLVMPass());
// manager.addPass(mlir::createFinalizeMemRefToLLVMConversionPass());
// manager.addPass(mlir::createReconcileUnrealizedCastsPass());
// Cleanup
manager.addPass(mlir::createCanonicalizerPass());
manager.addPass(mlir::createSCCPPass());
manager.addPass(mlir::createCSEPass());
manager.addPass(mlir::createSymbolDCEPass());
}
int main(int argc, char **argv) {
mlir::DialectRegistry registry;
registry.insert<mlir::tutorial::poly::PolyDialect>();
registry.insert<mlir::tutorial::noisy::NoisyDialect>();
mlir::registerAllDialects(registry);
mlir::registerAllPasses();
mlir::tutorial::registerAffinePasses();
mlir::tutorial::registerArithPasses();
mlir::tutorial::noisy::registerNoisyPasses();
// Dialect conversion passes
mlir::tutorial::poly::registerPolyToStandardPasses();
mlir::PassPipelineRegistration<>(
"poly-to-llvm", "Run passes to lower the poly dialect to LLVM",
polyToLLVMPipelineBuilder);
return mlir::asMainReturnCode(
mlir::MlirOptMain(argc, argv, "Tutorial Pass Driver", registry));
}