| // RUN: mlir-opt %s | FileCheck %s |
| |
| // CHECK-LABEL: @identity_token |
| func @identity_token(%arg0: !async.token) -> !async.token { |
| // CHECK: return %arg0 : !async.token |
| return %arg0 : !async.token |
| } |
| |
| // CHECK-LABEL: @identity_value |
| func @identity_value(%arg0 : !async.value<f32>) -> !async.value<f32> { |
| // CHECK: return %arg0 : !async.value<f32> |
| return %arg0 : !async.value<f32> |
| } |
| |
| // CHECK-LABEL: @empty_async_execute |
| func @empty_async_execute() -> !async.token { |
| // CHECK: async.execute |
| %token = async.execute { |
| async.yield |
| } |
| |
| // CHECK: return %token : !async.token |
| return %token : !async.token |
| } |
| |
| // CHECK-LABEL: @return_async_value |
| func @return_async_value() -> !async.value<f32> { |
| // CHECK: async.execute -> !async.value<f32> |
| %token, %results = async.execute -> !async.value<f32> { |
| %cst = arith.constant 1.000000e+00 : f32 |
| async.yield %cst : f32 |
| } |
| |
| // CHECK: return %results : !async.value<f32> |
| return %results : !async.value<f32> |
| } |
| |
| // CHECK-LABEL: @return_captured_value |
| func @return_captured_value() -> !async.token { |
| %cst = arith.constant 1.000000e+00 : f32 |
| // CHECK: async.execute -> !async.value<f32> |
| %token, %results = async.execute -> !async.value<f32> { |
| async.yield %cst : f32 |
| } |
| |
| // CHECK: return %token : !async.token |
| return %token : !async.token |
| } |
| |
| // CHECK-LABEL: @return_async_values |
| func @return_async_values() -> (!async.value<f32>, !async.value<f32>) { |
| %token, %results:2 = async.execute -> (!async.value<f32>, !async.value<f32>) { |
| %cst1 = arith.constant 1.000000e+00 : f32 |
| %cst2 = arith.constant 2.000000e+00 : f32 |
| async.yield %cst1, %cst2 : f32, f32 |
| } |
| |
| // CHECK: return %results#0, %results#1 : !async.value<f32>, !async.value<f32> |
| return %results#0, %results#1 : !async.value<f32>, !async.value<f32> |
| } |
| |
| // CHECK-LABEL: @async_token_dependencies |
| func @async_token_dependencies(%arg0: !async.token) -> !async.token { |
| // CHECK: async.execute [%arg0] |
| %token = async.execute [%arg0] { |
| async.yield |
| } |
| |
| // CHECK: return %token : !async.token |
| return %token : !async.token |
| } |
| |
| // CHECK-LABEL: @async_value_operands |
| func @async_value_operands(%arg0: !async.value<f32>) -> !async.token { |
| // CHECK: async.execute (%arg0 as %arg1: !async.value<f32>) -> !async.value<f32> |
| %token, %results = async.execute (%arg0 as %arg1: !async.value<f32>) -> !async.value<f32> { |
| async.yield %arg1 : f32 |
| } |
| |
| // CHECK: return %token : !async.token |
| return %token : !async.token |
| } |
| |
| // CHECK-LABEL: @async_token_and_value_operands |
| func @async_token_and_value_operands(%arg0: !async.token, %arg1: !async.value<f32>) -> !async.token { |
| // CHECK: async.execute [%arg0] (%arg1 as %arg2: !async.value<f32>) -> !async.value<f32> |
| %token, %results = async.execute [%arg0] (%arg1 as %arg2: !async.value<f32>) -> !async.value<f32> { |
| async.yield %arg2 : f32 |
| } |
| |
| // CHECK: return %token : !async.token |
| return %token : !async.token |
| } |
| |
| // CHECK-LABEL: @empty_tokens_or_values_operands |
| func @empty_tokens_or_values_operands() { |
| // CHECK: async.execute { |
| %token0 = async.execute [] () -> () { async.yield } |
| // CHECK: async.execute { |
| %token1 = async.execute () -> () { async.yield } |
| // CHECK: async.execute { |
| %token2 = async.execute -> () { async.yield } |
| // CHECK: async.execute { |
| %token3 = async.execute () { async.yield } |
| // CHECK: async.execute { |
| %token4 = async.execute [] { async.yield } |
| return |
| } |
| |
| // CHECK-LABEL: @await_token |
| func @await_token(%arg0: !async.token) { |
| // CHECK: async.await %arg0 |
| async.await %arg0 : !async.token |
| return |
| } |
| |
| // CHECK-LABEL: @await_value |
| func @await_value(%arg0: !async.value<f32>) -> f32 { |
| // CHECK: async.await %arg0 |
| %0 = async.await %arg0 : !async.value<f32> |
| return %0 : f32 |
| } |
| |
| // CHECK-LABEL: @create_group_and_await_all |
| func @create_group_and_await_all(%arg0: !async.token, |
| %arg1: !async.value<f32>) -> index { |
| %c = arith.constant 2 : index |
| %0 = async.create_group %c : !async.group |
| |
| // CHECK: async.add_to_group %arg0 |
| // CHECK: async.add_to_group %arg1 |
| %1 = async.add_to_group %arg0, %0 : !async.token |
| %2 = async.add_to_group %arg1, %0 : !async.value<f32> |
| async.await_all %0 |
| |
| %3 = arith.addi %1, %2 : index |
| return %3 : index |
| } |