12 #include "llvm/ADT/TypeSwitch.h" 17 #include "mlir/Dialect/Async/IR/AsyncOpsDialect.cpp.inc" 19 constexpr StringRef AsyncDialect::kAllowedToBlockAttrName;
21 void AsyncDialect::initialize() {
24 #include "mlir/Dialect/Async/IR/AsyncOps.cpp.inc" 27 #define GET_TYPEDEF_LIST 28 #include "mlir/Dialect/Async/IR/AsyncOpsTypes.cpp.inc" 39 auto executeOp = (*this)->getParentOfType<ExecuteOp>();
40 auto types = llvm::map_range(executeOp.results(), [](
const OpResult &result) {
41 return result.getType().cast<ValueType>().getValueType();
44 if (getOperandTypes() != types)
45 return emitOpError(
"operand types do not match the types returned from " 46 "the parent ExecuteOp");
53 return operandsMutable();
63 assert(index && *index == 0 &&
"invalid region index");
67 bool ExecuteOp::areTypesCompatible(
Type lhs,
Type rhs) {
68 const auto getValueOrTokenType = [](
Type type) {
69 if (
auto value = type.dyn_cast<ValueType>())
70 return value.getValueType();
73 return getValueOrTokenType(lhs) == getValueOrTokenType(rhs);
81 assert(*index == 0 &&
"invalid region index");
92 ValueRange operands, BodyBuilderFn bodyBuilder) {
98 int32_t numDependencies = dependencies.size();
99 int32_t numOperands = operands.size();
102 {numDependencies, numOperands});
103 result.
addAttribute(kOperandSegmentSizesAttr, operandSegmentSizes);
108 for (
Type type : resultTypes)
109 result.
addTypes(ValueType::get(type));
115 for (
Value operand : operands) {
116 auto valueType = operand.getType().dyn_cast<ValueType>();
117 bodyBlock.
addArgument(valueType ? valueType.getValueType()
125 if (resultTypes.empty() && !bodyBuilder) {
129 }
else if (bodyBuilder) {
138 if (!dependencies().empty())
139 p <<
" [" << dependencies() <<
"]";
142 if (!operands().empty()) {
144 Block *entry = body().
empty() ? nullptr : &body().front();
145 llvm::interleaveComma(operands(), p, [&, n = 0](
Value operand)
mutable {
147 p << operand <<
" as " << argument <<
": " << operand.
getType();
155 {kOperandSegmentSizesAttr});
164 int32_t numDependencies = 0;
166 auto tokenTy = TokenType::get(ctx);
176 numDependencies = tokenArgs.size();
192 auto valueTy = valueTypes.back().dyn_cast<ValueType>();
193 unwrappedArgs.back().type = valueTy ? valueTy.getValueType() :
Type();
199 parseAsyncValueArg) ||
203 int32_t numOperands = valueArgs.size();
208 {numDependencies, numOperands});
209 result.
addAttribute(kOperandSegmentSizesAttr, operandSegmentSizes);
231 auto unwrappedTypes = llvm::map_range(operands(), [](
Value operand) {
232 return operand.
getType().
cast<ValueType>().getValueType();
236 if (body().getArgumentTypes() != unwrappedTypes)
237 return emitOpError(
"async body region argument types do not match the " 238 "execute operation arguments types");
252 auto isAwaitAll = [&](
Operation *op) ->
bool {
253 if (AwaitAllOp awaitAll = dyn_cast<AwaitAllOp>(op)) {
254 awaitAllUsers.push_back(awaitAll);
261 if (!llvm::all_of(op->getUsers(), isAwaitAll))
266 for (AwaitAllOp awaitAll : awaitAllUsers)
284 result.
addTypes(valueType.getValueType());
293 if (
auto valueType = operandType.
dyn_cast<ValueType>())
294 resultType = valueType.getValueType();
300 Type operandType,
Type resultType) {
308 if (argType.
isa<TokenType>() && !getResultTypes().empty())
309 return emitOpError(
"awaiting on a token must have empty result");
313 if (*getResultType() !=
value.getValueType())
314 return emitOpError() <<
"result type " << *getResultType()
315 <<
" does not match async value type " 316 <<
value.getValueType();
326 #define GET_OP_CLASSES 327 #include "mlir/Dialect/Async/IR/AsyncOps.cpp.inc" 333 #define GET_TYPEDEF_CLASSES 334 #include "mlir/Dialect/Async/IR/AsyncOpsTypes.cpp.inc" 342 Type ValueType::parse(mlir::AsmParser &parser) { 344 if (parser.parseLess() || parser.parseType(ty) || parser.parseGreater()) { 345 parser.emitError(parser.getNameLoc(), "failed to parse async value type"); 348 return ValueType::get(ty); Include the generated interface declarations.
This class contains a list of basic blocks and a link to the parent operation it is attached to...
A special type of RewriterBase that coordinates the application of a rewrite pattern on the current I...
NamedAttrList is array of NamedAttributes that tracks whether it is sorted and does some basic work t...
Operation is a basic unit of execution within MLIR.
This is a value defined by a result of an operation.
virtual void printType(Type type)
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
Block represents an ordered list of Operations.
virtual void eraseOp(Operation *op)
This method erases an operation that is known to have no uses.
virtual ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())=0
Parse a list of comma-separated items with an optional delimiter.
void push_back(Block *block)
ParseResult addTypeToList(Type type, SmallVectorImpl< Type > &result)
Add the specified type to the end of the specified type list and return success.
bool succeeded(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a success value...
static void printAwaitResultType(OpAsmPrinter &p, Operation *op, Type operandType, Type resultType)
constexpr char kOperandSegmentSizesAttr[]
ExecuteOp.
virtual ParseResult parseArgument(Argument &result, bool allowType=false, bool allowAttrs=false)=0
Parse a single argument with the following syntax:
The OpAsmParser has methods for interacting with the asm parser: parsing things from it...
virtual Builder & getBuilder() const =0
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
BlockArgument getArgument(unsigned i)
static constexpr const bool value
SmallVector< Value, 4 > operands
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
Operation * create(const OperationState &state)
Creates an operation given the fields represented as an OperationState.
This class represents an efficient way to signal success or failure.
LogicalResult failure(bool isFailure=true)
Utility function to generate a LogicalResult.
void addOperands(ValueRange newOperands)
void printOptionalArrowTypeList(TypeRange &&types)
Print an optional arrow followed by a type list.
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
IntegerType getIntegerType(unsigned width)
void addAttributes(ArrayRef< NamedAttribute > newAttributes)
Add an array of named attributes.
static ParseResult parseAwaitResultType(OpAsmParser &parser, Type &operandType, Type &resultType)
static DenseIntElementsAttr get(const ShapedType &type, Arg &&arg)
Get an instance of a DenseIntElementsAttr with the given arguments.
Parens supporting zero or more operands, or nothing.
This class provides an abstraction over the various different ranges of value types.
void addTypes(ArrayRef< Type > newTypes)
This is a pure-virtual base class that exposes the asmprinter hooks necessary to implement a custom p...
This class provides a mutable adaptor for a range of operands.
This represents an operation in an abstracted form, suitable for use with the builder APIs...
virtual ParseResult parseOperand(UnresolvedOperand &result, bool allowResultNumber=true)=0
Parse a single SSA value operand name along with a result number if allowResultNumber is true...
BlockArgListType getArguments()
ParseResult resolveOperands(ArrayRef< UnresolvedOperand > operands, Type type, SmallVectorImpl< Value > &result)
Resolve a list of operands to SSA values, emitting an error on failure, or appending the results to t...
virtual ParseResult parseRSquare()=0
Parse a ] token.
virtual ParseResult parseOptionalAttrDictWithKeyword(NamedAttrList &result)=0
Parse a named dictionary into 'result' if the attributes keyword is present.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
void addAttribute(StringRef name, Attribute attr)
Add an attribute with the specified name.
ParseResult parseKeyword(StringRef keyword)
Parse a given keyword.
MLIRContext * getContext() const
Get the context held by this operation state.
void setInsertionPointToStart(Block *block)
Sets the insertion point to the start of the specified block.
RAII guard to reset the insertion point of the builder when destroyed.
This class represents a successor of a region.
Region * addRegion()
Create a region that should be attached to the operation.
Type getType() const
Return the type of this value.
virtual ParseResult parseRegion(Region ®ion, ArrayRef< Argument > arguments={}, bool enableNameShadowing=false)=0
Parses a region.
void append(StringRef name, Attribute attr)
Add an attribute with the specified name.
virtual ParseResult parseType(Type &result)=0
Parse a type.
MLIRContext is the top-level object for a collection of MLIR operations.
virtual void printOptionalAttrDictWithKeyword(ArrayRef< NamedAttribute > attrs, ArrayRef< StringRef > elidedAttrs={})=0
If the specified operation has attributes, print out an attribute dictionary prefixed with 'attribute...
This class implements the operand iterators for the Operation class.
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs, on this operation and any nested operations.
This base class exposes generic asm printer hooks, usable across the various derived printers...
virtual ParseResult parseOptionalLSquare()=0
Parse a [ token if present.
BlockArgument addArgument(Type type, Location loc)
Add one value to the argument list.
This class represents success/failure for parsing-like operations that find it important to chain tog...
This class helps build Operations.
This class provides an abstraction over the different types of ranges over Values.
virtual ParseResult parseOperandList(SmallVectorImpl< UnresolvedOperand > &result, Delimiter delimiter=Delimiter::None, bool allowResultNumber=true, int requiredOperandCount=-1)=0
Parse zero or more SSA comma-separated operand references with a specified surrounding delimiter...
ParseResult addTypesToList(ArrayRef< Type > types, SmallVectorImpl< Type > &result)
Add the specified types to the end of the specified type list and return success. ...
virtual ParseResult parseOptionalArrowTypeList(SmallVectorImpl< Type > &result)=0
Parse an optional arrow followed by a type list.
virtual ParseResult parseColonType(Type &result)=0
Parse a colon followed by a type.
virtual void printRegion(Region &blocks, bool printEntryBlockArgs=true, bool printBlockTerminators=true, bool printEmptyBlock=false)=0
Prints a region.
SmallVector< Type, 4 > types
Types of the results of this operation.