31 #include "llvm/ADT/SmallPtrSet.h"
32 #include "llvm/Support/ThreadPool.h"
60 bool threadingEnabled) {
73 unwrap(context)->allowUnregisteredDialects(allow);
77 return unwrap(context)->allowsUnregisteredDialects();
80 return static_cast<intptr_t
>(
unwrap(context)->getAvailableDialects().size());
84 MlirDialectRegistry registry) {
91 return static_cast<intptr_t
>(
unwrap(context)->getLoadedDialects().size());
100 return unwrap(context)->isOperationRegistered(
unwrap(name));
104 return unwrap(context)->enableMultithreading(enable);
108 unwrap(context)->loadAllAvailableDialects();
112 MlirLlvmThreadPool threadPool) {
149 MlirOpPrintingFlags flags) {
170 MlirOpPrintingFlags flags) {
173 if (
auto result = llvm::dyn_cast<OpResult>(val)) {
174 op = result.getOwner();
176 op = llvm::cast<BlockArgument>(val).getOwner()->
getParentOp();
202 intptr_t largeElementLimit) {
203 unwrap(flags)->elideLargeElementsAttrs(largeElementLimit);
207 intptr_t largeResourceLimit) {
208 unwrap(flags)->elideLargeResourceString(largeResourceLimit);
213 unwrap(flags)->enableDebugInfo(enable, prettyForm);
217 unwrap(flags)->printGenericOpForm();
221 unwrap(flags)->useLocalScope();
225 unwrap(flags)->assumeVerified();
229 unwrap(flags)->skipRegions();
245 unwrap(flags)->setDesiredBytecodeVersion(version);
272 MlirLocation
const *locations,
273 MlirAttribute metadata) {
280 MlirLocation childLoc) {
303 unwrap(location).print(stream);
311 return wrap(ModuleOp::create(
unwrap(location)));
316 parseSourceString<ModuleOp>(
unwrap(module),
unwrap(context));
318 return MlirModule{
nullptr};
319 return MlirModule{owning.
release().getOperation()};
351 state.location = loc;
353 state.results =
nullptr;
355 state.operands =
nullptr;
357 state.regions =
nullptr;
358 state.nSuccessors = 0;
359 state.successors =
nullptr;
360 state.nAttributes = 0;
361 state.attributes =
nullptr;
362 state.enableResultTypeInference =
false;
366 #define APPEND_ELEMS(type, sizeName, elemName) \
368 (type *)realloc(state->elemName, (state->sizeName + n) * sizeof(type)); \
369 memcpy(state->elemName + state->sizeName, elemName, n * sizeof(type)); \
370 state->sizeName += n;
373 MlirType
const *results) {
378 MlirValue
const *operands) {
382 MlirRegion
const *regions) {
386 MlirBlock
const *successors) {
395 state->enableResultTypeInference =
true;
404 std::optional<RegisteredOperationName> info = state.name.getRegisteredInfo();
407 <<
"type inference was requested for the operation " << state.name
408 <<
", but the operation was not registered; ensure that the dialect "
409 "containing the operation is linked into MLIR and registered with "
414 auto *inferInterface = info->getInterface<InferTypeOpInterface>();
415 if (!inferInterface) {
417 <<
"type inference was requested for the operation " << state.name
418 <<
", but the operation does not support type inference; result "
419 "types must be specified explicitly";
423 DictionaryAttr attributes = state.attributes.getDictionary(context);
426 if (!properties && info->getOpPropertyByteSize() > 0 && !attributes.empty()) {
427 auto prop = std::make_unique<char[]>(info->getOpPropertyByteSize());
432 <<
" failed properties conversion while building "
433 << state.name.getStringRef() <<
" with `" << attributes <<
"`: ";
435 if (failed(info->setOpPropertiesFromAttribute(state.name, properties,
439 if (succeeded(inferInterface->inferReturnTypes(
440 context, state.location, state.operands, attributes, properties,
441 state.regions, state.types))) {
448 if (succeeded(inferInterface->inferReturnTypes(
449 context, state.location, state.operands, attributes, properties,
450 state.regions, state.types)))
465 unwrapList(state->nOperands, state->operands, operandStorage));
467 unwrapList(state->nSuccessors, state->successors, successorStorage));
470 for (intptr_t i = 0; i < state->nAttributes; ++i)
472 unwrap(state->attributes[i].attribute));
474 for (intptr_t i = 0; i < state->nRegions; ++i)
475 cppState.
addRegion(std::unique_ptr<Region>(
unwrap(state->regions[i])));
477 free(state->results);
478 free(state->operands);
479 free(state->successors);
480 free(state->regions);
481 free(state->attributes);
484 if (state->enableResultTypeInference) {
485 assert(cppState.
types.empty() &&
486 "result type inference enabled and result types provided");
524 if (
auto info =
unwrap(op)->getRegisteredInfo())
525 return wrap(info->getTypeID());
530 return wrap(
unwrap(op)->getName().getIdentifier());
542 return static_cast<intptr_t
>(
unwrap(op)->getNumRegions());
546 return wrap(&
unwrap(op)->getRegion(
static_cast<unsigned>(pos)));
570 return static_cast<intptr_t
>(
unwrap(op)->getNumOperands());
574 return wrap(
unwrap(op)->getOperand(
static_cast<unsigned>(pos)));
578 MlirValue newValue) {
579 unwrap(op)->setOperand(
static_cast<unsigned>(pos),
unwrap(newValue));
583 MlirValue
const *operands) {
589 return static_cast<intptr_t
>(
unwrap(op)->getNumResults());
593 return wrap(
unwrap(op)->getResult(
static_cast<unsigned>(pos)));
597 return static_cast<intptr_t
>(
unwrap(op)->getNumSuccessors());
601 return wrap(
unwrap(op)->getSuccessor(
static_cast<unsigned>(pos)));
606 std::optional<Attribute> attr =
unwrap(op)->getInherentAttr(
unwrap(name));
607 return attr.has_value();
612 std::optional<Attribute> attr =
unwrap(op)->getInherentAttr(
unwrap(name));
613 if (attr.has_value())
620 MlirAttribute attr) {
621 unwrap(op)->setInherentAttr(
626 return static_cast<intptr_t
>(
627 llvm::range_size(
unwrap(op)->getDiscardableAttrs()));
633 *std::next(
unwrap(op)->getDiscardableAttrs().begin(), pos);
644 MlirAttribute attr) {
650 return !!
unwrap(op)->removeDiscardableAttr(
unwrap(name));
655 unwrap(op)->setSuccessor(
unwrap(block),
static_cast<unsigned>(pos));
659 return static_cast<intptr_t
>(
unwrap(op)->getAttrs().size());
673 MlirAttribute attr) {
684 unwrap(op)->print(stream);
698 unwrap(op)->print(stream);
709 MlirOperation op, MlirBytecodeWriterConfig config,
740 llvm_unreachable(
"unknown result in WalkResult::unwrap");
773 if (cppRegion->
empty())
774 return wrap(
static_cast<Block *
>(
nullptr));
784 auto &blockList =
unwrap(region)->getBlocks();
785 blockList.insert(std::next(blockList.begin(), pos),
unwrap(block));
796 assert(
unwrap(reference)->getParent() ==
unwrap(region) &&
797 "expected reference block to belong to the region");
807 assert(
unwrap(reference)->getParent() ==
unwrap(region) &&
808 "expected reference block to belong to the region");
814 delete static_cast<Region *
>(region.ptr);
826 MlirLocation
const *locs) {
828 for (intptr_t i = 0; i < nArgs; ++i)
851 if (cppBlock->
empty())
858 if (cppBlock->
empty())
871 MlirOperation operation) {
872 auto &opList =
unwrap(block)->getOperations();
873 opList.insert(std::next(opList.begin(), pos),
unwrap(operation));
877 MlirOperation reference,
878 MlirOperation operation) {
885 assert(
unwrap(reference)->getBlock() ==
unwrap(block) &&
886 "expected reference operation to belong to the block");
892 MlirOperation reference,
893 MlirOperation operation) {
897 assert(
unwrap(reference)->getBlock() ==
unwrap(block) &&
898 "expected reference operation to belong to the block");
911 return static_cast<intptr_t
>(
unwrap(block)->getNumArguments());
920 return unwrap(block)->eraseArgument(index);
929 return wrap(
unwrap(block)->getArgument(
static_cast<unsigned>(pos)));
935 unwrap(block)->print(stream);
947 return llvm::isa<BlockArgument>(
unwrap(value));
951 return llvm::isa<OpResult>(
unwrap(value));
955 return wrap(llvm::cast<BlockArgument>(
unwrap(value)).getOwner());
959 return static_cast<intptr_t
>(
960 llvm::cast<BlockArgument>(
unwrap(value)).getArgNumber());
964 llvm::cast<BlockArgument>(
unwrap(value)).setType(
unwrap(type));
968 return wrap(llvm::cast<OpResult>(
unwrap(value)).getOwner());
972 return static_cast<intptr_t
>(
973 llvm::cast<OpResult>(
unwrap(value)).getResultNumber());
989 unwrap(value).print(stream);
1006 return wrap(opOperand);
1014 intptr_t numExceptions,
1015 MlirOperation *exceptions) {
1020 for (intptr_t i = 0; i < numExceptions; ++i) {
1021 exceptionSet.insert(
unwrap(exceptions[i]));
1042 return unwrap(opOperand)->getOperandNumber();
1050 unwrap(opOperand)->getNextOperandUsingThisValue());
1055 return wrap(nextOpOperand);
1084 unwrap(type).print(stream);
1103 if (
auto typedAttr = llvm::dyn_cast<TypedAttr>(attr))
1104 return wrap(typedAttr.getType());
1123 unwrap(attr).print(stream);
1129 MlirAttribute attr) {
1166 if (!
unwrap(operation)->hasTrait<OpTrait::SymbolTable>())
1172 delete unwrap(symbolTable);
1181 MlirOperation operation) {
1186 MlirOperation operation) {
1192 MlirOperation from) {
1193 auto *cppFrom =
unwrap(from);
1194 auto *context = cppFrom->getContext();
1202 void (*callback)(MlirOperation,
bool,
1206 [&](
Operation *foundOpCpp,
bool isVisible) {
1207 callback(
wrap(foundOpCpp), isVisible,
unsigned mlirOpOperandGetOperandNumber(MlirOpOperand opOperand)
Returns the operand number of an op operand.
void mlirContextDestroy(MlirContext context)
Takes an MLIR context owned by the caller and destroys it.
void mlirOperationDump(MlirOperation op)
Prints an operation to stderr.
MlirAttribute mlirOperationGetDiscardableAttributeByName(MlirOperation op, MlirStringRef name)
Returns a discardable attribute attached to the operation given its name.
MlirOperation mlirSymbolTableLookup(MlirSymbolTable symbolTable, MlirStringRef name)
Looks up a symbol with the given name in the given symbol table and returns the operation that corres...
MlirRegion mlirRegionCreate()
Creates a new empty region and transfers ownership to the caller.
void mlirOperationPrint(MlirOperation op, MlirStringCallback callback, void *userData)
Prints an operation by sending chunks of the string representation and forwarding userData tocallback...
MlirContext mlirModuleGetContext(MlirModule module)
Gets the context that a module was created with.
void mlirValuePrint(MlirValue value, MlirStringCallback callback, void *userData)
Prints a value by sending chunks of the string representation and forwarding userData tocallback`.
MlirContext mlirLocationGetContext(MlirLocation location)
Gets the context that a location was created with.
MlirOperation mlirOpOperandGetOwner(MlirOpOperand opOperand)
Returns the owner operation of an op operand.
bool mlirDialectEqual(MlirDialect dialect1, MlirDialect dialect2)
Checks if two dialects that belong to the same context are equal.
MlirRegion mlirRegionGetNextInOperation(MlirRegion region)
Returns the region immediately following the given region in its parent operation.
MlirLogicalResult mlirOperationWriteBytecodeWithConfig(MlirOperation op, MlirBytecodeWriterConfig config, MlirStringCallback callback, void *userData)
Same as mlirOperationWriteBytecode but with writer config and returns failure only if desired bytecod...
MlirIdentifier mlirOperationGetName(MlirOperation op)
Gets the name of the operation as an identifier.
void mlirDialectRegistryDestroy(MlirDialectRegistry registry)
Takes a dialect registry owned by the caller and destroys it.
bool mlirIdentifierEqual(MlirIdentifier ident, MlirIdentifier other)
Checks whether two identifiers are the same.
void mlirOperationPrintWithFlags(MlirOperation op, MlirOpPrintingFlags flags, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts flags controlling the printing behavior.
bool mlirValueIsABlockArgument(MlirValue value)
Returns 1 if the value is a block argument, 0 otherwise.
MlirTypeID mlirTypeGetTypeID(MlirType type)
Gets the type ID of the type.
void mlirValueReplaceAllUsesOfWith(MlirValue oldValue, MlirValue newValue)
Replace all uses of 'of' value with the 'with' value, updating anything in the IR that uses 'of' to u...
MlirValue mlirBlockAddArgument(MlirBlock block, MlirType type, MlirLocation loc)
Appends an argument of the specified type to the block.
intptr_t mlirOperationGetNumRegions(MlirOperation op)
Returns the number of regions attached to the given operation.
MlirBlock mlirOperationGetBlock(MlirOperation op)
Gets the block that owns this operation, returning null if the operation is not owned.
void mlirContextAppendDialectRegistry(MlirContext ctx, MlirDialectRegistry registry)
Append the contents of the given dialect registry to the registry associated with the context.
MlirIdentifier mlirIdentifierGet(MlirContext context, MlirStringRef str)
Gets an identifier with the given string value.
void mlirBlockArgumentSetType(MlirValue value, MlirType type)
Sets the type of the block argument to the given type.
MlirLocation mlirLocationFileLineColGet(MlirContext context, MlirStringRef filename, unsigned line, unsigned col)
Creates an File/Line/Column location owned by the given context.
intptr_t mlirContextGetNumLoadedDialects(MlirContext context)
Returns the number of dialects loaded by the context.
MlirNamedAttribute mlirNamedAttributeGet(MlirIdentifier name, MlirAttribute attr)
Associates an attribute with the name. Takes ownership of neither.
MlirStringRef mlirSymbolTableGetVisibilityAttributeName()
Returns the name of the attribute used to store symbol visibility.
void mlirOperationStateAddAttributes(MlirOperationState *state, intptr_t n, MlirNamedAttribute const *attributes)
MlirValue mlirOperationGetResult(MlirOperation op, intptr_t pos)
Returns pos-th result of the operation.
void mlirSymbolTableWalkSymbolTables(MlirOperation from, bool allSymUsesVisible, void(*callback)(MlirOperation, bool, void *userData), void *userData)
Walks all symbol table operations nested within, and including, op.
void mlirContextLoadAllAvailableDialects(MlirContext context)
Eagerly loads all available dialects registered with a context, making them available for use for IR ...
void mlirAttributePrint(MlirAttribute attr, MlirStringCallback callback, void *userData)
Prints an attribute by sending chunks of the string representation and forwarding userData tocallback...
MlirBlock mlirRegionGetFirstBlock(MlirRegion region)
Gets the first block in the region.
MlirLogicalResult mlirSymbolTableReplaceAllSymbolUses(MlirStringRef oldSymbol, MlirStringRef newSymbol, MlirOperation from)
Attempt to replace all uses that are nested within the given operation of the given symbol 'oldSymbol...
MlirLocation mlirLocationFusedGet(MlirContext ctx, intptr_t nLocations, MlirLocation const *locations, MlirAttribute metadata)
Creates a fused location with an array of locations and metadata.
MlirAsmState mlirAsmStateCreateForValue(MlirValue value, MlirOpPrintingFlags flags)
Creates new AsmState from value.
intptr_t mlirOperationGetNumResults(MlirOperation op)
Returns the number of results of the operation.
MlirOpOperand mlirValueGetFirstUse(MlirValue value)
Returns an op operand representing the first use of the value, or a null op operand if there are no u...
void mlirRegionInsertOwnedBlockAfter(MlirRegion region, MlirBlock reference, MlirBlock block)
Takes a block owned by the caller and inserts it after the (non-owned) reference block in the given r...
void mlirOperationDestroy(MlirOperation op)
Takes an operation owned by the caller and destroys it.
void mlirValueReplaceAllUsesExcept(MlirValue oldValue, MlirValue newValue, intptr_t numExceptions, MlirOperation *exceptions)
Replace all uses of 'of' value with 'with' value, updating anything in the IR that uses 'of' to use '...
void mlirBlockAppendOwnedOperation(MlirBlock block, MlirOperation operation)
Takes an operation owned by the caller and appends it to the block.
MlirRegion mlirOperationGetFirstRegion(MlirOperation op)
Returns first region attached to the operation.
MlirAttribute mlirOperationGetInherentAttributeByName(MlirOperation op, MlirStringRef name)
Returns an inherent attribute attached to the operation given its name.
MlirDialect mlirContextGetOrLoadDialect(MlirContext context, MlirStringRef name)
Gets the dialect instance owned by the given context using the dialect namespace to identify it,...
MlirContext mlirAttributeGetContext(MlirAttribute attribute)
Gets the context that an attribute was created with.
MlirStringRef mlirSymbolTableGetSymbolAttributeName()
Returns the name of the attribute used to store symbol names compatible with symbol tables.
void mlirBlockInsertOwnedOperation(MlirBlock block, intptr_t pos, MlirOperation operation)
Takes an operation owned by the caller and inserts it as pos to the block.
MlirRegion mlirBlockGetParentRegion(MlirBlock block)
Returns the region that contains this block.
MlirType mlirValueGetType(MlirValue value)
Returns the type of the value.
void mlirOperationMoveAfter(MlirOperation op, MlirOperation other)
Moves the given operation immediately after the other operation in its parent block.
void mlirRegionAppendOwnedBlock(MlirRegion region, MlirBlock block)
Takes a block owned by the caller and appends it to the given region.
void mlirBlockPrint(MlirBlock block, MlirStringCallback callback, void *userData)
Prints a block by sending chunks of the string representation and forwarding userData tocallback`.
void mlirOperationSetDiscardableAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Sets a discardable attribute by name, replacing the existing if it exists or adding a new one otherwi...
MlirOpPrintingFlags mlirOpPrintingFlagsCreate()
Creates new printing flags with defaults, intended for customization.
void mlirOpPrintingFlagsElideLargeElementsAttrs(MlirOpPrintingFlags flags, intptr_t largeElementLimit)
Enables the elision of large elements attributes by printing a lexically valid but otherwise meaningl...
MlirBlock mlirBlockGetNextInRegion(MlirBlock block)
Returns the block immediately following the given block in its parent region.
void mlirOperationSetSuccessor(MlirOperation op, intptr_t pos, MlirBlock block)
Set pos-th successor of the operation.
MlirValue mlirOpOperandGetValue(MlirOpOperand opOperand)
Returns the value of an op operand.
#define APPEND_ELEMS(type, sizeName, elemName)
bool mlirContextIsRegisteredOperation(MlirContext context, MlirStringRef name)
Returns whether the given fully-qualified operation (i.e.
MlirOperation mlirOperationGetNextInBlock(MlirOperation op)
Returns an operation immediately following the given operation it its enclosing block.
void mlirOpPrintingFlagsEnableDebugInfo(MlirOpPrintingFlags flags, bool enable, bool prettyForm)
Enable or disable printing of debug information (based on enable).
MlirOperation mlirModuleGetOperation(MlirModule module)
Views the module as a generic operation.
static mlir::WalkResult unwrap(MlirWalkResult result)
void mlirOpPrintingFlagsElideLargeResourceString(MlirOpPrintingFlags flags, intptr_t largeResourceLimit)
Enables the elision of large resources strings by omitting them from the dialect_resources section.
void mlirRegionInsertOwnedBlockBefore(MlirRegion region, MlirBlock reference, MlirBlock block)
Takes a block owned by the caller and inserts it before the (non-owned) reference block in the given ...
MlirValue mlirBlockGetArgument(MlirBlock block, intptr_t pos)
Returns pos-th argument of the block.
MlirStringRef mlirDialectGetNamespace(MlirDialect dialect)
Returns the namespace of the given dialect.
void mlirOpPrintingFlagsUseLocalScope(MlirOpPrintingFlags flags)
Use local scope when printing the operation.
MlirTypeID mlirOperationGetTypeID(MlirOperation op)
Gets the type id of the operation.
intptr_t mlirBlockArgumentGetArgNumber(MlirValue value)
Returns the position of the value in the argument list of its block.
void mlirOperationWalk(MlirOperation op, MlirOperationWalkCallback callback, void *userData, MlirWalkOrder walkOrder)
Walks operation op in walkOrder and calls callback on that operation.
MlirBlock mlirOperationGetSuccessor(MlirOperation op, intptr_t pos)
Returns pos-th successor of the operation.
void mlirBlockInsertOwnedOperationBefore(MlirBlock block, MlirOperation reference, MlirOperation operation)
Takes an operation owned by the caller and inserts it before the (non-owned) reference operation in t...
bool mlirAttributeEqual(MlirAttribute a1, MlirAttribute a2)
Checks if two attributes are equal.
MlirAsmState mlirAsmStateCreateForOperation(MlirOperation op, MlirOpPrintingFlags flags)
Creates new AsmState, as with AsmState the IR should not be mutated in-between using this state.
bool mlirOperationEqual(MlirOperation op, MlirOperation other)
Checks whether two operation handles point to the same operation.
void mlirOperationSetInherentAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Sets an inherent attribute by name, replacing the existing if it exists.
void mlirOpPrintingFlagsAssumeVerified(MlirOpPrintingFlags flags)
Do not verify the operation when using custom operation printers.
bool mlirValueEqual(MlirValue value1, MlirValue value2)
Returns 1 if two values are equal, 0 otherwise.
MlirContext mlirIdentifierGetContext(MlirIdentifier ident)
Returns the context associated with this identifier.
void mlirBytecodeWriterConfigDestroy(MlirBytecodeWriterConfig config)
Destroys printing flags created with mlirBytecodeWriterConfigCreate.
void mlirModuleDestroy(MlirModule module)
Takes a module owned by the caller and deletes it.
MlirModule mlirModuleCreateEmpty(MlirLocation location)
Creates a new, empty module and transfers ownership to the caller.
void mlirOpPrintingFlagsPrintGenericOpForm(MlirOpPrintingFlags flags)
Always print operations in the generic form.
MlirOperation mlirOperationGetParentOperation(MlirOperation op)
Gets the operation that owns this operation, returning null if the operation is not owned.
void mlirRegionTakeBody(MlirRegion target, MlirRegion source)
Moves the entire content of the source region to the target region.
MlirValue mlirBlockInsertArgument(MlirBlock block, intptr_t pos, MlirType type, MlirLocation loc)
Inserts an argument of the specified type at a specified index to the block.
void mlirValueSetType(MlirValue value, MlirType type)
Set the type of the value.
intptr_t mlirOperationGetNumSuccessors(MlirOperation op)
Returns the number of successor blocks of the operation.
MlirDialect mlirAttributeGetDialect(MlirAttribute attr)
Gets the dialect of the attribute.
void mlirLocationPrint(MlirLocation location, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData tocallback`.
void mlirOperationSetAttributeByName(MlirOperation op, MlirStringRef name, MlirAttribute attr)
Sets an attribute by name, replacing the existing if it exists or adding a new one otherwise.
void mlirBlockDestroy(MlirBlock block)
Takes a block owned by the caller and destroys it.
void mlirRegionInsertOwnedBlock(MlirRegion region, intptr_t pos, MlirBlock block)
Takes a block owned by the caller and inserts it at pos to the given region.
void mlirOperationSetOperand(MlirOperation op, intptr_t pos, MlirValue newValue)
Sets the pos-th operand of the operation.
intptr_t mlirBlockGetNumArguments(MlirBlock block)
Returns the number of arguments of the block.
MlirOperation mlirOpResultGetOwner(MlirValue value)
Returns an operation that produced this value as its result.
void mlirBlockEraseArgument(MlirBlock block, unsigned index)
Erase the argument at 'index' and remove it from the argument list.
bool mlirOpOperandIsNull(MlirOpOperand opOperand)
Returns whether the op operand is null.
MlirDialect mlirTypeGetDialect(MlirType type)
Gets the dialect a type belongs to.
MlirModule mlirModuleCreateParse(MlirContext context, MlirStringRef module)
Parses a module from the string and transfers ownership to the caller.
MlirContext mlirContextCreateWithRegistry(MlirDialectRegistry registry, bool threadingEnabled)
Creates an MLIR context, setting the multithreading setting explicitly and pre-loading the dialects f...
void mlirContextSetAllowUnregisteredDialects(MlirContext context, bool allow)
Sets whether unregistered dialects are allowed in this context.
void mlirOperationStateAddResults(MlirOperationState *state, intptr_t n, MlirType const *results)
Adds a list of components to the operation state.
void mlirOperationMoveBefore(MlirOperation op, MlirOperation other)
Moves the given operation immediately before the other operation in its parent block.
static LogicalResult inferOperationTypes(OperationState &state)
MlirOperation mlirOperationClone(MlirOperation op)
Creates a deep copy of an operation.
void mlirValuePrintAsOperand(MlirValue value, MlirAsmState state, MlirStringCallback callback, void *userData)
Prints a value as an operand (i.e., the ValueID).
MlirBlock mlirBlockArgumentGetOwner(MlirValue value)
Returns the block in which this value is defined as an argument.
MlirDialectRegistry mlirDialectRegistryCreate()
Creates a dialect registry and transfers its ownership to the caller.
MlirValue mlirOperationGetOperand(MlirOperation op, intptr_t pos)
Returns pos-th operand of the operation.
bool mlirContextGetAllowUnregisteredDialects(MlirContext context)
Returns whether the context allows unregistered dialects.
MlirAttribute mlirLocationGetAttribute(MlirLocation location)
Returns the underlying location attribute of this location.
MlirModule mlirModuleFromOperation(MlirOperation op)
Views the generic operation as a module.
MlirLocation mlirOperationGetLocation(MlirOperation op)
Gets the location of the operation.
bool mlirTypeEqual(MlirType t1, MlirType t2)
Checks if two types are equal.
bool mlirContextEqual(MlirContext ctx1, MlirContext ctx2)
Checks if two contexts are equal.
MlirAttribute mlirOperationGetAttributeByName(MlirOperation op, MlirStringRef name)
Returns an attribute attached to the operation given its name.
MlirTypeID mlirAttributeGetTypeID(MlirAttribute attr)
Gets the type id of the attribute.
static Operation * findParent(Operation *op, bool shouldUseLocalScope)
MlirAttribute mlirSymbolTableInsert(MlirSymbolTable symbolTable, MlirOperation operation)
Inserts the given operation into the given symbol table.
intptr_t mlirOperationGetNumDiscardableAttributes(MlirOperation op)
Returns the number of discardable attributes attached to the operation.
MlirSymbolTable mlirSymbolTableCreate(MlirOperation operation)
Creates a symbol table for the given operation.
void mlirOperationStateAddOwnedRegions(MlirOperationState *state, intptr_t n, MlirRegion const *regions)
MlirLocation mlirLocationUnknownGet(MlirContext context)
Creates a location with unknown position owned by the given context.
MlirOperation mlirBlockGetFirstOperation(MlirBlock block)
Returns the first operation in the block.
MlirType mlirAttributeGetType(MlirAttribute attribute)
Gets the type of this attribute.
bool mlirOperationRemoveDiscardableAttributeByName(MlirOperation op, MlirStringRef name)
Removes a discardable attribute by name.
void mlirRegionDestroy(MlirRegion region)
Takes a region owned by the caller and destroys it.
bool mlirOperationRemoveAttributeByName(MlirOperation op, MlirStringRef name)
Removes an attribute by name.
bool mlirValueIsAOpResult(MlirValue value)
Returns 1 if the value is an operation result, 0 otherwise.
MLIR_CAPI_EXPORTED bool mlirOperationHasInherentAttributeByName(MlirOperation op, MlirStringRef name)
Returns true if this operation defines an inherent attribute with this name.
MlirContext mlirContextCreateWithThreading(bool threadingEnabled)
Creates an MLIR context with an explicit setting of the multithreading setting and transfers its owne...
MlirOperation mlirBlockGetTerminator(MlirBlock block)
Returns the terminator operation in the block or null if no terminator.
bool mlirLocationEqual(MlirLocation l1, MlirLocation l2)
Checks if two locations are equal.
MlirRegion mlirOperationGetRegion(MlirOperation op, intptr_t pos)
Returns pos-th region attached to the operation.
MlirOperation mlirOperationCreate(MlirOperationState *state)
Creates an operation and transfers ownership to the caller.
void mlirBytecodeWriterConfigDesiredEmitVersion(MlirBytecodeWriterConfig flags, int64_t version)
Sets the version to emit in the writer config.
MlirAttribute mlirAttributeParseGet(MlirContext context, MlirStringRef attr)
Parses an attribute. The attribute is owned by the context.
void mlirOperationRemoveFromParent(MlirOperation op)
Removes the given operation from its parent block.
void mlirSymbolTableDestroy(MlirSymbolTable symbolTable)
Destroys the symbol table created with mlirSymbolTableCreate.
MlirContext mlirContextCreate()
Creates an MLIR context and transfers its ownership to the caller.
void mlirOperationPrintWithState(MlirOperation op, MlirAsmState state, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but accepts AsmState controlling the printing behavior as well as caching ...
bool mlirOperationVerify(MlirOperation op)
Verify the operation and return true if it passes, false if it fails.
void mlirBlockDetach(MlirBlock block)
Detach a block from the owning region and assume ownership.
MlirNamedAttribute mlirOperationGetAttribute(MlirOperation op, intptr_t pos)
Return pos-th attribute of the operation.
void mlirOpPrintingFlagsDestroy(MlirOpPrintingFlags flags)
Destroys printing flags created with mlirOpPrintingFlagsCreate.
MlirLocation mlirLocationCallSiteGet(MlirLocation callee, MlirLocation caller)
Creates a call site location with a callee and a caller.
void mlirOperationWriteBytecode(MlirOperation op, MlirStringCallback callback, void *userData)
Same as mlirOperationPrint but writing the bytecode format.
void mlirValueDump(MlirValue value)
Prints the value to the standard error stream.
void mlirBlockInsertOwnedOperationAfter(MlirBlock block, MlirOperation reference, MlirOperation operation)
Takes an operation owned by the caller and inserts it after the (non-owned) reference operation in th...
intptr_t mlirContextGetNumRegisteredDialects(MlirContext context)
Returns the number of dialects registered with the given context.
void mlirOperationSetOperands(MlirOperation op, intptr_t nOperands, MlirValue const *operands)
Replaces the operands of the operation.
static MLIRContext::Threading toThreadingEnum(bool threadingEnabled)
MlirContext mlirTypeGetContext(MlirType type)
Gets the context that a type was created with.
void mlirTypePrint(MlirType type, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData tocallback`.
MlirBlock mlirModuleGetBody(MlirModule module)
Gets the body of the module, i.e. the only block it contains.
MlirContext mlirDialectGetContext(MlirDialect dialect)
Returns the context that owns the dialect.
bool mlirRegionEqual(MlirRegion region, MlirRegion other)
Checks whether two region handles point to the same region.
MlirOperation mlirOperationCreateParse(MlirContext context, MlirStringRef sourceStr, MlirStringRef sourceName)
Parses an operation, giving ownership to the caller.
void mlirAsmStateDestroy(MlirAsmState state)
Destroys printing flags created with mlirAsmStateCreate.
MlirContext mlirOperationGetContext(MlirOperation op)
Gets the context this operation is associated with.
intptr_t mlirOpResultGetResultNumber(MlirValue value)
Returns the position of the value in the list of results of the operation that produced it.
MlirLocation mlirLocationNameGet(MlirContext context, MlirStringRef name, MlirLocation childLoc)
Creates a name location owned by the given context.
bool mlirBlockEqual(MlirBlock block, MlirBlock other)
Checks whether two blocks handles point to the same block.
void mlirSymbolTableErase(MlirSymbolTable symbolTable, MlirOperation operation)
Removes the given operation from the symbol table and erases it.
MlirNamedAttribute mlirOperationGetDiscardableAttribute(MlirOperation op, intptr_t pos)
Return pos-th discardable attribute of the operation.
void mlirOperationStateEnableResultTypeInference(MlirOperationState *state)
Enables result type inference for the operation under construction.
void mlirOperationStateAddSuccessors(MlirOperationState *state, intptr_t n, MlirBlock const *successors)
MlirBytecodeWriterConfig mlirBytecodeWriterConfigCreate()
Creates new printing flags with defaults, intended for customization.
void mlirAttributeDump(MlirAttribute attr)
Prints the attribute to the standard error stream.
MlirStringRef mlirIdentifierStr(MlirIdentifier ident)
Gets the string value of the identifier.
void mlirOpPrintingFlagsSkipRegions(MlirOpPrintingFlags flags)
Skip printing regions.
void mlirOperationStateAddOperands(MlirOperationState *state, intptr_t n, MlirValue const *operands)
MlirOperationState mlirOperationStateGet(MlirStringRef name, MlirLocation loc)
Constructs an operation state from a name and a location.
MlirLocation mlirLocationFromAttribute(MlirAttribute attribute)
Creates a location from a location attribute.
MlirOperation mlirBlockGetParentOperation(MlirBlock block)
Returns the closest surrounding operation that contains this block.
MlirOpOperand mlirOpOperandGetNextUse(MlirOpOperand opOperand)
Returns an op operand representing the next use of the value, or a null op operand if there is no nex...
intptr_t mlirOperationGetNumOperands(MlirOperation op)
Returns the number of operands of the operation.
void mlirContextSetThreadPool(MlirContext context, MlirLlvmThreadPool threadPool)
Sets the thread pool of the context explicitly, enabling multithreading in the process.
MlirType mlirTypeParseGet(MlirContext context, MlirStringRef type)
Parses a type. The type is owned by the context.
MlirBlock mlirBlockCreate(intptr_t nArgs, MlirType const *args, MlirLocation const *locs)
Creates a new empty block with the given argument types and transfers ownership to the caller.
void mlirContextEnableMultithreading(MlirContext context, bool enable)
Set threading mode (must be set to false to mlir-print-ir-after-all).
void mlirTypeDump(MlirType type)
Prints the type to the standard error stream.
intptr_t mlirOperationGetNumAttributes(MlirOperation op)
Returns the number of attributes attached to the operation.
static MLIRContext * getContext(OpFoldResult val)
static llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
This class provides management for the lifetime of the state used when printing the IR.
Attributes are known-constant values of operations.
MLIRContext * getContext() const
Return the context this attribute belongs to.
Block represents an ordered list of Operations.
OpListType::iterator iterator
Region * getParent() const
Provide a 'getParent' method for ilist_node_with_parent methods.
BlockArgument addArgument(Type type, Location loc)
Add one value to the argument list.
OpListType & getOperations()
This class contains the configuration used for the bytecode writer.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
static FileLineColLoc get(StringAttr filename, unsigned line, unsigned column)
Location objects represent source locations information in MLIR.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
void reserve(size_type N)
NamedAttribute represents a combination of a name and an Attribute value.
StringAttr getName() const
Return the name of the attribute.
Attribute getValue() const
Return the value of the attribute.
This class represents an operand of an operation.
Set of flags used to control the behavior of the various IR print methods (e.g.
This class provides the API for ops that are known to be isolated from above.
This class provides the API for ops that are known to be terminators.
Simple wrapper around a void* in order to express generically how to pass in op properties through AP...
Operation is the basic unit of execution within MLIR.
bool hasTrait()
Returns true if the operation was registered with a particular trait, e.g.
unsigned getNumRegions()
Returns the number of regions held by this operation.
static Operation * create(Location location, OperationName name, TypeRange resultTypes, ValueRange operands, NamedAttrList &&attributes, OpaqueProperties properties, BlockRange successors, unsigned numRegions)
Create a new Operation with the specific fields.
Operation * getParentOp()
Returns the closest surrounding operation that contains this operation or nullptr if this is a top-le...
Region & getRegion(unsigned index)
Returns the region held by this operation at position 'index'.
OpTy release()
Release the referenced op.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
unsigned getRegionNumber()
Return the number of this region in the parent operation.
Operation * getParentOp()
Return the parent operation this region is attached to.
BlockListType & getBlocks()
BlockListType::iterator iterator
This class allows for representing and managing the symbol table used by operations with the 'SymbolT...
static StringRef getSymbolAttrName()
Return the name of the attribute used for symbol names.
static LogicalResult replaceAllSymbolUses(StringAttr oldSymbol, StringAttr newSymbol, Operation *from)
Attempt to replace all uses of the given symbol 'oldSymbol' with the provided symbol 'newSymbol' that...
static StringRef getVisibilityAttrName()
Return the name of the attribute used for symbol visibility.
static void walkSymbolTables(Operation *op, bool allSymUsesVisible, function_ref< void(Operation *, bool)> callback)
Walks all symbol table operations nested within, and including, op.
OperandType * getOperand() const
Returns the current operands.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
bool use_empty() const
Returns true if this value has no uses.
void replaceAllUsesExcept(Value newValue, const SmallPtrSetImpl< Operation * > &exceptions)
Replace all uses of 'this' value with 'newValue', updating anything in the IR that uses 'this' to use...
void printAsOperand(raw_ostream &os, AsmState &state) const
Print this value as if it were an operand.
Location getLoc() const
Return the location of this value.
use_iterator use_begin() const
A utility result that is used to signal how to proceed with an ongoing walk:
static WalkResult advance()
static WalkResult interrupt()
A simple raw ostream subclass that forwards write_impl calls to the user-supplied callback together w...
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
MlirWalkResult(* MlirOperationWalkCallback)(MlirOperation, void *userData)
Operation walker type.
MlirWalkOrder
Traversal order for operation walk.
MlirWalkResult
Operation walk result.
@ MlirWalkResultInterrupt
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
static bool mlirLocationIsNull(MlirLocation location)
Checks if the location is null.
static bool mlirOperationIsNull(MlirOperation op)
Checks whether the underlying operation is null.
#define MLIR_CAPI_EXPORTED
void(* MlirStringCallback)(MlirStringRef, void *)
A callback for returning string references.
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.
Attribute parseAttribute(llvm::StringRef attrStr, MLIRContext *context, Type type={}, size_t *numRead=nullptr, bool isKnownNullTerminated=false)
This parses a single MLIR attribute to an MLIR context if it was valid.
LogicalResult parseSourceString(llvm::StringRef sourceStr, Block *block, const ParserConfig &config, StringRef sourceName="", LocationAttr *sourceFileLoc=nullptr)
This parses the IR string and appends parsed operations to the given block.
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
Type parseType(llvm::StringRef typeStr, MLIRContext *context, size_t *numRead=nullptr, bool isKnownNullTerminated=false)
This parses a single MLIR type to an MLIR context if it was valid.
LogicalResult writeBytecodeToFile(Operation *op, raw_ostream &os, const BytecodeWriterConfig &config={})
Write the bytecode for the given operation to the provided output stream.
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
A logical result value, essentially a boolean with named states.
An auxiliary class for constructing operations.
A pointer to a sized fragment of a string, not necessarily null-terminated.
const char * data
Pointer to the first symbol.
size_t length
Length of the fragment.
This represents an operation in an abstracted form, suitable for use with the builder APIs.
void addOperands(ValueRange newOperands)
void addAttribute(StringRef name, Attribute attr)
Add an attribute with the specified name.
void addSuccessors(Block *successor)
Adds a successor to the operation sate. successor must not be null.
void addTypes(ArrayRef< Type > newTypes)
SmallVector< Type, 4 > types
Types of the results of this operation.
Region * addRegion()
Create a region that should be attached to the operation.