| // Copyright 2021 The IREE Authors |
| // |
| // Licensed 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 "iree_tf_compiler/Utils/ConversionUtils.h" |
| |
| #include "llvm/ADT/StringExtras.h" |
| #include "llvm/Support/FormatVariadic.h" |
| #include "mlir/IR/Operation.h" |
| #include "mlir/Support/LLVM.h" |
| #include "mlir/Transforms/DialectConversion.h" |
| |
| namespace mlir { |
| namespace iree_compiler { |
| |
| static void emitLegalizationErrors(Location loc, |
| const DenseSet<Operation *> &illegalOps) { |
| // Print op errors for each of the illegal ops that still remain. |
| llvm::MapVector<StringRef, int> opNameCounts; |
| for (Operation *illegalOp : illegalOps) { |
| StringRef opName = illegalOp->getName().getStringRef(); |
| opNameCounts[opName]++; |
| illegalOp->emitOpError() << ": illegal op still exists"; |
| } |
| |
| std::vector<std::string> errorMessages; |
| errorMessages.reserve(opNameCounts.size()); |
| for (const auto &opInfo : opNameCounts) { |
| errorMessages.push_back( |
| llvm::formatv("\t{0} (count: {1})", opInfo.first, opInfo.second)); |
| } |
| emitError(loc) << "The following illegal operations still remain: \n" |
| << llvm::join(errorMessages, "\n") << "\n"; |
| } |
| |
| LogicalResult verifyAllOperationsAreLegal(Operation *op, |
| const ConversionTarget &target) { |
| // We don't just use applyPartialConversion with no patterns because this pass |
| // shouldn't alter the IR at all (including via folding or canonicalizations |
| // that dialect conversion does automatically). |
| DenseSet<Operation *> illegalOps; |
| op->walk([&](Operation *op) { |
| if (!target.isLegal(op)) { |
| illegalOps.insert(op); |
| } |
| }); |
| if (illegalOps.empty()) return success(); |
| emitLegalizationErrors(op->getLoc(), illegalOps); |
| return failure(); |
| } |
| |
| } // namespace iree_compiler |
| } // namespace mlir |