Files
clang-p2996/mlir/test/Dialect/Async/async-runtime-ref-counting-opt.mlir
Eugene Zhulenev 9ccdaac8f9 [mlir:Async] Fix a bug in automatic refence counting around function calls
Depends On D104998

Function calls "transfer ownership" to the callee and it puts additional constraints on the reference counting optimization pass

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D104999
2021-06-29 09:35:43 -07:00

70 lines
2.4 KiB
MLIR

// RUN: mlir-opt %s -async-runtime-ref-counting-opt | FileCheck %s
func private @consume_token(%arg0: !async.token)
// CHECK-LABEL: @cancellable_operations_0
func @cancellable_operations_0(%arg0: !async.token) {
// CHECK-NOT: async.runtime.add_ref
// CHECK-NOT: async.runtime.drop_ref
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: return
return
}
// CHECK-LABEL: @cancellable_operations_1
func @cancellable_operations_1(%arg0: !async.token) {
// CHECK-NOT: async.runtime.add_ref
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: call @consume_toke
call @consume_token(%arg0): (!async.token) -> ()
// CHECK-NOT: async.runtime.drop_ref
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: return
return
}
// CHECK-LABEL: @cancellable_operations_2
func @cancellable_operations_2(%arg0: !async.token) {
// CHECK: async.runtime.await
// CHECK-NEXT: async.runtime.await
// CHECK-NEXT: async.runtime.await
// CHECK-NEXT: return
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
async.runtime.await %arg0 : !async.token
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
async.runtime.await %arg0 : !async.token
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
async.runtime.await %arg0 : !async.token
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
return
}
// CHECK-LABEL: @cancellable_operations_3
func @cancellable_operations_3(%arg0: !async.token) {
// CHECK-NOT: add_ref
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: call @consume_toke
call @consume_token(%arg0): (!async.token) -> ()
// CHECK-NOT: async.runtime.drop_ref
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: async.runtime.await
async.runtime.await %arg0 : !async.token
// CHECK: return
return
}
// CHECK-LABEL: @not_cancellable_operations_0
func @not_cancellable_operations_0(%arg0: !async.token) {
// CHECK: add_ref
async.runtime.add_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: call @consume_toke
call @consume_token(%arg0): (!async.token) -> ()
// CHECK: async.runtime.await
async.runtime.await %arg0 : !async.token
// CHECK: async.runtime.drop_ref
async.runtime.drop_ref %arg0 {count = 1 : i32} : !async.token
// CHECK: return
return
}