| //===- TilingInterface.cpp - Tiling interface -------------------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file contains the definitions of the interface in `TilingInterface.td`. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "mlir/Interfaces/TilingInterface.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include "llvm/ADT/SmallVectorExtras.h" | |
| #include "llvm/ADT/StringSwitch.h" | |
| using namespace mlir; | |
| LogicalResult mlir::verifyInnerTileAlignments(Operation *op, | |
| ArrayRef<int64_t> alignments) { | |
| for (int64_t a : alignments) | |
| if (!isValidInnerTileAlignment(a)) | |
| return op->emitOpError() | |
| << "expected inner_tile_alignments entries to be one of 0 " | |
| "(Unknown), 1 (Multiple) or 2 (Equal), but got " | |
| << a; | |
| return success(); | |
| } | |
| SmallVector<InnerTileAlignment> | |
| mlir::convertInnerTileAlignments(ArrayRef<int64_t> alignments) { | |
| return llvm::map_to_vector(alignments, [](int64_t v) { | |
| assert(isValidInnerTileAlignment(v) && | |
| "invalid InnerTileAlignment; should be rejected by the verifier"); | |
| return static_cast<InnerTileAlignment>(v); | |
| }); | |
| } | |
| StringRef mlir::stringifyInnerTileAlignment(InnerTileAlignment alignment) { | |
| switch (alignment) { | |
| case InnerTileAlignment::Unknown: | |
| return "Unknown"; | |
| case InnerTileAlignment::Multiple: | |
| return "Multiple"; | |
| case InnerTileAlignment::Equal: | |
| return "Equal"; | |
| } | |
| llvm_unreachable("unknown InnerTileAlignment"); | |
| } | |
| std::optional<InnerTileAlignment> | |
| mlir::symbolizeInnerTileAlignment(StringRef keyword) { | |
| return llvm::StringSwitch<std::optional<InnerTileAlignment>>(keyword) | |
| .Case("Unknown", InnerTileAlignment::Unknown) | |
| .Case("Multiple", InnerTileAlignment::Multiple) | |
| .Case("Equal", InnerTileAlignment::Equal) | |
| .Default(std::nullopt); | |
| } | |
| ParseResult mlir::parseInnerTileAlignmentArray(OpAsmParser &parser, | |
| DenseI64ArrayAttr &alignments) { | |
| SmallVector<int64_t> values; | |
| auto parseEntry = [&]() -> ParseResult { | |
| StringRef keyword; | |
| llvm::SMLoc loc = parser.getCurrentLocation(); | |
| if (parser.parseKeyword(&keyword)) | |
| return failure(); | |
| std::optional<InnerTileAlignment> alignment = | |
| symbolizeInnerTileAlignment(keyword); | |
| if (!alignment) | |
| return parser.emitError(loc) | |
| << "expected one of 'Unknown', 'Multiple' or 'Equal', but got '" | |
| << keyword << "'"; | |
| values.push_back(static_cast<int64_t>(*alignment)); | |
| return success(); | |
| }; | |
| if (parser.parseCommaSeparatedList(AsmParser::Delimiter::Square, parseEntry)) | |
| return failure(); | |
| alignments = DenseI64ArrayAttr::get(parser.getContext(), values); | |
| return success(); | |
| } | |
| void mlir::printInnerTileAlignmentArray(OpAsmPrinter &printer, Operation *, | |
| DenseI64ArrayAttr alignments) { | |
| printer << "["; | |
| llvm::interleaveComma(alignments.asArrayRef(), printer, [&](int64_t value) { | |
| printer << stringifyInnerTileAlignment( | |
| static_cast<InnerTileAlignment>(value)); | |
| }); | |
| printer << "]"; | |
| } | |
| #include "mlir/Interfaces/TilingInterface.cpp.inc" |