blob: 9a76f07f96f23278dce87c9af28ebd59662d2258 [file] [edit]
//===- MemoryAccessOpInterfaces.cpp ---------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/MemRef/IR/MemoryAccessOpInterfaces.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/IR/Operation.h"
#include "mlir/IR/Value.h"
//===----------------------------------------------------------------------===//
// IndexedAccessOpInterface and IndexedMemCpyOpInterface
//===----------------------------------------------------------------------===//
namespace mlir::memref {
#include "mlir/Dialect/MemRef/IR/MemoryAccessOpInterfaces.cpp.inc"
LogicalResult detail::verifyIndexedAccessOpInterface(Operation *op) {
auto iface = dyn_cast<IndexedAccessOpInterface>(op);
if (!iface)
return failure();
TypedValue<MemRefType> memref = iface.getAccessedMemref();
if (!memref) {
// Some operations do not always access memory through a memref.
return success();
}
if (memref.getType().getRank() !=
static_cast<int64_t>(iface.getIndices().size()))
return op->emitOpError(
"invalid number of indices for accessed memref, expected ")
<< memref.getType().getRank() << " but got "
<< iface.getIndices().size();
return success();
}
LogicalResult detail::verifyIndexedMemCopyOpInterface(Operation *op) {
auto iface = dyn_cast<IndexedMemCopyOpInterface>(op);
if (!iface)
return failure();
TypedValue<MemRefType> src = iface.getSrc();
TypedValue<MemRefType> dst = iface.getDst();
if (!src || !dst) {
// Allow operations to not always copy between memref arguments.
return success();
}
if (src.getType().getRank() !=
static_cast<int64_t>(iface.getSrcIndices().size()))
return op->emitOpError(
"invalid number of indices for source memref, expected " +
Twine(src.getType().getRank()) + ", got " +
Twine(iface.getSrcIndices().size()));
if (dst.getType().getRank() !=
static_cast<int64_t>(iface.getDstIndices().size()))
return op->emitOpError(
"invalid number of indices for destination memref, expected ")
<< dst.getType().getRank() << ", got "
<< iface.getDstIndices().size();
return success();
}
} // namespace mlir::memref