llvm-project/mlir/test/mlir-opt/async.mlir
Quentin Colombet cb4ccd38fa [mlir][Conversion] Rename the MemRefToLLVM pass
Since the recent MemRef refactoring that centralizes the lowering of
complex MemRef operations outside of the conversion framework, the
MemRefToLLVM pass doesn't directly convert these complex operations.

Instead, to fully convert the whole MemRef dialect space, MemRefToLLVM
needs to run after `expand-strided-metadata`.

Make this more obvious by changing the name of the pass and the option
associated with it from `convert-memref-to-llvm` to
`finalize-memref-to-llvm`.
The word "finalize" conveys that this pass needs to run after something
else and that something else is documented in its tablegen description.

This is a follow-up patch related to the conversation at:
https://discourse.llvm.org/t/psa-you-need-to-run-expand-strided-metadata-before-memref-to-llvm-now/66956/14

Differential Revision: https://reviews.llvm.org/D142463
2023-01-27 09:10:10 +00:00

71 lines
2.5 KiB
MLIR

// Check if mlir marks the corresponding function with required coroutine attribute.
//
// RUN: mlir-opt %s -pass-pipeline="builtin.module(async-to-async-runtime,func.func(async-runtime-ref-counting,async-runtime-ref-counting-opt),convert-async-to-llvm,func.func(convert-linalg-to-loops,convert-scf-to-cf),convert-linalg-to-llvm,finalize-memref-to-llvm,func.func(convert-arith-to-llvm),convert-func-to-llvm,reconcile-unrealized-casts)" \
// RUN: | FileCheck %s
// CHECK: llvm.func @async_execute_fn{{.*}}attributes{{.*}}presplitcoroutine
// CHECK: llvm.func @async_execute_fn_0{{.*}}attributes{{.*}}presplitcoroutine
// CHECK: llvm.func @async_execute_fn_1{{.*}}attributes{{.*}}presplitcoroutine
func.func @main() {
%i0 = arith.constant 0 : index
%i1 = arith.constant 1 : index
%i2 = arith.constant 2 : index
%i3 = arith.constant 3 : index
%c0 = arith.constant 0.0 : f32
%c1 = arith.constant 1.0 : f32
%c2 = arith.constant 2.0 : f32
%c3 = arith.constant 3.0 : f32
%c4 = arith.constant 4.0 : f32
%A = memref.alloc() : memref<4xf32>
linalg.fill ins(%c0 : f32) outs(%A : memref<4xf32>)
%U = memref.cast %A : memref<4xf32> to memref<*xf32>
call @printMemrefF32(%U): (memref<*xf32>) -> ()
memref.store %c1, %A[%i0]: memref<4xf32>
call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
call @printMemrefF32(%U): (memref<*xf32>) -> ()
%outer = async.execute {
memref.store %c2, %A[%i1]: memref<4xf32>
func.call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
func.call @printMemrefF32(%U): (memref<*xf32>) -> ()
// No op async region to create a token for testing async dependency.
%noop = async.execute {
func.call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
async.yield
}
%inner = async.execute [%noop] {
memref.store %c3, %A[%i2]: memref<4xf32>
func.call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
func.call @printMemrefF32(%U): (memref<*xf32>) -> ()
async.yield
}
async.await %inner : !async.token
memref.store %c4, %A[%i3]: memref<4xf32>
func.call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
func.call @printMemrefF32(%U): (memref<*xf32>) -> ()
async.yield
}
async.await %outer : !async.token
call @mlirAsyncRuntimePrintCurrentThreadId(): () -> ()
call @printMemrefF32(%U): (memref<*xf32>) -> ()
memref.dealloc %A : memref<4xf32>
return
}
func.func private @mlirAsyncRuntimePrintCurrentThreadId() -> ()
func.func private @printMemrefF32(memref<*xf32>) attributes { llvm.emit_c_interface }