include "mlir/Interfaces/ShapedOpInterfaces.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "mlir/Interfaces/ViewLikeInterface.td"
+include "mlir/IR/OpAsmInterface.td"
include "mlir/IR/SymbolInterfaces.td"
/// A TypeAttr for memref types.
// AllocOp
//===----------------------------------------------------------------------===//
-def MemRef_AllocOp : AllocLikeOp<"alloc", DefaultResource, []> {
+def MemRef_AllocOp : AllocLikeOp<"alloc", DefaultResource, [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>]> {
let summary = "memory allocation operation";
let description = [{
The `alloc` operation allocates a region of memory, as specified by its
// AllocaOp
//===----------------------------------------------------------------------===//
-def MemRef_AllocaOp : AllocLikeOp<"alloca", AutomaticAllocationScopeResource> {
+def MemRef_AllocaOp : AllocLikeOp<"alloca", AutomaticAllocationScopeResource,[
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>]> {
let summary = "stack memory allocation operation";
let description = [{
The `alloca` operation allocates memory on the stack, to be automatically
//===----------------------------------------------------------------------===//
def MemRef_CastOp : MemRef_Op<"cast", [
- NoSideEffect, SameOperandsAndResultShape,
DeclareOpInterfaceMethods<CastOpInterface>,
- ViewLikeOpInterface,
- MemRefsNormalizable
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ MemRefsNormalizable,
+ NoSideEffect,
+ SameOperandsAndResultShape,
+ ViewLikeOpInterface
]> {
let summary = "memref cast operation";
let description = [{
// CopyOp
//===----------------------------------------------------------------------===//
-def CopyOp : MemRef_Op<"copy",
- [CopyOpInterface, SameOperandsElementType, SameOperandsShape]> {
+def CopyOp : MemRef_Op<"copy", [CopyOpInterface, SameOperandsElementType,
+ SameOperandsShape]> {
let description = [{
Copies the data from the source to the destination memref.
// DimOp
//===----------------------------------------------------------------------===//
-def MemRef_DimOp : MemRef_Op<"dim", [NoSideEffect, MemRefsNormalizable,
- ShapedDimOpInterface]> {
+def MemRef_DimOp : MemRef_Op<"dim", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ MemRefsNormalizable,
+ NoSideEffect,
+ ShapedDimOpInterface]> {
let summary = "dimension index operation";
let description = [{
The `dim` operation takes a memref and a dimension operand of type `index`.
// ExtractAlignedPointerAsIndexOp
//===----------------------------------------------------------------------===//
-def MemRef_ExtractAlignedPointerAsIndexOp : MemRef_Op<"extract_aligned_pointer_as_index",
- [NoSideEffect, SameVariadicResultSize]> {
+def MemRef_ExtractAlignedPointerAsIndexOp :
+ MemRef_Op<"extract_aligned_pointer_as_index", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ NoSideEffect,
+ SameVariadicResultSize]> {
let summary = "Extracts a memref's underlying aligned pointer as an index";
let description = [{
Extracts the underlying aligned pointer as an index.
// ExtractStridedMetadataOp
//===----------------------------------------------------------------------===//
-def MemRef_ExtractStridedMetadataOp : MemRef_Op<"extract_strided_metadata",
- [NoSideEffect, SameVariadicResultSize]> {
+def MemRef_ExtractStridedMetadataOp : MemRef_Op<"extract_strided_metadata", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ NoSideEffect,
+ SameVariadicResultSize]> {
let summary = "Extracts a buffer base with offset and strides";
let description = [{
Extracts a base buffer, offset and strides. This op allows additional layers
def MemRef_ReinterpretCastOp
: MemRef_OpWithOffsetSizesAndStrides<"reinterpret_cast", [
- NoSideEffect, AttrSizedOperandSegments, ViewLikeOpInterface,
- OffsetSizeAndStrideOpInterface, MemRefsNormalizable
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ AttrSizedOperandSegments,
+ MemRefsNormalizable,
+ NoSideEffect,
+ OffsetSizeAndStrideOpInterface,
+ ViewLikeOpInterface
]> {
let summary = "memref reinterpret cast operation";
let description = [{
//===----------------------------------------------------------------------===//
def MemRef_ReshapeOp: MemRef_Op<"reshape", [
- ViewLikeOpInterface, NoSideEffect]> {
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ NoSideEffect,
+ ViewLikeOpInterface]> {
let summary = "memref reshape operation";
let description = [{
The `reshape` operation converts a memref from one type to an
let hasVerifier = 1;
}
-def MemRef_ExpandShapeOp : MemRef_ReassociativeReshapeOp<"expand_shape"> {
+def MemRef_ExpandShapeOp : MemRef_ReassociativeReshapeOp<"expand_shape", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>]> {
let summary = "operation to produce a memref with a higher rank.";
let description = [{
The `memref.expand_shape` op produces a new view with a higher rank whose
let hasVerifier = 1;
}
-def MemRef_CollapseShapeOp : MemRef_ReassociativeReshapeOp<"collapse_shape"> {
+def MemRef_CollapseShapeOp : MemRef_ReassociativeReshapeOp<"collapse_shape", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>]> {
let summary = "operation to produce a memref with a smaller rank.";
let description = [{
The `memref.collapse_shape` op produces a new view with a smaller rank
//===----------------------------------------------------------------------===//
def SubViewOp : MemRef_OpWithOffsetSizesAndStrides<"subview", [
- DeclareOpInterfaceMethods<ViewLikeOpInterface>, NoSideEffect,
- AttrSizedOperandSegments, OffsetSizeAndStrideOpInterface
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ DeclareOpInterfaceMethods<ViewLikeOpInterface>,
+ AttrSizedOperandSegments,
+ OffsetSizeAndStrideOpInterface,
+ NoSideEffect
]> {
let summary = "memref subview operation";
let description = [{
// TransposeOp
//===----------------------------------------------------------------------===//
-def MemRef_TransposeOp : MemRef_Op<"transpose", [NoSideEffect]>,
+def MemRef_TransposeOp : MemRef_Op<"transpose", [
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ NoSideEffect]>,
Arguments<(ins AnyStridedMemRef:$in, AffineMapAttr:$permutation)>,
Results<(outs AnyStridedMemRef)> {
let summary = "`transpose` produces a new strided memref (metadata-only)";
//===----------------------------------------------------------------------===//
def MemRef_ViewOp : MemRef_Op<"view", [
- DeclareOpInterfaceMethods<ViewLikeOpInterface>, NoSideEffect]> {
+ DeclareOpInterfaceMethods<OpAsmOpInterface, ["getAsmResultNames"]>,
+ DeclareOpInterfaceMethods<ViewLikeOpInterface>,
+ NoSideEffect]> {
let summary = "memref view operation";
let description = [{
The "view" operation extracts an N-D contiguous memref with empty layout map
// AllocOp / AllocaOp
//===----------------------------------------------------------------------===//
+void AllocOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "alloc");
+}
+
+void AllocaOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "alloca");
+}
+
template <typename AllocLikeOp>
static LogicalResult verifyAllocLikeOp(AllocLikeOp op) {
static_assert(llvm::is_one_of<AllocLikeOp, AllocOp, AllocaOp>::value,
// CastOp
//===----------------------------------------------------------------------===//
+void CastOp::getAsmResultNames(function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "cast");
+}
+
/// Determines whether MemRef_CastOp casts to a more dynamic version of the
/// source memref. This is useful to to fold a memref.cast into a consuming op
/// and implement canonicalization patterns for ops in different dialects that
// DimOp
//===----------------------------------------------------------------------===//
+void DimOp::getAsmResultNames(function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "dim");
+}
+
void DimOp::build(OpBuilder &builder, OperationState &result, Value source,
int64_t index) {
auto loc = result.location;
}
//===----------------------------------------------------------------------===//
+// ExtractAlignedPointerAsIndexOp
+//===----------------------------------------------------------------------===//
+
+void ExtractAlignedPointerAsIndexOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "intptr");
+}
+
+//===----------------------------------------------------------------------===//
+// ExtractStridedMetadataOp
+//===----------------------------------------------------------------------===//
+
+void ExtractStridedMetadataOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getBaseBuffer(), "base_buffer");
+ setNameFn(getOffset(), "offset");
+ // For multi-result to work properly with pretty names and packed syntax `x:3`
+ // we can only give a pretty name to the first value in the pack.
+ if (!getSizes().empty()) {
+ setNameFn(getSizes().front(), "sizes");
+ setNameFn(getStrides().front(), "strides");
+ }
+}
+
+//===----------------------------------------------------------------------===//
// GenericAtomicRMWOp
//===----------------------------------------------------------------------===//
// ReinterpretCastOp
//===----------------------------------------------------------------------===//
+void ReinterpretCastOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "reinterpret_cast");
+}
+
/// Build a ReinterpretCastOp with all dynamic entries: `staticOffsets`,
/// `staticSizes` and `staticStrides` are automatically filled with
/// source-memref-rank sentinel values that encode dynamic entries.
// Reassociative reshape ops
//===----------------------------------------------------------------------===//
+void CollapseShapeOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "collapse_shape");
+}
+
+void ExpandShapeOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "expand_shape");
+}
+
/// Helper function for verifying the shape of ExpandShapeOp and ResultShapeOp
/// result and operand. Layout maps are verified separately.
///
// ReshapeOp
//===----------------------------------------------------------------------===//
+void ReshapeOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "reshape");
+}
+
LogicalResult ReshapeOp::verify() {
Type operandType = getSource().getType();
Type resultType = getResult().getType();
// SubViewOp
//===----------------------------------------------------------------------===//
+void SubViewOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "subview");
+}
+
/// A subview result type can be fully inferred from the source type and the
/// static representation of offsets, sizes and strides. Special sentinels
/// encode the dynamic case.
// TransposeOp
//===----------------------------------------------------------------------===//
+void TransposeOp::getAsmResultNames(
+ function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "transpose");
+}
+
/// Build a strided memref type by applying `permutationMap` tp `memRefType`.
static MemRefType inferTransposeResultType(MemRefType memRefType,
AffineMap permutationMap) {
// ViewOp
//===----------------------------------------------------------------------===//
+void ViewOp::getAsmResultNames(function_ref<void(Value, StringRef)> setNameFn) {
+ setNameFn(getResult(), "view");
+}
+
LogicalResult ViewOp::verify() {
auto baseType = getOperand(0).getType().cast<MemRefType>();
auto viewType = getType();