| //===- MemOpInterfaces.cpp - Memory operation interfaces ---------*- C++-*-===// | |
| // | |
| // 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/MemOpInterfaces.h" | |
| #include "mlir/IR/Attributes.h" | |
| #include "mlir/IR/Builders.h" | |
| #include "mlir/IR/BuiltinTypes.h" | |
| #include "mlir/IR/Value.h" | |
| using namespace mlir; | |
| LogicalResult mlir::detail::verifyMemorySpaceCastOpInterface(Operation *op) { | |
| auto memCastOp = cast<MemorySpaceCastOpInterface>(op); | |
| // Verify that the source and target pointers are valid | |
| Value sourcePtr = memCastOp.getSourcePtr(); | |
| Value targetPtr = memCastOp.getTargetPtr(); | |
| if (!sourcePtr || !targetPtr) { | |
| return op->emitError() | |
| << "memory space cast op must have valid source and target pointers"; | |
| } | |
| if (sourcePtr.getType().getTypeID() != targetPtr.getType().getTypeID()) { | |
| return op->emitError() | |
| << "expected source and target types of the same kind"; | |
| } | |
| // Verify the Types are of `PtrLikeTypeInterface` type. | |
| auto sourceType = dyn_cast<PtrLikeTypeInterface>(sourcePtr.getType()); | |
| if (!sourceType) { | |
| return op->emitError() | |
| << "source type must implement `PtrLikeTypeInterface`, but got: " | |
| << sourcePtr.getType(); | |
| } | |
| auto targetType = dyn_cast<PtrLikeTypeInterface>(targetPtr.getType()); | |
| if (!targetType) { | |
| return op->emitError() | |
| << "target type must implement `PtrLikeTypeInterface`, but got: " | |
| << targetPtr.getType(); | |
| } | |
| // Verify that the operation has exactly one result | |
| if (op->getNumResults() != 1) { | |
| return op->emitError() | |
| << "memory space cast op must have exactly one result"; | |
| } | |
| return success(); | |
| } | |
| FailureOr<std::optional<SmallVector<Value>>> | |
| mlir::detail::bubbleDownInPlaceMemorySpaceCastImpl(OpOperand &operand, | |
| ValueRange results) { | |
| MemorySpaceCastOpInterface castOp = | |
| MemorySpaceCastOpInterface::getIfPromotableCast(operand.get()); | |
| // Bail if the src is not valid. | |
| if (!castOp) | |
| return failure(); | |
| // Modify the op. | |
| operand.set(castOp.getSourcePtr()); | |
| return std::optional<SmallVector<Value>>(); | |
| } | |
| #include "mlir/Interfaces/MemOpInterfaces.cpp.inc" |