MLIR
20.0.0git
|
#include <utility>
#include "mlir/Dialect/Async/Passes.h"
#include "PassDetail.h"
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Async/IR/Async.h"
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/SCF/IR/SCF.h"
#include "mlir/IR/IRMapping.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/RegionUtils.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/Support/Debug.h"
#include <optional>
#include "mlir/Dialect/Async/Passes.h.inc"
Go to the source code of this file.
Classes | |
class | YieldOpLowering |
class | AssertOpLowering |
Namespaces | |
mlir | |
Include the generated interface declarations. | |
Macros | |
#define | GEN_PASS_DEF_ASYNCTOASYNCRUNTIME |
#define | GEN_PASS_DEF_ASYNCFUNCTOASYNCRUNTIME |
#define | DEBUG_TYPE "async-to-async-runtime" |
Typedefs | |
using | FuncCoroMapPtr = std::shared_ptr< llvm::DenseMap< func::FuncOp, CoroMachinery > > |
Functions | |
static CoroMachinery | setupCoroMachinery (func::FuncOp func) |
Utility to partially update the regular function CFG to the coroutine CFG compatible with LLVM coroutines switched-resume lowering using async.runtime. More... | |
static Block * | setupSetErrorBlock (CoroMachinery &coro) |
static std::pair< func::FuncOp, CoroMachinery > | outlineExecuteOp (SymbolTable &symbolTable, ExecuteOp execute) |
Outline the body region attached to the async.execute op into a standalone function. More... | |
Variables | |
static constexpr const char | kAsyncFnPrefix [] = "async_execute_fn" |
#define DEBUG_TYPE "async-to-async-runtime" |
Definition at line 43 of file AsyncToAsyncRuntime.cpp.
#define GEN_PASS_DEF_ASYNCFUNCTOASYNCRUNTIME |
Definition at line 36 of file AsyncToAsyncRuntime.cpp.
#define GEN_PASS_DEF_ASYNCTOASYNCRUNTIME |
Definition at line 35 of file AsyncToAsyncRuntime.cpp.
using FuncCoroMapPtr = std::shared_ptr<llvm::DenseMap<func::FuncOp, CoroMachinery> > |
Definition at line 124 of file AsyncToAsyncRuntime.cpp.
|
static |
Outline the body region attached to the async.execute
op into a standalone function.
Note that this is not reversible transformation.
Definition at line 296 of file AsyncToAsyncRuntime.cpp.
References mlir::ImplicitLocOpBuilder::atBlockBegin(), mlir::async::cloneConstantsIntoTheRegion(), mlir::ImplicitLocOpBuilder::create(), mlir::get(), mlir::Value::getType(), mlir::getUsedValuesDefinedAbove(), mlir::SymbolTable::insert(), kAsyncFnPrefix, mlir::IRMapping::map(), mlir::SymbolTable::Private, mlir::SymbolTable::setSymbolVisibility(), and setupCoroMachinery().
|
static |
Utility to partially update the regular function CFG to the coroutine CFG compatible with LLVM coroutines switched-resume lowering using async.runtime.
* and async.coro.*
operations. Adds a new entry block that branches into preexisting entry block. Also inserts trailing blocks.
The result types of the passed func
start with an optional async.token
and be continued with some number of async.value
s.
See LLVM coroutines documentation: https://llvm.org/docs/Coroutines.html
entry
block sets up the coroutine.set_error
block sets completion token and async values state to error.cleanup
block cleans up the coroutine state.Coroutine structure (only the important bits):
func @some_fn(<function-arguments>) -> (!async.token, !async.value<T>) { ^entry(<function-arguments>): token = <async token> : !async.token // create async runtime token value = <async value> : !async.value<T> // create async value id = async.coro.getId // create a coroutine id hdl = async.coro.begin id // create a coroutine handle cf.br ^preexisting_entry_block
/* preexisting blocks modified to branch to the cleanup block */
^set_error: // this block created lazily only if needed (see code below) async.runtime.set_error token : !async.token async.runtime.set_error value : !async.value<T> cf.br ^cleanup
^cleanup: async.coro.free hdl // delete the coroutine state cf.br ^suspend
^suspend: async.coro.end hdl // marks the end of a coroutine return token, value : !async.token, !async.value<T> }
Definition at line 171 of file AsyncToAsyncRuntime.cpp.
References mlir::ImplicitLocOpBuilder::atBlockBegin(), mlir::Block::front(), mlir::get(), mlir::Block::getOperations(), and mlir::Block::splitBlock().
Referenced by outlineExecuteOp().
|
static |
Definition at line 264 of file AsyncToAsyncRuntime.cpp.
References mlir::ImplicitLocOpBuilder::atBlockBegin().
Referenced by AssertOpLowering::matchAndRewrite().
|
staticconstexpr |
Definition at line 45 of file AsyncToAsyncRuntime.cpp.
Referenced by outlineExecuteOp().