blob: 87e0af3b5cbc027cc4ca0e05bd498460adad75ca [file] [edit]
//===- 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"