14
14
15
15
#include " mlir/Conversion/FuncToEmitC/FuncToEmitC.h"
16
16
#include " mlir/Dialect/EmitC/IR/EmitC.h"
17
+ #include " mlir/Dialect/EmitC/Transforms/TypeConversions.h"
17
18
#include " mlir/Dialect/Func/IR/FuncOps.h"
19
+ #include " mlir/Dialect/Func/Transforms/FuncConversions.h"
18
20
#include " mlir/Pass/Pass.h"
19
21
#include " mlir/Transforms/DialectConversion.h"
22
+ #include < algorithm>
20
23
21
24
namespace mlir {
22
25
#define GEN_PASS_DEF_CONVERTFUNCTOEMITC
@@ -33,6 +36,51 @@ struct ConvertFuncToEmitC
33
36
} // namespace
34
37
35
38
void ConvertFuncToEmitC::runOnOperation () {
39
+ // Convert function interface types within the func dialect first to supported
40
+ // EmitC types
41
+ ConversionTarget interfaceConversionTarget (getContext ());
42
+ interfaceConversionTarget.addDynamicallyLegalOp <func::CallOp>(
43
+ [](func::CallOp op) {
44
+ auto operandTypes = op->getOperandTypes ();
45
+ if (std::any_of (operandTypes.begin (), operandTypes.end (),
46
+ [](Type t) { return isa<IndexType>(t); }))
47
+ return false ;
48
+ auto resultTypes = op.getResultTypes ();
49
+ return !(std::any_of (resultTypes.begin (), resultTypes.end (),
50
+ [](Type t) { return isa<IndexType>(t); }));
51
+ });
52
+ interfaceConversionTarget.addDynamicallyLegalOp <func::FuncOp>(
53
+ [](func::FuncOp op) {
54
+ auto operandTypes = op->getOperandTypes ();
55
+ if (std::any_of (operandTypes.begin (), operandTypes.end (),
56
+ [](Type t) { return isa<IndexType>(t); }))
57
+ return false ;
58
+ auto resultTypes = op.getResultTypes ();
59
+ return !(std::any_of (resultTypes.begin (), resultTypes.end (),
60
+ [](Type t) { return isa<IndexType>(t); }));
61
+ });
62
+ interfaceConversionTarget.addDynamicallyLegalOp <func::ReturnOp>(
63
+ [](func::ReturnOp op) {
64
+ auto operandTypes = op->getOperandTypes ();
65
+ return !(std::any_of (operandTypes.begin (), operandTypes.end (),
66
+ [](Type t) { return isa<IndexType>(t); }));
67
+ });
68
+
69
+ RewritePatternSet interfaceRewritePatterns (&getContext ());
70
+ TypeConverter typeConverter;
71
+ typeConverter.addConversion ([](Type type) { return type; });
72
+ populateEmitCSizeTypeConversionPatterns (typeConverter);
73
+ populateReturnOpTypeConversionPattern (interfaceRewritePatterns,
74
+ typeConverter);
75
+ populateCallOpTypeConversionPattern (interfaceRewritePatterns, typeConverter);
76
+ populateFunctionOpInterfaceTypeConversionPattern<func::FuncOp>(
77
+ interfaceRewritePatterns, typeConverter);
78
+
79
+ if (failed (applyPartialConversion (getOperation (), interfaceConversionTarget,
80
+ std::move (interfaceRewritePatterns))))
81
+ signalPassFailure ();
82
+
83
+ // Then convert the func ops themselves to EmitC
36
84
ConversionTarget target (getContext ());
37
85
38
86
target.addLegalDialect <emitc::EmitCDialect>();
0 commit comments