llvm-project/mlir/test/Bytecode/bytecode-lazy-loading.mlir
River Riddle 4af01bf956 [mlir:bytecode] Support lazy loading dynamically isolated regions
We currently only support lazy loading for regions that
statically implement the IsolatedFromAbove trait, but that
limits the amount of operations that can be lazily loaded. This review
lifts that restriction by computing which operations have isolated
regions when numbering, allowing any operation to be lazily loaded
as long as it doesn't use values defined above.

Differential Revision: https://reviews.llvm.org/D156199
2023-07-25 15:55:34 -07:00

111 lines
3.2 KiB
MLIR

// RUN: mlir-opt --pass-pipeline="builtin.module(test-lazy-loading)" %s -o %t | FileCheck %s
// RUN: mlir-opt --pass-pipeline="builtin.module(test-lazy-loading{bytecode-version=1})" %s -o %t | FileCheck %s --check-prefix=OLD-BYTECODE
func.func @op_with_passthrough_region_args() {
%0 = arith.constant 10 : index
// Ensure we can handle nested non-isolated/non-lazy regions.
"test.one_region_op"() ({
"test.consumer"(%0) : (index) -> ()
}) : () -> ()
test.isolated_region %0 {
"test.consumer"(%0) : (index) -> ()
}
%result:2 = "test.op"() : () -> (index, index)
test.isolated_region %result#1 {
"test.consumer"(%result#1) : (index) -> ()
}
test.isolated_regions {
"test.unknown_op"() : () -> ()
}, {
"test.unknown_op"() : () -> ()
}
// Ensure operations that aren't tagged as IsolatedFromAbove can
// still be lazy loaded if they don't have references to values
// defined above.
"test.one_region_op"() ({
"test.unknown_op"() : () -> ()
}) : () -> ()
// Similar test as above, but check that if one region has a reference
// to a value defined above, we don't lazy load the operation.
"test.two_region_op"() ({
"test.unknown_op"() : () -> ()
}, {
"test.consumer"(%0) : (index) -> ()
}) : () -> ()
return
}
// Before version 2, we can't support lazy loading.
// OLD-BYTECODE-NOT: Has 1 ops to materialize
// OLD-BYTECODE-NOT: Materializing
// OLD-BYTECODE: Has 0 ops to materialize
// CHECK: Has 1 ops to materialize
// CHECK: Before Materializing...
// CHECK: "builtin.module"() ({
// CHECK-NOT: func
// CHECK: Materializing...
// CHECK: "builtin.module"() ({
// CHECK: "func.func"() <{function_type = () -> (), sym_name = "op_with_passthrough_region_args"}> ({
// CHECK-NOT: arith
// CHECK: Has 1 ops to materialize
// CHECK: Before Materializing...
// CHECK: "func.func"() <{function_type = () -> (), sym_name = "op_with_passthrough_region_args"}> ({
// CHECK-NOT: arith
// CHECK: Materializing...
// CHECK: "func.func"() <{function_type = () -> (), sym_name = "op_with_passthrough_region_args"}> ({
// CHECK: arith
// CHECK: one_region_op
// CHECK: test.consumer
// CHECK: isolated_region
// CHECK-NOT: test.consumer
// CHECK: test.one_region_op
// CHECK-NOT: test.op
// CHECK: test.two_region_op
// CHECK: test.unknown_op
// CHECK: test.consumer
// CHECK: Has 4 ops to materialize
// CHECK: Before Materializing...
// CHECK: test.isolated_region
// CHECK-NOT: test.consumer
// CHECK: Materializing...
// CHECK: test.isolated_region
// CHECK: ^bb0(%arg0: index):
// CHECK: test.consumer
// CHECK: Has 3 ops to materialize
// CHECK: Before Materializing...
// CHECK: test.isolated_region
// CHECK-NOT: test.consumer
// CHECK: Materializing...
// CHECK: test.isolated_region
// CHECK: test.consumer
// CHECK: Has 2 ops to materialize
// CHECK: Before Materializing...
// CHECK: test.isolated_regions
// CHECK-NOT: test.unknown_op
// CHECK: Materializing...
// CHECK: test.isolated_regions
// CHECK: test.unknown_op
// CHECK: test.unknown_op
// CHECK: Has 1 ops to materialize
// CHECK: Before Materializing...
// CHECK: test.one_region_op
// CHECK-NOT: test.unknown_op
// CHECK: Materializing...
// CHECK: test.one_region_op
// CHECK: test.unknown_op
// CHECK: Has 0 ops to materialize