1// RUN: mlir-opt %s -convert-async-to-llvm | FileCheck %s --dump-input=always 2 3// CHECK-LABEL: @create_token 4func.func @create_token() { 5 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 6 %0 = async.runtime.create : !async.token 7 return 8} 9 10// CHECK-LABEL: @create_value 11func.func @create_value() { 12 // CHECK: %[[NULL:.*]] = llvm.mlir.zero : !llvm.ptr 13 // CHECK: %[[OFFSET:.*]] = llvm.getelementptr %[[NULL]][1] 14 // CHECK: %[[SIZE:.*]] = llvm.ptrtoint %[[OFFSET]] 15 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue(%[[SIZE]]) 16 %0 = async.runtime.create : !async.value<f32> 17 return 18} 19 20// CHECK-LABEL: @create_group 21func.func @create_group() { 22 // CHECK: %[[C:.*]] = arith.constant 1 : index 23 // CHECK: %[[S:.*]] = builtin.unrealized_conversion_cast %[[C]] : index to i64 24 %c = arith.constant 1 : index 25 // CHECK: %[[GROUP:.*]] = call @mlirAsyncRuntimeCreateGroup(%[[S]]) 26 %0 = async.runtime.create_group %c: !async.group 27 return 28} 29 30// CHECK-LABEL: @set_token_available 31func.func @set_token_available() { 32 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 33 %0 = async.runtime.create : !async.token 34 // CHECK: call @mlirAsyncRuntimeEmplaceToken(%[[TOKEN]]) 35 async.runtime.set_available %0 : !async.token 36 return 37} 38 39// CHECK-LABEL: @set_value_available 40func.func @set_value_available() { 41 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 42 %0 = async.runtime.create : !async.value<f32> 43 // CHECK: call @mlirAsyncRuntimeEmplaceValue(%[[VALUE]]) 44 async.runtime.set_available %0 : !async.value<f32> 45 return 46} 47 48// CHECK-LABEL: @is_token_error 49func.func @is_token_error() -> i1 { 50 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 51 %0 = async.runtime.create : !async.token 52 // CHECK: %[[ERR:.*]] = call @mlirAsyncRuntimeIsTokenError(%[[TOKEN]]) 53 %1 = async.runtime.is_error %0 : !async.token 54 return %1 : i1 55} 56 57// CHECK-LABEL: @is_value_error 58func.func @is_value_error() -> i1 { 59 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 60 %0 = async.runtime.create : !async.value<f32> 61 // CHECK: %[[ERR:.*]] = call @mlirAsyncRuntimeIsValueError(%[[VALUE]]) 62 %1 = async.runtime.is_error %0 : !async.value<f32> 63 return %1 : i1 64} 65 66// CHECK-LABEL: @await_token 67func.func @await_token() { 68 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 69 %0 = async.runtime.create : !async.token 70 // CHECK: call @mlirAsyncRuntimeAwaitToken(%[[TOKEN]]) 71 async.runtime.await %0 : !async.token 72 return 73} 74 75// CHECK-LABEL: @await_value 76func.func @await_value() { 77 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 78 %0 = async.runtime.create : !async.value<f32> 79 // CHECK: call @mlirAsyncRuntimeAwaitValue(%[[VALUE]]) 80 async.runtime.await %0 : !async.value<f32> 81 return 82} 83 84// CHECK-LABEL: @await_group 85func.func @await_group() { 86 %c = arith.constant 1 : index 87 // CHECK: %[[GROUP:.*]] = call @mlirAsyncRuntimeCreateGroup 88 %0 = async.runtime.create_group %c: !async.group 89 // CHECK: call @mlirAsyncRuntimeAwaitAllInGroup(%[[GROUP]]) 90 async.runtime.await %0 : !async.group 91 return 92} 93 94// CHECK-LABEL: @await_and_resume_token 95func.func @await_and_resume_token() { 96 %0 = async.coro.id 97 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin 98 %1 = async.coro.begin %0 99 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 100 %2 = async.runtime.create : !async.token 101 // CHECK: %[[RESUME:.*]] = llvm.mlir.addressof @__resume 102 // CHECK: call @mlirAsyncRuntimeAwaitTokenAndExecute 103 // CHECK-SAME: (%[[TOKEN]], %[[HDL]], %[[RESUME]]) 104 async.runtime.await_and_resume %2, %1 : !async.token 105 return 106} 107 108// CHECK-LABEL: @await_and_resume_value 109func.func @await_and_resume_value() { 110 %0 = async.coro.id 111 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin 112 %1 = async.coro.begin %0 113 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 114 %2 = async.runtime.create : !async.value<f32> 115 // CHECK: %[[RESUME:.*]] = llvm.mlir.addressof @__resume 116 // CHECK: call @mlirAsyncRuntimeAwaitValueAndExecute 117 // CHECK-SAME: (%[[VALUE]], %[[HDL]], %[[RESUME]]) 118 async.runtime.await_and_resume %2, %1 : !async.value<f32> 119 return 120} 121 122// CHECK-LABEL: @await_and_resume_group 123func.func @await_and_resume_group() { 124 %c = arith.constant 1 : index 125 %0 = async.coro.id 126 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin 127 %1 = async.coro.begin %0 128 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateGroup 129 %2 = async.runtime.create_group %c : !async.group 130 // CHECK: %[[RESUME:.*]] = llvm.mlir.addressof @__resume 131 // CHECK: call @mlirAsyncRuntimeAwaitAllInGroupAndExecute 132 // CHECK-SAME: (%[[TOKEN]], %[[HDL]], %[[RESUME]]) 133 async.runtime.await_and_resume %2, %1 : !async.group 134 return 135} 136 137// CHECK-LABEL: @resume 138func.func @resume() { 139 %0 = async.coro.id 140 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin 141 %1 = async.coro.begin %0 142 // CHECK: %[[RESUME:.*]] = llvm.mlir.addressof @__resume 143 // CHECK: call @mlirAsyncRuntimeExecute(%[[HDL]], %[[RESUME]]) 144 async.runtime.resume %1 145 return 146} 147 148// CHECK-LABEL: @store 149func.func @store() { 150 // CHECK: %[[CST:.*]] = arith.constant 1.0 151 %0 = arith.constant 1.0 : f32 152 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 153 %1 = async.runtime.create : !async.value<f32> 154 // CHECK: %[[P0:.*]] = call @mlirAsyncRuntimeGetValueStorage(%[[VALUE]]) 155 // CHECK: llvm.store %[[CST]], %[[P0]] : f32, !llvm.ptr 156 async.runtime.store %0, %1 : !async.value<f32> 157 return 158} 159 160// CHECK-LABEL: @load 161func.func @load() -> f32 { 162 // CHECK: %[[VALUE:.*]] = call @mlirAsyncRuntimeCreateValue 163 %0 = async.runtime.create : !async.value<f32> 164 // CHECK: %[[P0:.*]] = call @mlirAsyncRuntimeGetValueStorage(%[[VALUE]]) 165 // CHECK: %[[VALUE:.*]] = llvm.load %[[P0]] : !llvm.ptr -> f32 166 %1 = async.runtime.load %0 : !async.value<f32> 167 // CHECK: return %[[VALUE]] : f32 168 return %1 : f32 169} 170 171// CHECK-LABEL: @add_token_to_group 172func.func @add_token_to_group() { 173 %c = arith.constant 1 : index 174 // CHECK: %[[TOKEN:.*]] = call @mlirAsyncRuntimeCreateToken 175 %0 = async.runtime.create : !async.token 176 // CHECK: %[[GROUP:.*]] = call @mlirAsyncRuntimeCreateGroup 177 %1 = async.runtime.create_group %c : !async.group 178 // CHECK: call @mlirAsyncRuntimeAddTokenToGroup(%[[TOKEN]], %[[GROUP]]) 179 async.runtime.add_to_group %0, %1 : !async.token 180 return 181} 182