File tree Expand file tree Collapse file tree 8 files changed +41
-25
lines changed Expand file tree Collapse file tree 8 files changed +41
-25
lines changed Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ stream.executable public @add_dispatch_0 {
47
47
// CHECK-SAME: interface = @io,
48
48
// CHECK-SAME: ordinal = 0 : index
49
49
// CHECK-SAME: }
50
- // CHECK: module {
50
+ // CHECK: module attributes {vm.toplevel} {
51
51
// CHECK-NEXT: vm.module public @module {
52
52
// CHECK-NEXT: vm.func private @add_dispatch_0(
53
53
// CHECK-SAME: %[[SCRATCHPAD:.+]]: !vm.buffer, %[[CONSTANTS:.+]]: !vm.buffer,
Original file line number Diff line number Diff line change @@ -24,18 +24,25 @@ VMConversionTarget::nestModuleForConversion(mlir::ModuleOp outerModuleOp) {
24
24
outerModuleOp.getBodyRegion ().getBlocks ().push_back (new Block ());
25
25
outerModuleOp.push_back (innerModuleOp);
26
26
}
27
+
28
+ outerModuleOp->setAttr (" vm.toplevel" ,
29
+ UnitAttr::get (outerModuleOp.getContext ()));
27
30
return std::make_pair (outerModuleOp, innerModuleOp);
28
31
}
29
32
33
+ // static
34
+ bool VMConversionTarget::isTopLevelModule (mlir::ModuleOp moduleOp) {
35
+ return !moduleOp->getParentOp () || moduleOp->hasAttr (" vm.toplevel" );
36
+ }
37
+
30
38
VMConversionTarget::VMConversionTarget (MLIRContext *context)
31
39
: ConversionTarget(*context) {
32
40
addLegalDialect<IREE::VM::VMDialect>();
33
41
34
42
// NOTE: we need to allow the outermost std.module to be legal to support the
35
43
// double-nesting (module { vm.module { ... } }).
36
- addDynamicallyLegalOp<mlir::ModuleOp>(+[](mlir::ModuleOp op) {
37
- return !op->getParentOp () || !isa<ModuleOp>(op->getParentOp ());
38
- });
44
+ addDynamicallyLegalOp<mlir::ModuleOp>(
45
+ +[](mlir::ModuleOp op) { return isTopLevelModule (op); });
39
46
}
40
47
41
48
} // namespace iree_compiler
Original file line number Diff line number Diff line change @@ -27,10 +27,14 @@ class VMConversionTarget : public ConversionTarget {
27
27
// Example:
28
28
// module { func @foo() { ... } }
29
29
// ->
30
- // module { module { func @foo() { ... } } }
30
+ // module attributes {vm.toplevel} { module { func @foo() { ... } } }
31
31
static std::pair<mlir::ModuleOp, mlir::ModuleOp> nestModuleForConversion (
32
32
mlir::ModuleOp outerModuleOp);
33
33
34
+ // Returns whether this is the outer module as setup via
35
+ // nestModuleForConversion. Use for patterns which need to distinguish.
36
+ static bool isTopLevelModule (mlir::ModuleOp moduleOp);
37
+
34
38
VMConversionTarget (MLIRContext *context);
35
39
};
36
40
Original file line number Diff line number Diff line change 7
7
#include " iree/compiler/Dialect/VM/Conversion/StandardToVM/ConvertStandardToVM.h"
8
8
9
9
#include " iree/compiler/Dialect/Util/IR/UtilTypes.h"
10
+ #include " iree/compiler/Dialect/VM/Conversion/ConversionTarget.h"
10
11
#include " iree/compiler/Dialect/VM/Conversion/TargetOptions.h"
11
12
#include " iree/compiler/Dialect/VM/Conversion/TypeConverter.h"
12
13
#include " iree/compiler/Dialect/VM/IR/VMOps.h"
@@ -32,7 +33,7 @@ class ModuleOpConversion : public OpConversionPattern<ModuleOp> {
32
33
ConversionPatternRewriter &rewriter) const override {
33
34
// Do not attempt to convert the top level module.
34
35
// This mechanism can only support rewriting non top-level modules.
35
- if (!srcOp-> getParentOp () || !isa<ModuleOp>( srcOp-> getParentOp () )) {
36
+ if (VMConversionTarget::isTopLevelModule ( srcOp)) {
36
37
return failure ();
37
38
}
38
39
Original file line number Diff line number Diff line change @@ -24,6 +24,7 @@ iree_lit_test_suite(
24
24
"control_flow_ops.mlir" ,
25
25
"conversion_ops.mlir" ,
26
26
"func_attrs.mlir" ,
27
+ "nesting.mlir" ,
27
28
"structural_ops.mlir" ,
28
29
],
29
30
include = ["*.mlir" ],
Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ iree_lit_test_suite(
21
21
"control_flow_ops.mlir"
22
22
"conversion_ops.mlir"
23
23
"func_attrs.mlir"
24
+ "nesting.mlir"
24
25
"structural_ops.mlir"
25
26
DATA
26
27
iree::tools::IreeFileCheck
Original file line number Diff line number Diff line change
1
+ // RUN: iree-opt -split-input-file -pass-pipeline='builtin.module(test-iree-convert-std-to-vm)' %s | IreeFileCheck %s
2
+
3
+ // Note that checks are ambiguous between "module" and "vm.module" so we rely
4
+ // on vm.module printing as `vm.module public @foo`
5
+
6
+ // CHECK-LABEL: module @outerBuiltinModule
7
+ module @outerBuiltinModule {
8
+ // CHECK-NEXT: module @innerBuiltinModule attributes {vm.toplevel}
9
+ module @innerBuiltinModule attributes {vm.toplevel } {
10
+ // CHECK-NEXT: vm.module public @outerVmModule
11
+ module @outerVmModule {
12
+ // CHECK-NEXT: vm.module public @deeplyNested
13
+ module @deeplyNested {
14
+ // CHECK: vm.func private @foo
15
+ func @foo () {
16
+ return
17
+ }
18
+ }
19
+ }
20
+ }
21
+ }
Original file line number Diff line number Diff line change @@ -40,22 +40,3 @@ module {
40
40
}
41
41
42
42
}
43
-
44
- // -----
45
-
46
- // CHECK: module
47
- module {
48
- // CHECK: module
49
- module {
50
- // CHECK: module
51
- module {
52
- // CHECK-LABEL: vm.module public @deeplyNested
53
- module @deeplyNested {
54
- // CHECK: vm.func private @foo
55
- func @foo () {
56
- return
57
- }
58
- }
59
- }
60
- }
61
- }
You can’t perform that action at this time.
0 commit comments