24#include "llvm/Support/InterleavedRange.h"
33ParseResult spirv::GraphARMOp::parse(
OpAsmParser &parser,
46 bool isVariadic =
false;
51 parser,
false, entryArgs, isVariadic, resultTypes,
57 GraphType grType = builder.
getGraphType(argTypes, resultTypes);
58 result.addAttribute(getFunctionTypeAttrName(
result.name),
59 TypeAttr::get(grType));
66 assert(resultAttrs.size() == resultTypes.size());
68 builder,
result, entryArgs, resultAttrs, getArgAttrsAttrName(
result.name),
69 getResAttrsAttrName(
result.name));
81 if (StringAttr visibility = getSymVisibilityAttr())
82 printer << visibility.getValue() <<
' ';
84 GraphType grType = getFunctionType();
86 printer, *
this, grType.getInputs(),
87 false, grType.getResults());
90 {getFunctionTypeAttrName(), getArgAttrsAttrName(), getResAttrsAttrName(),
91 getSymVisibilityAttrName()});
94 Region &body = this->getBody();
102LogicalResult spirv::GraphARMOp::verifyType() {
103 if (getFunctionType().getNumResults() < 1)
104 return emitOpError(
"there should be at least one result");
108LogicalResult spirv::GraphARMOp::verifyBody() {
109 for (
auto [
index, graphArgType] : llvm::enumerate(getArgumentTypes())) {
110 if (!isa<spirv::TensorArmType>(graphArgType)) {
111 return emitOpError(
"type of argument #")
112 <<
index <<
" must be a TensorArmType, but got " << graphArgType;
115 for (
auto [
index, graphResType] : llvm::enumerate(getResultTypes())) {
116 if (!isa<spirv::TensorArmType>(graphResType)) {
117 return emitOpError(
"type of result #")
118 <<
index <<
" must be a TensorArmType, but got " << graphResType;
123 Block &entryBlock = front();
125 unsigned numArguments = this->getNumArguments();
127 return emitOpError(
"entry block must have ")
128 << numArguments <<
" arguments to match graph signature";
130 for (
auto [
index, grArgType, blockArgType] :
132 if (blockArgType != grArgType) {
133 return emitOpError(
"type of entry block argument #")
134 <<
index <<
'(' << blockArgType
135 <<
") must match the type of the corresponding argument in "
136 <<
"graph signature(" << grArgType <<
')';
141 GraphType grType = getFunctionType();
142 auto walkResult =
walk([grType](spirv::GraphOutputsARMOp op) ->
WalkResult {
143 if (grType.getNumResults() != op.getNumOperands())
144 return op.emitOpError(
"is returning ")
145 << op.getNumOperands()
146 <<
" value(s) but enclosing spirv.ARM.Graph requires "
147 << grType.getNumResults() <<
" result(s)";
150 op.getValue().getType();
151 for (
auto [
index, type] : llvm::enumerate(graphOutputOperandTypes)) {
152 if (type != grType.getResult(
index))
153 return op.emitError(
"type of return operand ")
154 <<
index <<
" (" << type <<
") doesn't match graph result type ("
155 << grType.getResult(
index) <<
")";
160 return failure(walkResult.wasInterrupted());
164 StringRef name, GraphType type,
168 state.
addAttribute(getFunctionTypeAttrName(state.
name), TypeAttr::get(type));
176 return getFunctionType().getInputs();
180 return getFunctionType().getResults();
183Region *spirv::GraphARMOp::getCallableRegion() {
184 return isExternal() ?
nullptr : &getBody();
191LogicalResult spirv::GraphOutputsARMOp::verify() {
192 auto graph = cast<GraphARMOp>((*this)->getParentOp());
195 const ArrayRef<Type> &results = graph.getFunctionType().getResults();
197 return emitOpError(
"has ")
198 <<
getNumOperands() <<
" operands, but enclosing spirv.ARM.Graph (@"
199 << graph.getName() <<
") returns " << results.size();
201 for (
auto [
index,
result] : llvm::enumerate(results))
204 << getOperand(
index).getType()
205 <<
") doesn't match spirv.ARM.Graph result type ("
207 <<
" in graph @" << graph.getName();
215void spirv::GraphEntryPointARMOp::build(
OpBuilder &builder,
217 spirv::GraphARMOp graph,
219 build(builder, state, SymbolRefAttr::get(graph),
223ParseResult spirv::GraphEntryPointARMOp::parse(
OpAsmParser &parser,
234 FlatSymbolRefAttr var;
236 if (parser.parseAttribute(var, Type(),
"var_symbol", attrs))
238 interfaceVars.push_back(var);
243 result.addAttribute(
"interface",
248void spirv::GraphEntryPointARMOp::print(
OpAsmPrinter &printer) {
252 if (!interfaceVars.empty()) {
253 printer <<
", " << llvm::interleaved(interfaceVars);
getNumOperands() - 1))) return failure()
Given a list of lists of parsed operands, populates uniqueOperands with unique operands.
ParseResult parseSymbolName(StringAttr &result)
Parse an -identifier and store it (without the '@' symbol) in a string attribute.
virtual Builder & getBuilder() const =0
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
virtual ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())=0
Parse a list of comma-separated items with an optional delimiter.
virtual ParseResult parseOptionalAttrDictWithKeyword(NamedAttrList &result)=0
Parse a named dictionary into 'result' if the attributes keyword is present.
virtual ParseResult parseOptionalComma()=0
Parse a , token if present.
virtual ParseResult parseAttribute(Attribute &result, Type type={})=0
Parse an arbitrary attribute of a given type and return it in result.
virtual void printSymbolName(StringRef symbolRef)
Print the given string as a symbol reference, i.e.
Block represents an ordered list of Operations.
ValueTypeRange< BlockArgListType > getArgumentTypes()
Return a range containing the types of the arguments for this block.
unsigned getNumArguments()
This class is a general helper class for creating context-global objects like types,...
BoolAttr getBoolAttr(bool value)
StringAttr getStringAttr(const Twine &bytes)
GraphType getGraphType(TypeRange inputs, TypeRange results)
ArrayAttr getArrayAttr(ArrayRef< Attribute > value)
A symbol reference with a reference path containing a single element.
void append(StringRef name, Attribute attr)
Add an attribute with the specified name.
The OpAsmParser has methods for interacting with the asm parser: parsing things from it,...
virtual OptionalParseResult parseOptionalRegion(Region ®ion, ArrayRef< Argument > arguments={}, bool enableNameShadowing=false)=0
Parses a region if present.
This is a pure-virtual base class that exposes the asmprinter hooks necessary to implement a custom p...
virtual void printRegion(Region &blocks, bool printEntryBlockArgs=true, bool printBlockTerminators=true, bool printEmptyBlock=false)=0
Prints a region.
This class helps build Operations.
This class implements Optional functionality for ParseResult.
bool has_value() const
Returns true if we contain a valid ParseResult value.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class implements iteration on the types of a given range of values.
A utility result that is used to signal how to proceed with an ongoing walk:
static WalkResult advance()
void addArgAndResultAttrs(Builder &builder, OperationState &result, ArrayRef< DictionaryAttr > argAttrs, ArrayRef< DictionaryAttr > resultAttrs, StringAttr argAttrsName, StringAttr resAttrsName)
Adds argument and result attributes, provided as argAttrs and resultAttrs arguments,...
void walk(Operation *op, function_ref< void(Region *)> callback, WalkOrder order)
Walk all of the regions, blocks, or operations nested under (and including) the given operation.
ParseResult parseFunctionSignatureWithArguments(OpAsmParser &parser, bool allowVariadic, SmallVectorImpl< OpAsmParser::Argument > &arguments, bool &isVariadic, SmallVectorImpl< Type > &resultTypes, SmallVectorImpl< DictionaryAttr > &resultAttrs)
Parses a function signature using parser.
void printFunctionAttributes(OpAsmPrinter &p, Operation *op, ArrayRef< StringRef > elided={})
Prints the list of function prefixed with the "attributes" keyword.
void printFunctionSignature(OpAsmPrinter &p, FunctionOpInterface op, ArrayRef< Type > argTypes, bool isVariadic, ArrayRef< Type > resultTypes)
Prints the signature of the function-like operation op.
ParseResult parseOptionalVisibilityKeyword(OpAsmParser &parser, NamedAttrList &attrs)
Parse an optional visibility attribute keyword (i.e., public, private, or nested) without quotes in a...
constexpr char kFnNameAttrName[]
Include the generated interface declarations.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
This represents an operation in an abstracted form, suitable for use with the builder APIs.
void addAttribute(StringRef name, Attribute attr)
Add an attribute with the specified name.
Region * addRegion()
Create a region that should be attached to the operation.