| //===- DestinationStyleOpInterface.cpp -- Destination style ops -----------===// | |
| // | |
| // 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/Interfaces/DestinationStyleOpInterface.h" | |
| using namespace mlir; | |
| namespace mlir { | |
| #include "mlir/Interfaces/DestinationStyleOpInterface.cpp.inc" | |
| } // namespace mlir | |
| namespace { | |
| size_t getNumTensorResults(Operation *op) { | |
| size_t numTensorResults = 0; | |
| for (auto t : op->getResultTypes()) { | |
| if (isa<TensorType>(t)) { | |
| ++numTensorResults; | |
| } | |
| } | |
| return numTensorResults; | |
| } | |
| } // namespace | |
| LogicalResult detail::verifyDestinationStyleOpInterface(Operation *op) { | |
| DestinationStyleOpInterface dstStyleOp = | |
| cast<DestinationStyleOpInterface>(op); | |
| SmallVector<OpOperand *> outputTensorOperands; | |
| for (OpOperand &operand : dstStyleOp.getDpsInitsMutable()) { | |
| Type type = operand.get().getType(); | |
| if (isa<TensorType>(type)) { | |
| outputTensorOperands.push_back(&operand); | |
| } else if (!isa<BaseMemRefType>(type)) { | |
| return op->emitOpError("expected that operand #") | |
| << operand.getOperandNumber() << " is a tensor or a memref"; | |
| } | |
| } | |
| // Verify the number of tensor results matches the number of output tensors. | |
| if (getNumTensorResults(op) != outputTensorOperands.size()) | |
| return op->emitOpError("expected the number of tensor results (") | |
| << getNumTensorResults(op) | |
| << ") to be equal to the number of output tensors (" | |
| << outputTensorOperands.size() << ")"; | |
| for (OpOperand *opOperand : outputTensorOperands) { | |
| OpResult result = dstStyleOp.getTiedOpResult(opOperand); | |
| if (result.getType() != opOperand->get().getType()) | |
| return op->emitOpError("expected type of operand #") | |
| << opOperand->getOperandNumber() << " (" | |
| << opOperand->get().getType() << ")" | |
| << " to match type of corresponding result (" << result.getType() | |
| << ")"; | |
| } | |
| return success(); | |
| } |