| //===-- FIROperationMoveOpInterface.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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "flang/Optimizer/Dialect/FIROperationMoveOpInterface.h" | |
| #include "flang/Optimizer/Dialect/FIROperationMoveOpInterface.cpp.inc" | |
| llvm::LogicalResult | |
| fir::detail::verifyOperationMoveOpInterface(mlir::Operation *op) { | |
| // It does not make sense to use this interface for operations | |
| // without any regions. | |
| if (op->getNumRegions() == 0) | |
| return op->emitOpError("must contain at least one region"); | |
| return llvm::success(); | |
| } | |
| bool fir::canMoveFromDescendant(mlir::Operation *op, | |
| mlir::Operation *descendant, | |
| mlir::Operation *candidate) { | |
| // Perform some sanity checks. | |
| assert(op->isProperAncestor(descendant) && | |
| "op must be an ancestor of descendant"); | |
| if (candidate) | |
| assert(descendant->isProperAncestor(candidate) && | |
| "descendant must be an ancestor of candidate"); | |
| if (auto iface = mlir::dyn_cast<OperationMoveOpInterface>(op)) | |
| return iface.canMoveFromDescendant(descendant, candidate); | |
| return true; | |
| } | |
| bool fir::canMoveOutOf(mlir::Operation *op, mlir::Operation *candidate) { | |
| if (candidate) | |
| assert(op->isProperAncestor(candidate) && | |
| "op must be an ancestor of candidate"); | |
| if (auto iface = mlir::dyn_cast<OperationMoveOpInterface>(op)) | |
| return iface.canMoveOutOf(candidate); | |
| return true; | |
| } |