Files
gps/tools/local/circt/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.cpp.inc
T
2026-07-12 11:01:51 +03:00

38378 lines
1.7 MiB
Plaintext

/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Op Definitions *|
|* *|
|* Automatically generated file, do not edit! *|
|* From: LinalgStructuredOps.td *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_OP_LIST
#undef GET_OP_LIST
::mlir::linalg::AbsOp,
::mlir::linalg::AddOp,
::mlir::linalg::BatchMatmulOp,
::mlir::linalg::BatchMatvecOp,
::mlir::linalg::BatchMmt4DOp,
::mlir::linalg::BatchReduceMatmulOp,
::mlir::linalg::BatchVecmatOp,
::mlir::linalg::BroadcastOp,
::mlir::linalg::CeilOp,
::mlir::linalg::ContractOp,
::mlir::linalg::Conv1DNcwFcwOp,
::mlir::linalg::Conv1DNwcWcfOp,
::mlir::linalg::Conv1DOp,
::mlir::linalg::Conv2DNchwFchwOp,
::mlir::linalg::Conv2DNchwFchwQOp,
::mlir::linalg::Conv2DNgchwFgchwOp,
::mlir::linalg::Conv2DNgchwGfchwOp,
::mlir::linalg::Conv2DNgchwGfchwQOp,
::mlir::linalg::Conv2DNhwcFhwcOp,
::mlir::linalg::Conv2DNhwcFhwcQOp,
::mlir::linalg::Conv2DNhwcHwcfOp,
::mlir::linalg::Conv2DNhwcHwcfQOp,
::mlir::linalg::Conv2DNhwgcGfhwcOp,
::mlir::linalg::Conv2DNhwgcGfhwcQOp,
::mlir::linalg::Conv2DOp,
::mlir::linalg::Conv3DNcdhwFcdhwOp,
::mlir::linalg::Conv3DNdhwcDhwcfOp,
::mlir::linalg::Conv3DNdhwcDhwcfQOp,
::mlir::linalg::Conv3DOp,
::mlir::linalg::CopyOp,
::mlir::linalg::DepthwiseConv1DNcwCwOp,
::mlir::linalg::DepthwiseConv1DNwcWcOp,
::mlir::linalg::DepthwiseConv1DNwcWcmOp,
::mlir::linalg::DepthwiseConv2DNchwChwOp,
::mlir::linalg::DepthwiseConv2DNhwcHwcOp,
::mlir::linalg::DepthwiseConv2DNhwcHwcQOp,
::mlir::linalg::DepthwiseConv2DNhwcHwcmOp,
::mlir::linalg::DepthwiseConv2DNhwcHwcmQOp,
::mlir::linalg::DepthwiseConv3DNcdhwCdhwOp,
::mlir::linalg::DepthwiseConv3DNdhwcDhwcOp,
::mlir::linalg::DepthwiseConv3DNdhwcDhwcmOp,
::mlir::linalg::DivOp,
::mlir::linalg::DivUnsignedOp,
::mlir::linalg::DotOp,
::mlir::linalg::ElementwiseOp,
::mlir::linalg::ErfOp,
::mlir::linalg::ExpOp,
::mlir::linalg::FillOp,
::mlir::linalg::FillRng2DOp,
::mlir::linalg::FloorOp,
::mlir::linalg::GenericOp,
::mlir::linalg::LogOp,
::mlir::linalg::MapOp,
::mlir::linalg::MatmulOp,
::mlir::linalg::MatvecOp,
::mlir::linalg::MaxOp,
::mlir::linalg::MinOp,
::mlir::linalg::Mmt4DOp,
::mlir::linalg::MulOp,
::mlir::linalg::NegFOp,
::mlir::linalg::PoolingNchwMaxOp,
::mlir::linalg::PoolingNchwSumOp,
::mlir::linalg::PoolingNcwMaxOp,
::mlir::linalg::PoolingNcwSumOp,
::mlir::linalg::PoolingNdhwcMaxOp,
::mlir::linalg::PoolingNdhwcMinOp,
::mlir::linalg::PoolingNdhwcSumOp,
::mlir::linalg::PoolingNhwcMaxOp,
::mlir::linalg::PoolingNhwcMaxUnsignedOp,
::mlir::linalg::PoolingNhwcMinOp,
::mlir::linalg::PoolingNhwcMinUnsignedOp,
::mlir::linalg::PoolingNhwcSumOp,
::mlir::linalg::PoolingNwcMaxOp,
::mlir::linalg::PoolingNwcMaxUnsignedOp,
::mlir::linalg::PoolingNwcMinOp,
::mlir::linalg::PoolingNwcMinUnsignedOp,
::mlir::linalg::PoolingNwcSumOp,
::mlir::linalg::PowFOp,
::mlir::linalg::QuantizedBatchMatmulOp,
::mlir::linalg::QuantizedMatmulOp,
::mlir::linalg::ReciprocalOp,
::mlir::linalg::ReduceOp,
::mlir::linalg::RoundOp,
::mlir::linalg::RsqrtOp,
::mlir::linalg::SelectOp,
::mlir::linalg::SqrtOp,
::mlir::linalg::SquareOp,
::mlir::linalg::SubOp,
::mlir::linalg::TanhOp,
::mlir::linalg::TransposeOp,
::mlir::linalg::VecmatOp
#endif // GET_OP_LIST
#ifdef GET_OP_CLASSES
#undef GET_OP_CLASSES
//===----------------------------------------------------------------------===//
// Local Utility Method Definitions
//===----------------------------------------------------------------------===//
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps1(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!(!((::llvm::isa<::mlir::TokenType>(type))))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be variadic of any non-token type, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps2(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!(((::llvm::isa<::mlir::ShapedType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType())))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be variadic of shaped of any non-token type values, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps3(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!(((::llvm::isa<::mlir::RankedTensorType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType())))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be variadic of ranked tensor of any non-token type values, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps4(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!((((::llvm::isa<::mlir::MemRefType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) || (((::llvm::isa<::mlir::RankedTensorType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be memref of any non-token type values or ranked tensor of any non-token type values, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps5(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!(((::llvm::isa<::mlir::TensorType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType())))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be variadic of tensor of any non-token type values, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_type_constraint_LinalgStructuredOps6(
::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,
unsigned valueIndex) {
if (!((((::llvm::isa<::mlir::MemRefType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) || (((::llvm::isa<::mlir::RankedTensorType>(type))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) {
return op->emitOpError(valueKind) << " #" << valueIndex
<< " must be variadic of memref of any non-token type values or ranked tensor of any non-token type values, but got " << type;
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps1(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !(((::llvm::isa<::mlir::ArrayAttr>(attr))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(attr), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: AffineMap array attribute";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps1(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps2(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(attr))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps2(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps3(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((::llvm::isa<::mlir::DenseI64ArrayAttr>(attr))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: i64 dense array attribute";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps3(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps3(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps4(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(attr))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps4(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps5(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(attr))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps5(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps6(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(attr))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(attr).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps6(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps7(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((::llvm::isa<::mlir::linalg::ElementwiseKindAttr>(attr))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps7(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps7(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps8(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !(((::llvm::isa<::mlir::ArrayAttr>(attr))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(attr), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::linalg::IteratorTypeAttr>(attr))); }))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: Iterator type should be an enum.";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps8(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps8(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps9(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !((::llvm::isa<::mlir::StringAttr>(attr))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: string attribute";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps9(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps9(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps10(
::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
if (attr && !(((::llvm::isa<::mlir::DenseI64ArrayAttr>(attr))) && (((llvm::is_sorted(::llvm::cast<DenseI64ArrayAttr>(attr).asArrayRef()))) && (([](::llvm::ArrayRef<int64_t> a) {
return std::adjacent_find(std::begin(a), std::end(a)) == std::end(a);
}(::llvm::cast<DenseI64ArrayAttr>(attr).asArrayRef()))))))
return emitError() << "attribute '" << attrName
<< "' failed to satisfy constraint: i64 dense array attribute should be in increasing order";
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_LinalgStructuredOps10(
::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {
return __mlir_ods_local_attr_constraint_LinalgStructuredOps10(attr, attrName, [op]() {
return op->emitOpError();
});
}
static ::llvm::LogicalResult __mlir_ods_local_region_constraint_LinalgStructuredOps1(
::mlir::Operation *op, ::mlir::Region &region, ::llvm::StringRef regionName,
unsigned regionIndex) {
if (!((true))) {
return op->emitOpError("region #") << regionIndex
<< (regionName.empty() ? " " : " ('" + regionName + "') ")
<< "failed to verify constraint: any region";
}
return ::mlir::success();
}
static ::llvm::LogicalResult __mlir_ods_local_region_constraint_LinalgStructuredOps2(
::mlir::Operation *op, ::mlir::Region &region, ::llvm::StringRef regionName,
unsigned regionIndex) {
if (!((::llvm::hasNItems(region, 1)))) {
return op->emitOpError("region #") << regionIndex
<< (regionName.empty() ? " " : " ('" + regionName + "') ")
<< "failed to verify constraint: region with 1 blocks";
}
return ::mlir::success();
}
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::AbsOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
AbsOpGenericAdaptorBase::AbsOpGenericAdaptorBase(AbsOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> AbsOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
AbsOpAdaptor::AbsOpAdaptor(AbsOp op) : AbsOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult AbsOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> AbsOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange AbsOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange AbsOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> AbsOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult AbsOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute AbsOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code AbsOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> AbsOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void AbsOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void AbsOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult AbsOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult AbsOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void AbsOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void AbsOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, AbsOp::getRegionBuilder());
}
AbsOp AbsOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AbsOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AbsOp AbsOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void AbsOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, AbsOp::getRegionBuilder());
}
AbsOp AbsOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AbsOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AbsOp AbsOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void AbsOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
AbsOp AbsOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AbsOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AbsOp AbsOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult AbsOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult AbsOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult AbsOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::AbsOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::AbsOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::AddOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
AddOpGenericAdaptorBase::AddOpGenericAdaptorBase(AddOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> AddOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
AddOpAdaptor::AddOpAdaptor(AddOp op) : AddOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult AddOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> AddOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange AddOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange AddOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> AddOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult AddOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute AddOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code AddOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> AddOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void AddOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void AddOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult AddOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult AddOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void AddOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, AddOp::getRegionBuilder());
}
AddOp AddOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AddOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AddOp AddOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, AddOp::getRegionBuilder());
}
AddOp AddOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AddOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AddOp AddOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
AddOp AddOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<AddOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
AddOp AddOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult AddOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult AddOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult AddOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::AddOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::AddOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BatchMatmulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BatchMatmulOpGenericAdaptorBase::BatchMatmulOpGenericAdaptorBase(BatchMatmulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> BatchMatmulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::ArrayAttr BatchMatmulOpGenericAdaptorBase::getIndexingMapsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::ArrayAttr>(getProperties().indexing_maps);
if (!attr)
attr = ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(BatchMatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::ArrayAttr BatchMatmulOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(BatchMatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFnAttr BatchMatmulOpGenericAdaptorBase::getCastAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::linalg::TypeFnAttr>(getProperties().cast);
if (!attr)
attr = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed);
return attr;
}
::mlir::linalg::TypeFn BatchMatmulOpGenericAdaptorBase::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
} // namespace detail
BatchMatmulOpAdaptor::BatchMatmulOpAdaptor(BatchMatmulOp op) : BatchMatmulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BatchMatmulOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.batch_matmul' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
if (tblgen_cast && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(tblgen_cast))))
return emitError(loc, "'linalg.batch_matmul' op attribute 'cast' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1");
return ::mlir::success();
}
std::pair<unsigned, unsigned> BatchMatmulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange BatchMatmulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange BatchMatmulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> BatchMatmulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BatchMatmulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.cast;
auto attr = dict.get("cast");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute BatchMatmulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.cast;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("cast",
propStorage));
}
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BatchMatmulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.cast.getAsOpaquePointer()),
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> BatchMatmulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "cast")
return prop.cast;
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void BatchMatmulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "cast") {
prop.cast = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.cast)>>(value);
return;
}
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void BatchMatmulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.cast) attrs.append("cast", prop.cast);
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult BatchMatmulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getCastAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, "cast", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchMatmulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.cast)))
return ::mlir::failure();
if (::mlir::failed(reader.readOptionalAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void BatchMatmulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.cast);
writer.writeOptionalAttribute(prop.indexing_maps);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::ArrayAttr BatchMatmulOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder((*this)->getContext()).getAffineMapArrayAttr(BatchMatmulOp::getDefaultIndexingMaps(::mlir::Builder((*this)->getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFn BatchMatmulOp::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
void BatchMatmulOp::setCast(::std::optional<::mlir::linalg::TypeFn> attrValue) {
auto &odsProp = getProperties().cast;
if (attrValue)
odsProp = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue);
else
odsProp = nullptr;
}
void BatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildBatchMatmulOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, BatchMatmulOp::getRegionBuilder(),
BatchMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
BatchMatmulOp BatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatmulOp BatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildBatchMatmulOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, BatchMatmulOp::getRegionBuilder(),
BatchMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
BatchMatmulOp BatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatmulOp BatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, Attribute cast, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttribute("cast", cast);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion(),
BatchMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext());
}
BatchMatmulOp BatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, Attribute cast, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatmulOp BatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, Attribute cast, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BatchMatmulOp::verifyInvariantsImpl() {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(*this, tblgen_cast, "cast")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchMatmulOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult BatchMatmulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.cast;
auto castAttrName = ::mlir::StringAttr::get(ctx, "cast");
auto attr = dict.get(castAttrName);
usedKeys.insert(castAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for cast in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BatchMatmulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BatchMatmulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BatchMatvecOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BatchMatvecOpGenericAdaptorBase::BatchMatvecOpGenericAdaptorBase(BatchMatvecOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> BatchMatvecOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
BatchMatvecOpAdaptor::BatchMatvecOpAdaptor(BatchMatvecOp op) : BatchMatvecOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BatchMatvecOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> BatchMatvecOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange BatchMatvecOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange BatchMatvecOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> BatchMatvecOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BatchMatvecOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute BatchMatvecOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BatchMatvecOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> BatchMatvecOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void BatchMatvecOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void BatchMatvecOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult BatchMatvecOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult BatchMatvecOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void BatchMatvecOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void BatchMatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, BatchMatvecOp::getRegionBuilder());
}
BatchMatvecOp BatchMatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatvecOp BatchMatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, BatchMatvecOp::getRegionBuilder());
}
BatchMatvecOp BatchMatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatvecOp BatchMatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
BatchMatvecOp BatchMatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMatvecOp BatchMatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BatchMatvecOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchMatvecOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult BatchMatvecOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BatchMatvecOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BatchMatvecOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BatchMmt4DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BatchMmt4DOpGenericAdaptorBase::BatchMmt4DOpGenericAdaptorBase(BatchMmt4DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> BatchMmt4DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
BatchMmt4DOpAdaptor::BatchMmt4DOpAdaptor(BatchMmt4DOp op) : BatchMmt4DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BatchMmt4DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> BatchMmt4DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange BatchMmt4DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange BatchMmt4DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> BatchMmt4DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BatchMmt4DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute BatchMmt4DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BatchMmt4DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> BatchMmt4DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void BatchMmt4DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void BatchMmt4DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult BatchMmt4DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult BatchMmt4DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void BatchMmt4DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void BatchMmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, BatchMmt4DOp::getRegionBuilder());
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, BatchMmt4DOp::getRegionBuilder());
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchMmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchMmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchMmt4DOp BatchMmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BatchMmt4DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchMmt4DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult BatchMmt4DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BatchMmt4DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BatchMmt4DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BatchReduceMatmulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BatchReduceMatmulOpGenericAdaptorBase::BatchReduceMatmulOpGenericAdaptorBase(BatchReduceMatmulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> BatchReduceMatmulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::ArrayAttr BatchReduceMatmulOpGenericAdaptorBase::getIndexingMapsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::ArrayAttr>(getProperties().indexing_maps);
if (!attr)
attr = ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(BatchReduceMatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::ArrayAttr BatchReduceMatmulOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(BatchReduceMatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFnAttr BatchReduceMatmulOpGenericAdaptorBase::getCastAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::linalg::TypeFnAttr>(getProperties().cast);
if (!attr)
attr = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed);
return attr;
}
::mlir::linalg::TypeFn BatchReduceMatmulOpGenericAdaptorBase::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
} // namespace detail
BatchReduceMatmulOpAdaptor::BatchReduceMatmulOpAdaptor(BatchReduceMatmulOp op) : BatchReduceMatmulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BatchReduceMatmulOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.batch_reduce_matmul' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
if (tblgen_cast && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(tblgen_cast))))
return emitError(loc, "'linalg.batch_reduce_matmul' op attribute 'cast' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1");
return ::mlir::success();
}
std::pair<unsigned, unsigned> BatchReduceMatmulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange BatchReduceMatmulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange BatchReduceMatmulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> BatchReduceMatmulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BatchReduceMatmulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.cast;
auto attr = dict.get("cast");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute BatchReduceMatmulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.cast;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("cast",
propStorage));
}
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BatchReduceMatmulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.cast.getAsOpaquePointer()),
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> BatchReduceMatmulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "cast")
return prop.cast;
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void BatchReduceMatmulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "cast") {
prop.cast = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.cast)>>(value);
return;
}
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void BatchReduceMatmulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.cast) attrs.append("cast", prop.cast);
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult BatchReduceMatmulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getCastAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, "cast", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchReduceMatmulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.cast)))
return ::mlir::failure();
if (::mlir::failed(reader.readOptionalAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void BatchReduceMatmulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.cast);
writer.writeOptionalAttribute(prop.indexing_maps);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::ArrayAttr BatchReduceMatmulOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder((*this)->getContext()).getAffineMapArrayAttr(BatchReduceMatmulOp::getDefaultIndexingMaps(::mlir::Builder((*this)->getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFn BatchReduceMatmulOp::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
void BatchReduceMatmulOp::setCast(::std::optional<::mlir::linalg::TypeFn> attrValue) {
auto &odsProp = getProperties().cast;
if (attrValue)
odsProp = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue);
else
odsProp = nullptr;
}
void BatchReduceMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildBatchReduceMatmulOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, BatchReduceMatmulOp::getRegionBuilder(),
BatchReduceMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchReduceMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchReduceMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildBatchReduceMatmulOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, BatchReduceMatmulOp::getRegionBuilder(),
BatchReduceMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchReduceMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchReduceMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("cast", cast);
buildBatchReduceMatmulOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, BatchReduceMatmulOp::getRegionBuilder(),
BatchReduceMatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchReduceMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchReduceMatmulOp BatchReduceMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BatchReduceMatmulOp::verifyInvariantsImpl() {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(*this, tblgen_cast, "cast")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchReduceMatmulOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult BatchReduceMatmulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.cast;
auto castAttrName = ::mlir::StringAttr::get(ctx, "cast");
auto attr = dict.get(castAttrName);
usedKeys.insert(castAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for cast in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BatchReduceMatmulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BatchReduceMatmulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BatchVecmatOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BatchVecmatOpGenericAdaptorBase::BatchVecmatOpGenericAdaptorBase(BatchVecmatOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> BatchVecmatOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
BatchVecmatOpAdaptor::BatchVecmatOpAdaptor(BatchVecmatOp op) : BatchVecmatOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BatchVecmatOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> BatchVecmatOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange BatchVecmatOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange BatchVecmatOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> BatchVecmatOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BatchVecmatOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute BatchVecmatOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BatchVecmatOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> BatchVecmatOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void BatchVecmatOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void BatchVecmatOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult BatchVecmatOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult BatchVecmatOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void BatchVecmatOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void BatchVecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, BatchVecmatOp::getRegionBuilder());
}
BatchVecmatOp BatchVecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchVecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchVecmatOp BatchVecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchVecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, BatchVecmatOp::getRegionBuilder());
}
BatchVecmatOp BatchVecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchVecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchVecmatOp BatchVecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void BatchVecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
BatchVecmatOp BatchVecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BatchVecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BatchVecmatOp BatchVecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BatchVecmatOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BatchVecmatOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult BatchVecmatOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BatchVecmatOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BatchVecmatOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::BroadcastOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
BroadcastOpGenericAdaptorBase::BroadcastOpGenericAdaptorBase(BroadcastOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
::llvm::ArrayRef<int64_t> BroadcastOpGenericAdaptorBase::getDimensions() {
auto attr = getDimensionsAttr();
return attr;
}
} // namespace detail
BroadcastOpAdaptor::BroadcastOpAdaptor(BroadcastOp op) : BroadcastOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult BroadcastOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dimensions = getProperties().dimensions; (void)tblgen_dimensions;
if (!tblgen_dimensions) return emitError(loc, "'linalg.broadcast' op requires attribute 'dimensions'");
if (tblgen_dimensions && !((::llvm::isa<::mlir::DenseI64ArrayAttr>(tblgen_dimensions))))
return emitError(loc, "'linalg.broadcast' op attribute 'dimensions' failed to satisfy constraint: i64 dense array attribute");
return ::mlir::success();
}
std::pair<unsigned, unsigned> BroadcastOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult BroadcastOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dimensions;
auto attr = dict.get("dimensions");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dimensions` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
return ::mlir::success();
}
::mlir::Attribute BroadcastOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dimensions;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dimensions",
propStorage));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code BroadcastOp::computePropertiesHash(const Properties &prop) {
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dimensions.getAsOpaquePointer()));
}
std::optional<mlir::Attribute> BroadcastOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dimensions")
return prop.dimensions;
return std::nullopt;
}
void BroadcastOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dimensions") {
prop.dimensions = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dimensions)>>(value);
return;
}
}
void BroadcastOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dimensions) attrs.append("dimensions", prop.dimensions);
}
::llvm::LogicalResult BroadcastOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDimensionsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps3(attr, "dimensions", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BroadcastOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readAttribute(prop.dimensions)))
return ::mlir::failure();
return ::mlir::success();
}
void BroadcastOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeAttribute(prop.dimensions);
}
::llvm::ArrayRef<int64_t> BroadcastOp::getDimensions() {
auto attr = getDimensionsAttr();
return attr;
}
void BroadcastOp::setDimensions(::llvm::ArrayRef<int64_t> attrValue) {
getProperties().dimensions = ::mlir::Builder((*this)->getContext()).getDenseI64ArrayAttr(attrValue);
}
BroadcastOp BroadcastOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value input, Value init, DenseI64ArrayAttr dimensions, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BroadcastOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BroadcastOp BroadcastOp::create(::mlir::ImplicitLocOpBuilder &builder, Value input, Value init, DenseI64ArrayAttr dimensions, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(attributes)>(attributes));
}
BroadcastOp BroadcastOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value input, Value init, ArrayRef<int64_t> dimensions, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<BroadcastOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
BroadcastOp BroadcastOp::create(::mlir::ImplicitLocOpBuilder &builder, Value input, Value init, ArrayRef<int64_t> dimensions, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult BroadcastOp::verifyInvariantsImpl() {
auto tblgen_dimensions = getProperties().dimensions; (void)tblgen_dimensions;
if (!tblgen_dimensions) return emitOpError("requires attribute 'dimensions'");
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps3(*this, tblgen_dimensions, "dimensions")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps4(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps4(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps5(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps2(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult BroadcastOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult BroadcastOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.dimensions;
auto dimensionsAttrName = ::mlir::StringAttr::get(ctx, "dimensions");
auto attr = dict.get(dimensionsAttrName);
usedKeys.insert(dimensionsAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for dimensions in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dimensions` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::BroadcastOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::BroadcastOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::CeilOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
CeilOpGenericAdaptorBase::CeilOpGenericAdaptorBase(CeilOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> CeilOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
CeilOpAdaptor::CeilOpAdaptor(CeilOp op) : CeilOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult CeilOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> CeilOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange CeilOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange CeilOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> CeilOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult CeilOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute CeilOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code CeilOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> CeilOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void CeilOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void CeilOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult CeilOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult CeilOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void CeilOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void CeilOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, CeilOp::getRegionBuilder());
}
CeilOp CeilOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CeilOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CeilOp CeilOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void CeilOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, CeilOp::getRegionBuilder());
}
CeilOp CeilOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CeilOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CeilOp CeilOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void CeilOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
CeilOp CeilOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CeilOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CeilOp CeilOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult CeilOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult CeilOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult CeilOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::CeilOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::CeilOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ContractOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ContractOpGenericAdaptorBase::ContractOpGenericAdaptorBase(ContractOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ContractOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::ArrayAttr ContractOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
return attr;
}
::mlir::linalg::TypeFnAttr ContractOpGenericAdaptorBase::getCastAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::linalg::TypeFnAttr>(getProperties().cast);
if (!attr)
attr = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed);
return attr;
}
::mlir::linalg::TypeFn ContractOpGenericAdaptorBase::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
} // namespace detail
ContractOpAdaptor::ContractOpAdaptor(ContractOp op) : ContractOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ContractOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (!tblgen_indexing_maps) return emitError(loc, "'linalg.contract' op requires attribute 'indexing_maps'");
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.contract' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
if (tblgen_cast && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(tblgen_cast))))
return emitError(loc, "'linalg.contract' op attribute 'cast' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1");
return ::mlir::success();
}
std::pair<unsigned, unsigned> ContractOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange ContractOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange ContractOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> ContractOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ContractOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.cast;
auto attr = dict.get("cast");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute ContractOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.cast;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("cast",
propStorage));
}
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ContractOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.cast.getAsOpaquePointer()),
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> ContractOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "cast")
return prop.cast;
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void ContractOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "cast") {
prop.cast = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.cast)>>(value);
return;
}
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void ContractOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.cast) attrs.append("cast", prop.cast);
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult ContractOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getCastAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, "cast", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ContractOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.cast)))
return ::mlir::failure();
if (::mlir::failed(reader.readAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void ContractOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.cast);
writer.writeAttribute(prop.indexing_maps);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::ArrayAttr ContractOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
return attr;
}
::mlir::linalg::TypeFn ContractOp::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
void ContractOp::setCast(::std::optional<::mlir::linalg::TypeFn> attrValue) {
auto &odsProp = getProperties().cast;
if (attrValue)
odsProp = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue);
else
odsProp = nullptr;
}
void ContractOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, regionBuilder);
}
ContractOp ContractOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ContractOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ContractOp ContractOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ContractOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("indexing_maps", indexingMaps);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs,
outputs, attributes, regionBuilder);
}
ContractOp ContractOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ContractOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ContractOp ContractOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
}
void ContractOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("indexing_maps", indexingMaps);
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, regionBuilder);
}
ContractOp ContractOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ContractOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ContractOp ContractOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult ContractOp::verifyInvariantsImpl() {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (!tblgen_indexing_maps) return emitOpError("requires attribute 'indexing_maps'");
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(*this, tblgen_cast, "cast")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps2(*this, region, "combiner", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ContractOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult ContractOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.cast;
auto castAttrName = ::mlir::StringAttr::get(ctx, "cast");
auto attr = dict.get(castAttrName);
usedKeys.insert(castAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for cast in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ContractOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ContractOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv1DNcwFcwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv1DNcwFcwOpGenericAdaptorBase::Conv1DNcwFcwOpGenericAdaptorBase(Conv1DNcwFcwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv1DNcwFcwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv1DNcwFcwOpAdaptor::Conv1DNcwFcwOpAdaptor(Conv1DNcwFcwOp op) : Conv1DNcwFcwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv1DNcwFcwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.conv_1d_ncw_fcw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.conv_1d_ncw_fcw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv1DNcwFcwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv1DNcwFcwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv1DNcwFcwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv1DNcwFcwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv1DNcwFcwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv1DNcwFcwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv1DNcwFcwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv1DNcwFcwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv1DNcwFcwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv1DNcwFcwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv1DNcwFcwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv1DNcwFcwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv1DNcwFcwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNcwFcwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void Conv1DNcwFcwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv1DNcwFcwOp::getRegionBuilder());
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNcwFcwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNcwFcwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv1DNcwFcwOp::getRegionBuilder());
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNcwFcwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNcwFcwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNcwFcwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNcwFcwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv1DNcwFcwOp::getRegionBuilder());
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNcwFcwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNcwFcwOp Conv1DNcwFcwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv1DNcwFcwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv1DNcwFcwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv1DNcwFcwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv1DNcwFcwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv1DNcwFcwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv1DNwcWcfOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv1DNwcWcfOpGenericAdaptorBase::Conv1DNwcWcfOpGenericAdaptorBase(Conv1DNwcWcfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv1DNwcWcfOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv1DNwcWcfOpAdaptor::Conv1DNwcWcfOpAdaptor(Conv1DNwcWcfOp op) : Conv1DNwcWcfOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv1DNwcWcfOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.conv_1d_nwc_wcf' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.conv_1d_nwc_wcf' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv1DNwcWcfOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv1DNwcWcfOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv1DNwcWcfOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv1DNwcWcfOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv1DNwcWcfOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv1DNwcWcfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv1DNwcWcfOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv1DNwcWcfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv1DNwcWcfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv1DNwcWcfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv1DNwcWcfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv1DNwcWcfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv1DNwcWcfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv1DNwcWcfOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void Conv1DNwcWcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv1DNwcWcfOp::getRegionBuilder());
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNwcWcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNwcWcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv1DNwcWcfOp::getRegionBuilder());
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNwcWcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNwcWcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNwcWcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv1DNwcWcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv1DNwcWcfOp::getRegionBuilder());
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DNwcWcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DNwcWcfOp Conv1DNwcWcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv1DNwcWcfOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv1DNwcWcfOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv1DNwcWcfOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv1DNwcWcfOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv1DNwcWcfOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv1DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv1DOpGenericAdaptorBase::Conv1DOpGenericAdaptorBase(Conv1DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv1DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
Conv1DOpAdaptor::Conv1DOpAdaptor(Conv1DOp op) : Conv1DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv1DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv1DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv1DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv1DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv1DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv1DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv1DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv1DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv1DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv1DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv1DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv1DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult Conv1DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv1DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void Conv1DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv1DOp::getRegionBuilder());
}
Conv1DOp Conv1DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DOp Conv1DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv1DOp::getRegionBuilder());
}
Conv1DOp Conv1DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DOp Conv1DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv1DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv1DOp Conv1DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv1DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv1DOp Conv1DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv1DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv1DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv1DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv1DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv1DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNchwFchwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNchwFchwOpGenericAdaptorBase::Conv2DNchwFchwOpGenericAdaptorBase(Conv2DNchwFchwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNchwFchwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNchwFchwOpAdaptor::Conv2DNchwFchwOpAdaptor(Conv2DNchwFchwOp op) : Conv2DNchwFchwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNchwFchwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nchw_fchw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nchw_fchw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNchwFchwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNchwFchwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNchwFchwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNchwFchwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNchwFchwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNchwFchwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNchwFchwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNchwFchwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNchwFchwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNchwFchwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNchwFchwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNchwFchwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNchwFchwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNchwFchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNchwFchwOp::getRegionBuilder());
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNchwFchwOp::getRegionBuilder());
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNchwFchwOp::getRegionBuilder());
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwOp Conv2DNchwFchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNchwFchwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNchwFchwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNchwFchwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNchwFchwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNchwFchwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNchwFchwQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNchwFchwQOpGenericAdaptorBase::Conv2DNchwFchwQOpGenericAdaptorBase(Conv2DNchwFchwQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNchwFchwQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNchwFchwQOpAdaptor::Conv2DNchwFchwQOpAdaptor(Conv2DNchwFchwQOp op) : Conv2DNchwFchwQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNchwFchwQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nchw_fchw_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nchw_fchw_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNchwFchwQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNchwFchwQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNchwFchwQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNchwFchwQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNchwFchwQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNchwFchwQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNchwFchwQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNchwFchwQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNchwFchwQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNchwFchwQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNchwFchwQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNchwFchwQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNchwFchwQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNchwFchwQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNchwFchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNchwFchwQOp::getRegionBuilder());
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNchwFchwQOp::getRegionBuilder());
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNchwFchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNchwFchwQOp::getRegionBuilder());
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNchwFchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNchwFchwQOp Conv2DNchwFchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNchwFchwQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNchwFchwQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNchwFchwQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNchwFchwQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNchwFchwQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNgchwFgchwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNgchwFgchwOpGenericAdaptorBase::Conv2DNgchwFgchwOpGenericAdaptorBase(Conv2DNgchwFgchwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNgchwFgchwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNgchwFgchwOpAdaptor::Conv2DNgchwFgchwOpAdaptor(Conv2DNgchwFgchwOp op) : Conv2DNgchwFgchwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNgchwFgchwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_fgchw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_fgchw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNgchwFgchwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNgchwFgchwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNgchwFgchwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNgchwFgchwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNgchwFgchwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNgchwFgchwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNgchwFgchwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNgchwFgchwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNgchwFgchwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNgchwFgchwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwFgchwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNgchwFgchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNgchwFgchwOp::getRegionBuilder());
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwFgchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwFgchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNgchwFgchwOp::getRegionBuilder());
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwFgchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwFgchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwFgchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwFgchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNgchwFgchwOp::getRegionBuilder());
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwFgchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwFgchwOp Conv2DNgchwFgchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNgchwFgchwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNgchwFgchwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNgchwFgchwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNgchwGfchwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNgchwGfchwOpGenericAdaptorBase::Conv2DNgchwGfchwOpGenericAdaptorBase(Conv2DNgchwGfchwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNgchwGfchwOpAdaptor::Conv2DNgchwGfchwOpAdaptor(Conv2DNgchwGfchwOp op) : Conv2DNgchwGfchwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNgchwGfchwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_gfchw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_gfchw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNgchwGfchwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNgchwGfchwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNgchwGfchwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNgchwGfchwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNgchwGfchwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNgchwGfchwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNgchwGfchwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNgchwGfchwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNgchwGfchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNgchwGfchwOp::getRegionBuilder());
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNgchwGfchwOp::getRegionBuilder());
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNgchwGfchwOp::getRegionBuilder());
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwOp Conv2DNgchwGfchwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNgchwGfchwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNgchwGfchwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNgchwGfchwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNgchwGfchwQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNgchwGfchwQOpGenericAdaptorBase::Conv2DNgchwGfchwQOpGenericAdaptorBase(Conv2DNgchwGfchwQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNgchwGfchwQOpAdaptor::Conv2DNgchwGfchwQOpAdaptor(Conv2DNgchwGfchwQOp op) : Conv2DNgchwGfchwQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNgchwGfchwQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_gfchw_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_ngchw_gfchw_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNgchwGfchwQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNgchwGfchwQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNgchwGfchwQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNgchwGfchwQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNgchwGfchwQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNgchwGfchwQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNgchwGfchwQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNgchwGfchwQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNgchwGfchwQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNgchwGfchwQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNgchwGfchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNgchwGfchwQOp::getRegionBuilder());
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNgchwGfchwQOp::getRegionBuilder());
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNgchwGfchwQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNgchwGfchwQOp::getRegionBuilder());
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNgchwGfchwQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNgchwGfchwQOp Conv2DNgchwGfchwQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNgchwGfchwQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNgchwGfchwQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNgchwGfchwQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwcFhwcOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwcFhwcOpGenericAdaptorBase::Conv2DNhwcFhwcOpGenericAdaptorBase(Conv2DNhwcFhwcOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwcFhwcOpAdaptor::Conv2DNhwcFhwcOpAdaptor(Conv2DNhwcFhwcOp op) : Conv2DNhwcFhwcOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwcFhwcOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_fhwc' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_fhwc' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwcFhwcOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwcFhwcOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwcFhwcOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwcFhwcOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwcFhwcOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwcFhwcOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwcFhwcOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwcFhwcOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwcFhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwcFhwcOp::getRegionBuilder());
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwcFhwcOp::getRegionBuilder());
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwcFhwcOp::getRegionBuilder());
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcOp Conv2DNhwcFhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwcFhwcOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwcFhwcOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwcFhwcOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwcFhwcQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwcFhwcQOpGenericAdaptorBase::Conv2DNhwcFhwcQOpGenericAdaptorBase(Conv2DNhwcFhwcQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwcFhwcQOpAdaptor::Conv2DNhwcFhwcQOpAdaptor(Conv2DNhwcFhwcQOp op) : Conv2DNhwcFhwcQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwcFhwcQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_fhwc_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_fhwc_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwcFhwcQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwcFhwcQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwcFhwcQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwcFhwcQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwcFhwcQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwcFhwcQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwcFhwcQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwcFhwcQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwcFhwcQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcFhwcQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwcFhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwcFhwcQOp::getRegionBuilder());
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwcFhwcQOp::getRegionBuilder());
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcFhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwcFhwcQOp::getRegionBuilder());
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcFhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcFhwcQOp Conv2DNhwcFhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwcFhwcQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwcFhwcQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwcFhwcQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwcHwcfOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwcHwcfOpGenericAdaptorBase::Conv2DNhwcHwcfOpGenericAdaptorBase(Conv2DNhwcHwcfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwcHwcfOpAdaptor::Conv2DNhwcHwcfOpAdaptor(Conv2DNhwcHwcfOp op) : Conv2DNhwcHwcfOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwcHwcfOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_hwcf' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_hwcf' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwcHwcfOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwcHwcfOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwcHwcfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwcHwcfOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwcHwcfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwcHwcfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwcHwcfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwcHwcfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwcHwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwcHwcfOp::getRegionBuilder());
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwcHwcfOp::getRegionBuilder());
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwcHwcfOp::getRegionBuilder());
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfOp Conv2DNhwcHwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwcHwcfOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwcHwcfOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwcHwcfOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwcHwcfQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwcHwcfQOpGenericAdaptorBase::Conv2DNhwcHwcfQOpGenericAdaptorBase(Conv2DNhwcHwcfQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwcHwcfQOpAdaptor::Conv2DNhwcHwcfQOpAdaptor(Conv2DNhwcHwcfQOp op) : Conv2DNhwcHwcfQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwcHwcfQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_hwcf_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwc_hwcf_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwcHwcfQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwcHwcfQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwcHwcfQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwcHwcfQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwcHwcfQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwcHwcfQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwcHwcfQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwcHwcfQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwcHwcfQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwcHwcfQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwcHwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwcHwcfQOp::getRegionBuilder());
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwcHwcfQOp::getRegionBuilder());
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwcHwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwcHwcfQOp::getRegionBuilder());
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwcHwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwcHwcfQOp Conv2DNhwcHwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwcHwcfQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwcHwcfQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwcHwcfQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwgcGfhwcOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwgcGfhwcOpGenericAdaptorBase::Conv2DNhwgcGfhwcOpGenericAdaptorBase(Conv2DNhwgcGfhwcOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwgcGfhwcOpAdaptor::Conv2DNhwgcGfhwcOpAdaptor(Conv2DNhwgcGfhwcOp op) : Conv2DNhwgcGfhwcOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwgcGfhwcOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwgc_gfhwc' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwgc_gfhwc' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwgcGfhwcOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwgcGfhwcOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwgcGfhwcOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwgcGfhwcOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwgcGfhwcOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwgcGfhwcOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwgcGfhwcOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwgcGfhwcOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwgcGfhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwgcGfhwcOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwgcGfhwcOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwgcGfhwcOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcOp Conv2DNhwgcGfhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwgcGfhwcOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwgcGfhwcOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DNhwgcGfhwcQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DNhwgcGfhwcQOpGenericAdaptorBase::Conv2DNhwgcGfhwcQOpGenericAdaptorBase(Conv2DNhwgcGfhwcQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv2DNhwgcGfhwcQOpAdaptor::Conv2DNhwgcGfhwcQOpAdaptor(Conv2DNhwgcGfhwcQOp op) : Conv2DNhwgcGfhwcQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwgc_gfhwc_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.conv_2d_nhwgc_gfhwc_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DNhwgcGfhwcQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DNhwgcGfhwcQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DNhwgcGfhwcQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DNhwgcGfhwcQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DNhwgcGfhwcQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DNhwgcGfhwcQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DNhwgcGfhwcQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DNhwgcGfhwcQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DNhwgcGfhwcQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv2DNhwgcGfhwcQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv2DNhwgcGfhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DNhwgcGfhwcQOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DNhwgcGfhwcQOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv2DNhwgcGfhwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv2DNhwgcGfhwcQOp::getRegionBuilder());
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DNhwgcGfhwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DNhwgcGfhwcQOp Conv2DNhwgcGfhwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DNhwgcGfhwcQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DNhwgcGfhwcQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DNhwgcGfhwcQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv2DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv2DOpGenericAdaptorBase::Conv2DOpGenericAdaptorBase(Conv2DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv2DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
Conv2DOpAdaptor::Conv2DOpAdaptor(Conv2DOp op) : Conv2DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv2DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv2DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv2DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv2DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv2DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv2DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv2DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv2DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv2DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv2DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv2DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv2DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult Conv2DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv2DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void Conv2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv2DOp::getRegionBuilder());
}
Conv2DOp Conv2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DOp Conv2DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv2DOp::getRegionBuilder());
}
Conv2DOp Conv2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DOp Conv2DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv2DOp Conv2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv2DOp Conv2DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv2DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv2DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv2DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv2DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv2DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv3DNcdhwFcdhwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv3DNcdhwFcdhwOpGenericAdaptorBase::Conv3DNcdhwFcdhwOpGenericAdaptorBase(Conv3DNcdhwFcdhwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv3DNcdhwFcdhwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv3DNcdhwFcdhwOpAdaptor::Conv3DNcdhwFcdhwOpAdaptor(Conv3DNcdhwFcdhwOp op) : Conv3DNcdhwFcdhwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv3DNcdhwFcdhwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ncdhw_fcdhw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ncdhw_fcdhw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv3DNcdhwFcdhwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv3DNcdhwFcdhwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv3DNcdhwFcdhwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv3DNcdhwFcdhwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv3DNcdhwFcdhwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv3DNcdhwFcdhwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv3DNcdhwFcdhwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv3DNcdhwFcdhwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv3DNcdhwFcdhwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv3DNcdhwFcdhwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNcdhwFcdhwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv3DNcdhwFcdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv3DNcdhwFcdhwOp::getRegionBuilder());
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNcdhwFcdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNcdhwFcdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv3DNcdhwFcdhwOp::getRegionBuilder());
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNcdhwFcdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNcdhwFcdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNcdhwFcdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNcdhwFcdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv3DNcdhwFcdhwOp::getRegionBuilder());
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNcdhwFcdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNcdhwFcdhwOp Conv3DNcdhwFcdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv3DNcdhwFcdhwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv3DNcdhwFcdhwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv3DNcdhwFcdhwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv3DNdhwcDhwcfOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv3DNdhwcDhwcfOpGenericAdaptorBase::Conv3DNdhwcDhwcfOpGenericAdaptorBase(Conv3DNdhwcDhwcfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv3DNdhwcDhwcfOpAdaptor::Conv3DNdhwcDhwcfOpAdaptor(Conv3DNdhwcDhwcfOp op) : Conv3DNdhwcDhwcfOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv3DNdhwcDhwcfOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ndhwc_dhwcf' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ndhwc_dhwcf' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv3DNdhwcDhwcfOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv3DNdhwcDhwcfOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv3DNdhwcDhwcfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv3DNdhwcDhwcfOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv3DNdhwcDhwcfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv3DNdhwcDhwcfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv3DNdhwcDhwcfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv3DNdhwcDhwcfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv3DNdhwcDhwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv3DNdhwcDhwcfOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv3DNdhwcDhwcfOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv3DNdhwcDhwcfOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfOp Conv3DNdhwcDhwcfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv3DNdhwcDhwcfOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv3DNdhwcDhwcfOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv3DNdhwcDhwcfQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv3DNdhwcDhwcfQOpGenericAdaptorBase::Conv3DNdhwcDhwcfQOpGenericAdaptorBase(Conv3DNdhwcDhwcfQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
Conv3DNdhwcDhwcfQOpAdaptor::Conv3DNdhwcDhwcfQOpAdaptor(Conv3DNdhwcDhwcfQOp op) : Conv3DNdhwcDhwcfQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ndhwc_dhwcf_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.conv_3d_ndhwc_dhwcf_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv3DNdhwcDhwcfQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv3DNdhwcDhwcfQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv3DNdhwcDhwcfQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv3DNdhwcDhwcfQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv3DNdhwcDhwcfQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv3DNdhwcDhwcfQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv3DNdhwcDhwcfQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv3DNdhwcDhwcfQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv3DNdhwcDhwcfQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr Conv3DNdhwcDhwcfQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void Conv3DNdhwcDhwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv3DNdhwcDhwcfQOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv3DNdhwcDhwcfQOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void Conv3DNdhwcDhwcfQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, Conv3DNdhwcDhwcfQOp::getRegionBuilder());
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DNdhwcDhwcfQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DNdhwcDhwcfQOp Conv3DNdhwcDhwcfQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv3DNdhwcDhwcfQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv3DNdhwcDhwcfQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv3DNdhwcDhwcfQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Conv3DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Conv3DOpGenericAdaptorBase::Conv3DOpGenericAdaptorBase(Conv3DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Conv3DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
Conv3DOpAdaptor::Conv3DOpAdaptor(Conv3DOp op) : Conv3DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Conv3DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> Conv3DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Conv3DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Conv3DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Conv3DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Conv3DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Conv3DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Conv3DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Conv3DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Conv3DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Conv3DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Conv3DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult Conv3DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Conv3DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void Conv3DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Conv3DOp::getRegionBuilder());
}
Conv3DOp Conv3DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DOp Conv3DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Conv3DOp::getRegionBuilder());
}
Conv3DOp Conv3DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DOp Conv3DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Conv3DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Conv3DOp Conv3DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Conv3DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Conv3DOp Conv3DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Conv3DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Conv3DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Conv3DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Conv3DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Conv3DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::CopyOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
CopyOpGenericAdaptorBase::CopyOpGenericAdaptorBase(CopyOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> CopyOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::linalg::TypeFnAttr CopyOpGenericAdaptorBase::getCastAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::linalg::TypeFnAttr>(getProperties().cast);
if (!attr)
attr = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed);
return attr;
}
::mlir::linalg::TypeFn CopyOpGenericAdaptorBase::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
} // namespace detail
CopyOpAdaptor::CopyOpAdaptor(CopyOp op) : CopyOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult CopyOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
if (tblgen_cast && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(tblgen_cast))))
return emitError(loc, "'linalg.copy' op attribute 'cast' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1");
return ::mlir::success();
}
std::pair<unsigned, unsigned> CopyOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange CopyOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange CopyOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> CopyOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult CopyOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.cast;
auto attr = dict.get("cast");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute CopyOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.cast;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("cast",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code CopyOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.cast.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> CopyOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "cast")
return prop.cast;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void CopyOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "cast") {
prop.cast = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.cast)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void CopyOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.cast) attrs.append("cast", prop.cast);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult CopyOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getCastAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, "cast", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult CopyOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.cast)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void CopyOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.cast);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::linalg::TypeFn CopyOp::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
void CopyOp::setCast(::std::optional<::mlir::linalg::TypeFn> attrValue) {
auto &odsProp = getProperties().cast;
if (attrValue)
odsProp = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue);
else
odsProp = nullptr;
}
void CopyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, CopyOp::getRegionBuilder());
}
CopyOp CopyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CopyOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CopyOp CopyOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void CopyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, CopyOp::getRegionBuilder());
}
CopyOp CopyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CopyOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CopyOp CopyOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void CopyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
CopyOp CopyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CopyOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CopyOp CopyOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void CopyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("cast", cast);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, CopyOp::getRegionBuilder());
}
CopyOp CopyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<CopyOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
CopyOp CopyOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult CopyOp::verifyInvariantsImpl() {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(*this, tblgen_cast, "cast")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult CopyOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult CopyOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.cast;
auto castAttrName = ::mlir::StringAttr::get(ctx, "cast");
auto attr = dict.get(castAttrName);
usedKeys.insert(castAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for cast in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::CopyOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::CopyOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv1DNcwCwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv1DNcwCwOpGenericAdaptorBase::DepthwiseConv1DNcwCwOpGenericAdaptorBase(DepthwiseConv1DNcwCwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv1DNcwCwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv1DNcwCwOpAdaptor::DepthwiseConv1DNcwCwOpAdaptor(DepthwiseConv1DNcwCwOp op) : DepthwiseConv1DNcwCwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv1DNcwCwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_ncw_cw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_ncw_cw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv1DNcwCwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv1DNcwCwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv1DNcwCwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv1DNcwCwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv1DNcwCwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv1DNcwCwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv1DNcwCwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv1DNcwCwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv1DNcwCwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv1DNcwCwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNcwCwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv1DNcwCwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv1DNcwCwOp::getRegionBuilder());
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNcwCwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNcwCwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv1DNcwCwOp::getRegionBuilder());
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNcwCwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNcwCwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNcwCwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNcwCwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv1DNcwCwOp::getRegionBuilder());
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNcwCwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNcwCwOp DepthwiseConv1DNcwCwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv1DNcwCwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv1DNcwCwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv1DNcwCwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv1DNwcWcOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv1DNwcWcOpGenericAdaptorBase::DepthwiseConv1DNwcWcOpGenericAdaptorBase(DepthwiseConv1DNwcWcOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv1DNwcWcOpAdaptor::DepthwiseConv1DNwcWcOpAdaptor(DepthwiseConv1DNwcWcOp op) : DepthwiseConv1DNwcWcOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv1DNwcWcOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_nwc_wc' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_nwc_wc' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv1DNwcWcOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv1DNwcWcOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv1DNwcWcOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv1DNwcWcOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv1DNwcWcOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv1DNwcWcOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv1DNwcWcOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv1DNwcWcOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv1DNwcWcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv1DNwcWcOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv1DNwcWcOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv1DNwcWcOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcOp DepthwiseConv1DNwcWcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv1DNwcWcOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv1DNwcWcOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv1DNwcWcmOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv1DNwcWcmOpGenericAdaptorBase::DepthwiseConv1DNwcWcmOpGenericAdaptorBase(DepthwiseConv1DNwcWcmOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcmOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv1DNwcWcmOpAdaptor::DepthwiseConv1DNwcWcmOpAdaptor(DepthwiseConv1DNwcWcmOp op) : DepthwiseConv1DNwcWcmOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_nwc_wcm' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.depthwise_conv_1d_nwc_wcm' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcmOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv1DNwcWcmOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv1DNwcWcmOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv1DNwcWcmOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv1DNwcWcmOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv1DNwcWcmOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv1DNwcWcmOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv1DNwcWcmOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv1DNwcWcmOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv1DNwcWcmOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv1DNwcWcmOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv1DNwcWcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv1DNwcWcmOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv1DNwcWcmOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv1DNwcWcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv1DNwcWcmOp::getRegionBuilder());
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv1DNwcWcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv1DNwcWcmOp DepthwiseConv1DNwcWcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv1DNwcWcmOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv1DNwcWcmOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv1DNwcWcmOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv2DNchwChwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv2DNchwChwOpGenericAdaptorBase::DepthwiseConv2DNchwChwOpGenericAdaptorBase(DepthwiseConv2DNchwChwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv2DNchwChwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv2DNchwChwOpAdaptor::DepthwiseConv2DNchwChwOpAdaptor(DepthwiseConv2DNchwChwOp op) : DepthwiseConv2DNchwChwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv2DNchwChwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nchw_chw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nchw_chw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv2DNchwChwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv2DNchwChwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv2DNchwChwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv2DNchwChwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv2DNchwChwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv2DNchwChwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv2DNchwChwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv2DNchwChwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv2DNchwChwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv2DNchwChwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNchwChwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv2DNchwChwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv2DNchwChwOp::getRegionBuilder());
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNchwChwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNchwChwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv2DNchwChwOp::getRegionBuilder());
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNchwChwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNchwChwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNchwChwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNchwChwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv2DNchwChwOp::getRegionBuilder());
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNchwChwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNchwChwOp DepthwiseConv2DNchwChwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv2DNchwChwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv2DNchwChwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv2DNchwChwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv2DNhwcHwcOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::DepthwiseConv2DNhwcHwcOpGenericAdaptorBase(DepthwiseConv2DNhwcHwcOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv2DNhwcHwcOpAdaptor::DepthwiseConv2DNhwcHwcOpAdaptor(DepthwiseConv2DNhwcHwcOp op) : DepthwiseConv2DNhwcHwcOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwc' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwc' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv2DNhwcHwcOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv2DNhwcHwcOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv2DNhwcHwcOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv2DNhwcHwcOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv2DNhwcHwcOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv2DNhwcHwcOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv2DNhwcHwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv2DNhwcHwcOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcOp DepthwiseConv2DNhwcHwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv2DNhwcHwcOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv2DNhwcHwcOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv2DNhwcHwcQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase(DepthwiseConv2DNhwcHwcQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv2DNhwcHwcQOpAdaptor::DepthwiseConv2DNhwcHwcQOpAdaptor(DepthwiseConv2DNhwcHwcQOp op) : DepthwiseConv2DNhwcHwcQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwc_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwc_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv2DNhwcHwcQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv2DNhwcHwcQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv2DNhwcHwcQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv2DNhwcHwcQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv2DNhwcHwcQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv2DNhwcHwcQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv2DNhwcHwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv2DNhwcHwcQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcQOp DepthwiseConv2DNhwcHwcQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv2DNhwcHwcQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv2DNhwcHwcQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv2DNhwcHwcmOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase(DepthwiseConv2DNhwcHwcmOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv2DNhwcHwcmOpAdaptor::DepthwiseConv2DNhwcHwcmOpAdaptor(DepthwiseConv2DNhwcHwcmOp op) : DepthwiseConv2DNhwcHwcmOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwcm' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwcm' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcmOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcmOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv2DNhwcHwcmOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv2DNhwcHwcmOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv2DNhwcHwcmOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv2DNhwcHwcmOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv2DNhwcHwcmOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv2DNhwcHwcmOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv2DNhwcHwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcmOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv2DNhwcHwcmOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcmOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmOp DepthwiseConv2DNhwcHwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv2DNhwcHwcmOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv2DNhwcHwcmOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv2DNhwcHwcmQOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase(DepthwiseConv2DNhwcHwcmQOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv2DNhwcHwcmQOpAdaptor::DepthwiseConv2DNhwcHwcmQOpAdaptor(DepthwiseConv2DNhwcHwcmQOp op) : DepthwiseConv2DNhwcHwcmQOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwcm_q' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.depthwise_conv_2d_nhwc_hwcm_q' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmQOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcmQOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv2DNhwcHwcmQOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv2DNhwcHwcmQOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv2DNhwcHwcmQOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv2DNhwcHwcmQOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv2DNhwcHwcmQOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv2DNhwcHwcmQOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv2DNhwcHwcmQOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv2DNhwcHwcmQOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv2DNhwcHwcmQOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv2DNhwcHwcmQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcmQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv2DNhwcHwcmQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv2DNhwcHwcmQOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv2DNhwcHwcmQOp::getRegionBuilder());
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv2DNhwcHwcmQOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv2DNhwcHwcmQOp DepthwiseConv2DNhwcHwcmQOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv2DNhwcHwcmQOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv2DNhwcHwcmQOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv2DNhwcHwcmQOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv3DNcdhwCdhwOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase(DepthwiseConv3DNcdhwCdhwOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv3DNcdhwCdhwOpAdaptor::DepthwiseConv3DNcdhwCdhwOpAdaptor(DepthwiseConv3DNcdhwCdhwOp op) : DepthwiseConv3DNcdhwCdhwOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ncdhw_cdhw' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ncdhw_cdhw' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv3DNcdhwCdhwOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv3DNcdhwCdhwOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv3DNcdhwCdhwOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv3DNcdhwCdhwOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv3DNcdhwCdhwOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv3DNcdhwCdhwOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv3DNcdhwCdhwOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv3DNcdhwCdhwOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv3DNcdhwCdhwOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv3DNcdhwCdhwOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNcdhwCdhwOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv3DNcdhwCdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv3DNcdhwCdhwOp::getRegionBuilder());
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNcdhwCdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNcdhwCdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv3DNcdhwCdhwOp::getRegionBuilder());
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNcdhwCdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNcdhwCdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNcdhwCdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNcdhwCdhwOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv3DNcdhwCdhwOp::getRegionBuilder());
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNcdhwCdhwOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNcdhwCdhwOp DepthwiseConv3DNcdhwCdhwOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv3DNcdhwCdhwOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv3DNcdhwCdhwOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv3DNcdhwCdhwOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv3DNdhwcDhwcOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase(DepthwiseConv3DNdhwcDhwcOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv3DNdhwcDhwcOpAdaptor::DepthwiseConv3DNdhwcDhwcOpAdaptor(DepthwiseConv3DNdhwcDhwcOp op) : DepthwiseConv3DNdhwcDhwcOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ndhwc_dhwc' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ndhwc_dhwc' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv3DNdhwcDhwcOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv3DNdhwcDhwcOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv3DNdhwcDhwcOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv3DNdhwcDhwcOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv3DNdhwcDhwcOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv3DNdhwcDhwcOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv3DNdhwcDhwcOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv3DNdhwcDhwcOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv3DNdhwcDhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv3DNdhwcDhwcOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv3DNdhwcDhwcOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv3DNdhwcDhwcOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcOp DepthwiseConv3DNdhwcDhwcOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv3DNdhwcDhwcOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv3DNdhwcDhwcOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DepthwiseConv3DNdhwcDhwcmOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase(DepthwiseConv3DNdhwcDhwcmOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
DepthwiseConv3DNdhwcDhwcmOpAdaptor::DepthwiseConv3DNdhwcDhwcmOpAdaptor(DepthwiseConv3DNdhwcDhwcmOp op) : DepthwiseConv3DNdhwcDhwcmOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ndhwc_dhwcm' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.depthwise_conv_3d_ndhwc_dhwcm' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcmOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DepthwiseConv3DNdhwcDhwcmOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DepthwiseConv3DNdhwcDhwcmOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DepthwiseConv3DNdhwcDhwcmOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DepthwiseConv3DNdhwcDhwcmOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DepthwiseConv3DNdhwcDhwcmOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DepthwiseConv3DNdhwcDhwcmOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DepthwiseConv3DNdhwcDhwcmOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DepthwiseConv3DNdhwcDhwcmOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DepthwiseConv3DNdhwcDhwcmOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr DepthwiseConv3DNdhwcDhwcmOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void DepthwiseConv3DNdhwcDhwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DepthwiseConv3DNdhwcDhwcmOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DepthwiseConv3DNdhwcDhwcmOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void DepthwiseConv3DNdhwcDhwcmOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, DepthwiseConv3DNdhwcDhwcmOp::getRegionBuilder());
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DepthwiseConv3DNdhwcDhwcmOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DepthwiseConv3DNdhwcDhwcmOp DepthwiseConv3DNdhwcDhwcmOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DepthwiseConv3DNdhwcDhwcmOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DepthwiseConv3DNdhwcDhwcmOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DepthwiseConv3DNdhwcDhwcmOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DivOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DivOpGenericAdaptorBase::DivOpGenericAdaptorBase(DivOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DivOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
DivOpAdaptor::DivOpAdaptor(DivOp op) : DivOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DivOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> DivOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DivOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DivOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DivOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DivOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DivOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DivOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DivOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DivOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DivOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DivOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult DivOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DivOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void DivOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DivOp::getRegionBuilder());
}
DivOp DivOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivOp DivOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DivOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DivOp::getRegionBuilder());
}
DivOp DivOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivOp DivOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DivOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DivOp DivOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivOp DivOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DivOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DivOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DivOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DivOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DivOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DivUnsignedOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DivUnsignedOpGenericAdaptorBase::DivUnsignedOpGenericAdaptorBase(DivUnsignedOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DivUnsignedOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
DivUnsignedOpAdaptor::DivUnsignedOpAdaptor(DivUnsignedOp op) : DivUnsignedOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DivUnsignedOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> DivUnsignedOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DivUnsignedOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DivUnsignedOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DivUnsignedOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DivUnsignedOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DivUnsignedOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DivUnsignedOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DivUnsignedOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DivUnsignedOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DivUnsignedOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DivUnsignedOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult DivUnsignedOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DivUnsignedOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void DivUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DivUnsignedOp::getRegionBuilder());
}
DivUnsignedOp DivUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivUnsignedOp DivUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DivUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DivUnsignedOp::getRegionBuilder());
}
DivUnsignedOp DivUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivUnsignedOp DivUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DivUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DivUnsignedOp DivUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DivUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DivUnsignedOp DivUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DivUnsignedOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DivUnsignedOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DivUnsignedOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DivUnsignedOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DivUnsignedOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::DotOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
DotOpGenericAdaptorBase::DotOpGenericAdaptorBase(DotOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> DotOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
DotOpAdaptor::DotOpAdaptor(DotOp op) : DotOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult DotOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> DotOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange DotOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange DotOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> DotOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult DotOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute DotOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code DotOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> DotOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void DotOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void DotOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult DotOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult DotOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void DotOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void DotOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, DotOp::getRegionBuilder());
}
DotOp DotOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DotOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DotOp DotOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DotOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, DotOp::getRegionBuilder());
}
DotOp DotOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DotOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DotOp DotOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void DotOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
DotOp DotOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<DotOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
DotOp DotOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult DotOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult DotOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult DotOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::DotOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::DotOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ElementwiseOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ElementwiseOpGenericAdaptorBase::ElementwiseOpGenericAdaptorBase(ElementwiseOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ElementwiseOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::linalg::ElementwiseKind ElementwiseOpGenericAdaptorBase::getKind() {
auto attr = getKindAttr();
return attr.getValue();
}
::mlir::ArrayAttr ElementwiseOpGenericAdaptorBase::getIndexingMapsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::ArrayAttr>(getProperties().indexing_maps);
if (!attr)
attr = ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr({});
return attr;
}
::mlir::ArrayAttr ElementwiseOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr({});
return attr;
}
} // namespace detail
ElementwiseOpAdaptor::ElementwiseOpAdaptor(ElementwiseOp op) : ElementwiseOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ElementwiseOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
auto tblgen_kind = getProperties().kind; (void)tblgen_kind;
if (!tblgen_kind) return emitError(loc, "'linalg.elementwise' op requires attribute 'kind'");
if (tblgen_kind && !((::llvm::isa<::mlir::linalg::ElementwiseKindAttr>(tblgen_kind))))
return emitError(loc, "'linalg.elementwise' op attribute 'kind' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35");
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.elementwise' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
return ::mlir::success();
}
std::pair<unsigned, unsigned> ElementwiseOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange ElementwiseOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange ElementwiseOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> ElementwiseOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ElementwiseOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.kind;
auto attr = dict.get("kind");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `kind` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute ElementwiseOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.kind;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("kind",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ElementwiseOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
llvm::hash_value(prop.kind.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> ElementwiseOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "kind")
return prop.kind;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void ElementwiseOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "kind") {
prop.kind = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.kind)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void ElementwiseOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
if (prop.kind) attrs.append("kind", prop.kind);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult ElementwiseOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getKindAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps7(attr, "kind", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ElementwiseOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (::mlir::failed(reader.readAttribute(prop.kind)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void ElementwiseOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.indexing_maps);
writer.writeAttribute(prop.kind);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::linalg::ElementwiseKind ElementwiseOp::getKind() {
auto attr = getKindAttr();
return attr.getValue();
}
::mlir::ArrayAttr ElementwiseOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder((*this)->getContext()).getAffineMapArrayAttr({});
return attr;
}
void ElementwiseOp::setKind(::mlir::linalg::ElementwiseKind attrValue) {
getProperties().kind = ::mlir::linalg::ElementwiseKindAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue);
}
void ElementwiseOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, ElementwiseOp::getRegionBuilder());
}
ElementwiseOp ElementwiseOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ElementwiseOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ElementwiseOp ElementwiseOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ElementwiseOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ElementwiseKindAttr kind, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("kind", kind);
odsState.addAttribute("indexing_maps", indexingMaps);
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, ElementwiseOp::getRegionBuilder());
}
ElementwiseOp ElementwiseOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ElementwiseKindAttr kind, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(kind)>(kind), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ElementwiseOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ElementwiseOp ElementwiseOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ElementwiseKindAttr kind, ArrayAttr indexingMaps, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(kind)>(kind), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult ElementwiseOp::verifyInvariantsImpl() {
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
auto tblgen_kind = getProperties().kind; (void)tblgen_kind;
if (!tblgen_kind) return emitOpError("requires attribute 'kind'");
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps7(*this, tblgen_kind, "kind")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ElementwiseOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult ElementwiseOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.kind;
auto kindAttrName = ::mlir::StringAttr::get(ctx, "kind");
auto attr = dict.get(kindAttrName);
usedKeys.insert(kindAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for kind in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `kind` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ElementwiseOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ElementwiseOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ErfOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ErfOpGenericAdaptorBase::ErfOpGenericAdaptorBase(ErfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ErfOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
ErfOpAdaptor::ErfOpAdaptor(ErfOp op) : ErfOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ErfOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> ErfOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange ErfOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange ErfOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> ErfOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ErfOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute ErfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ErfOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> ErfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void ErfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void ErfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult ErfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult ErfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void ErfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void ErfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, ErfOp::getRegionBuilder());
}
ErfOp ErfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ErfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ErfOp ErfOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ErfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, ErfOp::getRegionBuilder());
}
ErfOp ErfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ErfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ErfOp ErfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ErfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
ErfOp ErfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ErfOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ErfOp ErfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult ErfOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ErfOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult ErfOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ErfOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ErfOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ExpOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ExpOpGenericAdaptorBase::ExpOpGenericAdaptorBase(ExpOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ExpOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
ExpOpAdaptor::ExpOpAdaptor(ExpOp op) : ExpOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ExpOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> ExpOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange ExpOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange ExpOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> ExpOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ExpOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute ExpOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ExpOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> ExpOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void ExpOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void ExpOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult ExpOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult ExpOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void ExpOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void ExpOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, ExpOp::getRegionBuilder());
}
ExpOp ExpOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ExpOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ExpOp ExpOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ExpOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, ExpOp::getRegionBuilder());
}
ExpOp ExpOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ExpOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ExpOp ExpOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ExpOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
ExpOp ExpOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ExpOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ExpOp ExpOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult ExpOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ExpOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult ExpOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ExpOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ExpOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::FillOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
FillOpGenericAdaptorBase::FillOpGenericAdaptorBase(FillOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> FillOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
FillOpAdaptor::FillOpAdaptor(FillOp op) : FillOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult FillOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> FillOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange FillOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange FillOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> FillOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult FillOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute FillOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code FillOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> FillOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void FillOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void FillOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult FillOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult FillOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void FillOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void FillOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, FillOp::getRegionBuilder());
}
FillOp FillOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillOp FillOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FillOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, FillOp::getRegionBuilder());
}
FillOp FillOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillOp FillOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FillOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
FillOp FillOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillOp FillOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult FillOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult FillOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult FillOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::FillOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::FillOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::FillRng2DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
FillRng2DOpGenericAdaptorBase::FillRng2DOpGenericAdaptorBase(FillRng2DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> FillRng2DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
FillRng2DOpAdaptor::FillRng2DOpAdaptor(FillRng2DOp op) : FillRng2DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult FillRng2DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> FillRng2DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange FillRng2DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange FillRng2DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> FillRng2DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult FillRng2DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute FillRng2DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code FillRng2DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> FillRng2DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void FillRng2DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void FillRng2DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult FillRng2DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult FillRng2DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void FillRng2DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void FillRng2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, FillRng2DOp::getRegionBuilder());
}
FillRng2DOp FillRng2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillRng2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillRng2DOp FillRng2DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FillRng2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, FillRng2DOp::getRegionBuilder());
}
FillRng2DOp FillRng2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillRng2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillRng2DOp FillRng2DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FillRng2DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
FillRng2DOp FillRng2DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FillRng2DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FillRng2DOp FillRng2DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult FillRng2DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult FillRng2DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult FillRng2DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::FillRng2DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::FillRng2DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::FloorOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
FloorOpGenericAdaptorBase::FloorOpGenericAdaptorBase(FloorOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> FloorOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
FloorOpAdaptor::FloorOpAdaptor(FloorOp op) : FloorOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult FloorOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> FloorOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange FloorOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange FloorOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> FloorOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult FloorOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute FloorOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code FloorOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> FloorOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void FloorOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void FloorOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult FloorOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult FloorOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void FloorOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void FloorOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, FloorOp::getRegionBuilder());
}
FloorOp FloorOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FloorOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FloorOp FloorOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FloorOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, FloorOp::getRegionBuilder());
}
FloorOp FloorOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FloorOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FloorOp FloorOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void FloorOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
FloorOp FloorOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<FloorOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
FloorOp FloorOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult FloorOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult FloorOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult FloorOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::FloorOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::FloorOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::GenericOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
GenericOpGenericAdaptorBase::GenericOpGenericAdaptorBase(GenericOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> GenericOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::ArrayAttr GenericOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
return attr;
}
::mlir::ArrayAttr GenericOpGenericAdaptorBase::getIteratorTypes() {
auto attr = getIteratorTypesAttr();
return attr;
}
::std::optional< ::llvm::StringRef > GenericOpGenericAdaptorBase::getDoc() {
auto attr = getDocAttr();
return attr ? ::std::optional< ::llvm::StringRef >(attr.getValue()) : (::std::nullopt);
}
::std::optional< ::llvm::StringRef > GenericOpGenericAdaptorBase::getLibraryCall() {
auto attr = getLibraryCallAttr();
return attr ? ::std::optional< ::llvm::StringRef >(attr.getValue()) : (::std::nullopt);
}
} // namespace detail
GenericOpAdaptor::GenericOpAdaptor(GenericOp op) : GenericOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult GenericOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_doc = getProperties().doc; (void)tblgen_doc;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (!tblgen_indexing_maps) return emitError(loc, "'linalg.generic' op requires attribute 'indexing_maps'");
auto tblgen_iterator_types = getProperties().iterator_types; (void)tblgen_iterator_types;
if (!tblgen_iterator_types) return emitError(loc, "'linalg.generic' op requires attribute 'iterator_types'");
auto tblgen_library_call = getProperties().library_call; (void)tblgen_library_call;
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.generic' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
if (tblgen_iterator_types && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_iterator_types))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_iterator_types), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::linalg::IteratorTypeAttr>(attr))); }))))
return emitError(loc, "'linalg.generic' op attribute 'iterator_types' failed to satisfy constraint: Iterator type should be an enum.");
if (tblgen_doc && !((::llvm::isa<::mlir::StringAttr>(tblgen_doc))))
return emitError(loc, "'linalg.generic' op attribute 'doc' failed to satisfy constraint: string attribute");
if (tblgen_library_call && !((::llvm::isa<::mlir::StringAttr>(tblgen_library_call))))
return emitError(loc, "'linalg.generic' op attribute 'library_call' failed to satisfy constraint: string attribute");
return ::mlir::success();
}
std::pair<unsigned, unsigned> GenericOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange GenericOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange GenericOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> GenericOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult GenericOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.doc;
auto attr = dict.get("doc");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `doc` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.iterator_types;
auto attr = dict.get("iterator_types");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `iterator_types` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.library_call;
auto attr = dict.get("library_call");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `library_call` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute GenericOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.doc;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("doc",
propStorage));
}
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.iterator_types;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("iterator_types",
propStorage));
}
{
const auto &propStorage = prop.library_call;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("library_call",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code GenericOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.doc.getAsOpaquePointer()),
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
llvm::hash_value(prop.iterator_types.getAsOpaquePointer()),
llvm::hash_value(prop.library_call.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> GenericOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "doc")
return prop.doc;
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "iterator_types")
return prop.iterator_types;
if (name == "library_call")
return prop.library_call;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void GenericOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "doc") {
prop.doc = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.doc)>>(value);
return;
}
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "iterator_types") {
prop.iterator_types = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.iterator_types)>>(value);
return;
}
if (name == "library_call") {
prop.library_call = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.library_call)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void GenericOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.doc) attrs.append("doc", prop.doc);
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
if (prop.iterator_types) attrs.append("iterator_types", prop.iterator_types);
if (prop.library_call) attrs.append("library_call", prop.library_call);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult GenericOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDocAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps9(attr, "doc", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIteratorTypesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps8(attr, "iterator_types", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getLibraryCallAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps9(attr, "library_call", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult GenericOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.doc)))
return ::mlir::failure();
if (::mlir::failed(reader.readAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (::mlir::failed(reader.readAttribute(prop.iterator_types)))
return ::mlir::failure();
if (::mlir::failed(reader.readOptionalAttribute(prop.library_call)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void GenericOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.doc);
writer.writeAttribute(prop.indexing_maps);
writer.writeAttribute(prop.iterator_types);
writer.writeOptionalAttribute(prop.library_call);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::ArrayAttr GenericOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
return attr;
}
::mlir::ArrayAttr GenericOp::getIteratorTypes() {
auto attr = getIteratorTypesAttr();
return attr;
}
::std::optional< ::llvm::StringRef > GenericOp::getDoc() {
auto attr = getDocAttr();
return attr ? ::std::optional< ::llvm::StringRef >(attr.getValue()) : (::std::nullopt);
}
::std::optional< ::llvm::StringRef > GenericOp::getLibraryCall() {
auto attr = getLibraryCallAttr();
return attr ? ::std::optional< ::llvm::StringRef >(attr.getValue()) : (::std::nullopt);
}
void GenericOp::setDoc(::std::optional<::llvm::StringRef> attrValue) {
auto &odsProp = getProperties().doc;
if (attrValue)
odsProp = ::mlir::Builder((*this)->getContext()).getStringAttr(*attrValue);
else
odsProp = nullptr;
}
void GenericOp::setLibraryCall(::std::optional<::llvm::StringRef> attrValue) {
auto &odsProp = getProperties().library_call;
if (attrValue)
odsProp = ::mlir::Builder((*this)->getContext()).getStringAttr(*attrValue);
else
odsProp = nullptr;
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayAttr iteratorTypes, StringAttr doc, StringAttr libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg7, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg7)>(odsArg7), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayAttr indexingMaps, ArrayAttr iteratorTypes, StringAttr doc, StringAttr libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg7, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg7)>(odsArg7), std::forward<decltype(attributes)>(attributes));
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, StringRef doc, StringRef libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg7, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg7)>(odsArg7), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, StringRef doc, StringRef libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg7, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg7)>(odsArg7), std::forward<decltype(attributes)>(attributes));
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, StringRef doc, StringRef libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg6, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputBuffers)>(outputBuffers), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg6)>(odsArg6), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, StringRef doc, StringRef libraryCall, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg6, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputBuffers)>(outputBuffers), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(doc)>(doc), std::forward<decltype(libraryCall)>(libraryCall), std::forward<decltype(odsArg6)>(odsArg6), std::forward<decltype(attributes)>(attributes));
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg5, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(odsArg5)>(odsArg5), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg5, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(odsArg5)>(odsArg5), std::forward<decltype(attributes)>(attributes));
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg4, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputBuffers)>(outputBuffers), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(odsArg4)>(odsArg4), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, ArrayRef<utils::IteratorType> iteratorTypes, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg4, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputBuffers)>(outputBuffers), std::forward<decltype(indexingMaps)>(indexingMaps), std::forward<decltype(iteratorTypes)>(iteratorTypes), std::forward<decltype(odsArg4)>(odsArg4), std::forward<decltype(attributes)>(attributes));
}
void GenericOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange result_tensors, ::mlir::ValueRange inputs, ::mlir::ValueRange outputs, ::mlir::ArrayAttr indexing_maps, ::mlir::ArrayAttr iterator_types, /*optional*/::mlir::StringAttr doc, /*optional*/::mlir::StringAttr library_call) {
odsState.addOperands(inputs);
odsState.addOperands(outputs);
::llvm::copy(::llvm::ArrayRef<int32_t>({static_cast<int32_t>(inputs.size()), static_cast<int32_t>(outputs.size())}), odsState.getOrAddProperties<Properties>().operandSegmentSizes.begin());
odsState.getOrAddProperties<Properties>().indexing_maps = indexing_maps;
odsState.getOrAddProperties<Properties>().iterator_types = iterator_types;
if (doc) {
odsState.getOrAddProperties<Properties>().doc = doc;
}
if (library_call) {
odsState.getOrAddProperties<Properties>().library_call = library_call;
}
(void)odsState.addRegion();
odsState.addTypes(result_tensors);
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange result_tensors, ::mlir::ValueRange inputs, ::mlir::ValueRange outputs, ::mlir::ArrayAttr indexing_maps, ::mlir::ArrayAttr iterator_types, /*optional*/::mlir::StringAttr doc, /*optional*/::mlir::StringAttr library_call) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(result_tensors)>(result_tensors), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexing_maps)>(indexing_maps), std::forward<decltype(iterator_types)>(iterator_types), std::forward<decltype(doc)>(doc), std::forward<decltype(library_call)>(library_call));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange result_tensors, ::mlir::ValueRange inputs, ::mlir::ValueRange outputs, ::mlir::ArrayAttr indexing_maps, ::mlir::ArrayAttr iterator_types, /*optional*/::mlir::StringAttr doc, /*optional*/::mlir::StringAttr library_call) {
return create(builder, builder.getLoc(), std::forward<decltype(result_tensors)>(result_tensors), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(indexing_maps)>(indexing_maps), std::forward<decltype(iterator_types)>(iterator_types), std::forward<decltype(doc)>(doc), std::forward<decltype(library_call)>(library_call));
}
void GenericOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
if (!attributes.empty()) {
(void)odsState.getOrAddProperties<GenericOp::Properties>();
::mlir::PropertyRef properties = odsState.getRawProperties();
std::optional<::mlir::RegisteredOperationName> info =
odsState.name.getRegisteredInfo();
if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
::llvm::report_fatal_error("Property conversion failed.");
}
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void GenericOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
odsState.addOperands(operands);
odsState.useProperties(const_cast<Properties&>(properties));
odsState.addAttributes(discardableAttributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
}
GenericOp GenericOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
auto __res__ = ::llvm::dyn_cast<GenericOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
GenericOp GenericOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
}
::llvm::LogicalResult GenericOp::verifyInvariantsImpl() {
auto tblgen_doc = getProperties().doc; (void)tblgen_doc;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (!tblgen_indexing_maps) return emitOpError("requires attribute 'indexing_maps'");
auto tblgen_iterator_types = getProperties().iterator_types; (void)tblgen_iterator_types;
if (!tblgen_iterator_types) return emitOpError("requires attribute 'iterator_types'");
auto tblgen_library_call = getProperties().library_call; (void)tblgen_library_call;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps8(*this, tblgen_iterator_types, "iterator_types")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps9(*this, tblgen_doc, "doc")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps9(*this, tblgen_library_call, "library_call")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult GenericOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult GenericOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.iterator_types;
auto iterator_typesAttrName = ::mlir::StringAttr::get(ctx, "iterator_types");
auto attr = dict.get(iterator_typesAttrName);
usedKeys.insert(iterator_typesAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for iterator_types in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `iterator_types` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.doc;
auto docAttrName = ::mlir::StringAttr::get(ctx, "doc");
auto attr = dict.get(docAttrName);
usedKeys.insert(docAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for doc in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `doc` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.library_call;
auto library_callAttrName = ::mlir::StringAttr::get(ctx, "library_call");
auto attr = dict.get(library_callAttrName);
usedKeys.insert(library_callAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for library_call in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `library_call` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::GenericOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::GenericOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::LogOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
LogOpGenericAdaptorBase::LogOpGenericAdaptorBase(LogOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> LogOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
LogOpAdaptor::LogOpAdaptor(LogOp op) : LogOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult LogOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> LogOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange LogOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange LogOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> LogOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult LogOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute LogOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code LogOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> LogOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void LogOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void LogOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult LogOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult LogOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void LogOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void LogOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, LogOp::getRegionBuilder());
}
LogOp LogOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<LogOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
LogOp LogOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void LogOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, LogOp::getRegionBuilder());
}
LogOp LogOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<LogOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
LogOp LogOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void LogOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
LogOp LogOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<LogOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
LogOp LogOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult LogOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult LogOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult LogOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::LogOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::LogOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MapOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MapOpGenericAdaptorBase::MapOpGenericAdaptorBase(MapOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MapOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
bool isVariadic[] = {true, false};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (odsOperandsSize - 1) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
} // namespace detail
MapOpAdaptor::MapOpAdaptor(MapOp op) : MapOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MapOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> MapOp::getODSOperandIndexAndLength(unsigned index) {
bool isVariadic[] = {true, false};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumOperands() - 1) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::mlir::MutableOperandRange MapOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);
return mutableRange;
}
std::pair<unsigned, unsigned> MapOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MapOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MapOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MapOp::computePropertiesHash(const Properties &prop) {
using llvm::hash_value;
return llvm::hash_combine();
}
std::optional<mlir::Attribute> MapOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
return std::nullopt;
}
void MapOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
}
void MapOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
}
::llvm::LogicalResult MapOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
MapOp MapOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, Value init, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg2, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(init)>(init), std::forward<decltype(odsArg2)>(odsArg2), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MapOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MapOp MapOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, Value init, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg2, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(init)>(init), std::forward<decltype(odsArg2)>(odsArg2), std::forward<decltype(attributes)>(attributes));
}
void MapOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange result, ::mlir::ValueRange inputs, ::mlir::Value init) {
odsState.addOperands(inputs);
odsState.addOperands(init);
(void)odsState.addRegion();
odsState.addTypes(result);
}
MapOp MapOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange result, ::mlir::ValueRange inputs, ::mlir::Value init) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(result)>(result), std::forward<decltype(inputs)>(inputs), std::forward<decltype(init)>(init));
auto __res__ = ::llvm::dyn_cast<MapOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MapOp MapOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange result, ::mlir::ValueRange inputs, ::mlir::Value init) {
return create(builder, builder.getLoc(), std::forward<decltype(result)>(result), std::forward<decltype(inputs)>(inputs), std::forward<decltype(init)>(init));
}
void MapOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
assert(operands.size() >= 1u && "mismatched number of parameters");
odsState.addOperands(operands);
odsState.addAttributes(attributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
}
MapOp MapOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MapOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MapOp MapOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void MapOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
assert(operands.size() >= 1u && "mismatched number of parameters");
odsState.addOperands(operands);
odsState.useProperties(const_cast<Properties&>(properties));
odsState.addAttributes(discardableAttributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
}
MapOp MapOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
auto __res__ = ::llvm::dyn_cast<MapOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MapOp MapOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
}
::llvm::LogicalResult MapOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps6(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps4(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps5(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps2(*this, region, "mapper", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MapOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult MapOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MapOp)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MatmulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MatmulOpGenericAdaptorBase::MatmulOpGenericAdaptorBase(MatmulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MatmulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::ArrayAttr MatmulOpGenericAdaptorBase::getIndexingMapsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::ArrayAttr>(getProperties().indexing_maps);
if (!attr)
attr = ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(MatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::ArrayAttr MatmulOpGenericAdaptorBase::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder(odsAttrs.getContext()).getAffineMapArrayAttr(MatmulOp::getDefaultIndexingMaps(::mlir::Builder(odsAttrs.getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFnAttr MatmulOpGenericAdaptorBase::getCastAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::linalg::TypeFnAttr>(getProperties().cast);
if (!attr)
attr = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed);
return attr;
}
::mlir::linalg::TypeFn MatmulOpGenericAdaptorBase::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder(odsAttrs.getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
} // namespace detail
MatmulOpAdaptor::MatmulOpAdaptor(MatmulOp op) : MatmulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MatmulOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (tblgen_indexing_maps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_indexing_maps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_indexing_maps), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::AffineMapAttr>(attr))); }))))
return emitError(loc, "'linalg.matmul' op attribute 'indexing_maps' failed to satisfy constraint: AffineMap array attribute");
if (tblgen_cast && !((::llvm::isa<::mlir::linalg::TypeFnAttr>(tblgen_cast))))
return emitError(loc, "'linalg.matmul' op attribute 'cast' failed to satisfy constraint: allowed 32-bit signless integer cases: 0, 1");
return ::mlir::success();
}
std::pair<unsigned, unsigned> MatmulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange MatmulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange MatmulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> MatmulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MatmulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.cast;
auto attr = dict.get("cast");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.indexing_maps;
auto attr = dict.get("indexing_maps");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MatmulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.cast;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("cast",
propStorage));
}
{
const auto &propStorage = prop.indexing_maps;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("indexing_maps",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MatmulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.cast.getAsOpaquePointer()),
llvm::hash_value(prop.indexing_maps.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> MatmulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "cast")
return prop.cast;
if (name == "indexing_maps")
return prop.indexing_maps;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void MatmulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "cast") {
prop.cast = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.cast)>>(value);
return;
}
if (name == "indexing_maps") {
prop.indexing_maps = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.indexing_maps)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void MatmulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.cast) attrs.append("cast", prop.cast);
if (prop.indexing_maps) attrs.append("indexing_maps", prop.indexing_maps);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult MatmulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getCastAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(attr, "cast", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getIndexingMapsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(attr, "indexing_maps", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MatmulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.cast)))
return ::mlir::failure();
if (::mlir::failed(reader.readOptionalAttribute(prop.indexing_maps)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void MatmulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.cast);
writer.writeOptionalAttribute(prop.indexing_maps);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::ArrayAttr MatmulOp::getIndexingMaps() {
auto attr = getIndexingMapsAttr();
if (!attr)
return ::mlir::Builder((*this)->getContext()).getAffineMapArrayAttr(MatmulOp::getDefaultIndexingMaps(::mlir::Builder((*this)->getContext()).getContext()));
return attr;
}
::mlir::linalg::TypeFn MatmulOp::getCast() {
auto attr = getCastAttr();
if (!attr)
return ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), TypeFn::cast_signed).getValue();
return attr.getValue();
}
void MatmulOp::setCast(::std::optional<::mlir::linalg::TypeFn> attrValue) {
auto &odsProp = getProperties().cast;
if (attrValue)
odsProp = ::mlir::linalg::TypeFnAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue);
else
odsProp = nullptr;
}
void MatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildMatmulOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, MatmulOp::getRegionBuilder(),
MatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
MatmulOp MatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatmulOp MatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildMatmulOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, MatmulOp::getRegionBuilder(),
MatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
MatmulOp MatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatmulOp MatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("cast", cast);
buildMatmulOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, MatmulOp::getRegionBuilder(),
MatmulOp::getDefaultIndexingMaps(odsBuilder.getContext()));
}
MatmulOp MatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatmulOp MatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute cast, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(cast)>(cast), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult MatmulOp::verifyInvariantsImpl() {
auto tblgen_cast = getProperties().cast; (void)tblgen_cast;
auto tblgen_indexing_maps = getProperties().indexing_maps; (void)tblgen_indexing_maps;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps1(*this, tblgen_indexing_maps, "indexing_maps")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps2(*this, tblgen_cast, "cast")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MatmulOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult MatmulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.indexing_maps;
auto indexing_mapsAttrName = ::mlir::StringAttr::get(ctx, "indexing_maps");
auto attr = dict.get(indexing_mapsAttrName);
usedKeys.insert(indexing_mapsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for indexing_maps in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `indexing_maps` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.cast;
auto castAttrName = ::mlir::StringAttr::get(ctx, "cast");
auto attr = dict.get(castAttrName);
usedKeys.insert(castAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for cast in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `cast` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MatmulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::MatmulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MatvecOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MatvecOpGenericAdaptorBase::MatvecOpGenericAdaptorBase(MatvecOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MatvecOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
MatvecOpAdaptor::MatvecOpAdaptor(MatvecOp op) : MatvecOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MatvecOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> MatvecOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange MatvecOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange MatvecOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> MatvecOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MatvecOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MatvecOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MatvecOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> MatvecOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void MatvecOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void MatvecOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult MatvecOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult MatvecOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void MatvecOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void MatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, MatvecOp::getRegionBuilder());
}
MatvecOp MatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatvecOp MatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, MatvecOp::getRegionBuilder());
}
MatvecOp MatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatvecOp MatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MatvecOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
MatvecOp MatvecOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MatvecOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MatvecOp MatvecOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult MatvecOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MatvecOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult MatvecOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MatvecOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::MatvecOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MaxOpGenericAdaptorBase::MaxOpGenericAdaptorBase(MaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
MaxOpAdaptor::MaxOpAdaptor(MaxOp op) : MaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MaxOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> MaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange MaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange MaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> MaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> MaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void MaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void MaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult MaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult MaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void MaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void MaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, MaxOp::getRegionBuilder());
}
MaxOp MaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MaxOp MaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, MaxOp::getRegionBuilder());
}
MaxOp MaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MaxOp MaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
MaxOp MaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MaxOp MaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult MaxOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult MaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::MaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MinOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MinOpGenericAdaptorBase::MinOpGenericAdaptorBase(MinOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MinOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
MinOpAdaptor::MinOpAdaptor(MinOp op) : MinOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MinOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> MinOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange MinOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange MinOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> MinOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MinOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MinOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MinOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> MinOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void MinOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void MinOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult MinOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult MinOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void MinOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void MinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, MinOp::getRegionBuilder());
}
MinOp MinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MinOp MinOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, MinOp::getRegionBuilder());
}
MinOp MinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MinOp MinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
MinOp MinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MinOp MinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult MinOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MinOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult MinOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MinOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::MinOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::Mmt4DOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
Mmt4DOpGenericAdaptorBase::Mmt4DOpGenericAdaptorBase(Mmt4DOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> Mmt4DOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
Mmt4DOpAdaptor::Mmt4DOpAdaptor(Mmt4DOp op) : Mmt4DOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult Mmt4DOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> Mmt4DOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange Mmt4DOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange Mmt4DOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> Mmt4DOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult Mmt4DOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute Mmt4DOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code Mmt4DOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> Mmt4DOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void Mmt4DOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void Mmt4DOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult Mmt4DOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult Mmt4DOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void Mmt4DOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void Mmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, Mmt4DOp::getRegionBuilder());
}
Mmt4DOp Mmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Mmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Mmt4DOp Mmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Mmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, Mmt4DOp::getRegionBuilder());
}
Mmt4DOp Mmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Mmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Mmt4DOp Mmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void Mmt4DOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
Mmt4DOp Mmt4DOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<Mmt4DOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
Mmt4DOp Mmt4DOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult Mmt4DOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult Mmt4DOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult Mmt4DOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::Mmt4DOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::Mmt4DOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::MulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
MulOpGenericAdaptorBase::MulOpGenericAdaptorBase(MulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> MulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
MulOpAdaptor::MulOpAdaptor(MulOp op) : MulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult MulOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> MulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange MulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange MulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> MulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult MulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute MulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code MulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> MulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void MulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void MulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult MulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult MulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void MulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, MulOp::getRegionBuilder());
}
MulOp MulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MulOp MulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, MulOp::getRegionBuilder());
}
MulOp MulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MulOp MulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
MulOp MulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<MulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
MulOp MulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult MulOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult MulOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult MulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::MulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::MulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::NegFOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
NegFOpGenericAdaptorBase::NegFOpGenericAdaptorBase(NegFOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> NegFOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
NegFOpAdaptor::NegFOpAdaptor(NegFOp op) : NegFOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult NegFOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> NegFOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange NegFOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange NegFOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> NegFOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult NegFOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute NegFOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code NegFOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> NegFOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void NegFOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void NegFOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult NegFOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult NegFOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void NegFOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void NegFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, NegFOp::getRegionBuilder());
}
NegFOp NegFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<NegFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
NegFOp NegFOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void NegFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, NegFOp::getRegionBuilder());
}
NegFOp NegFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<NegFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
NegFOp NegFOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void NegFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
NegFOp NegFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<NegFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
NegFOp NegFOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult NegFOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult NegFOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult NegFOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::NegFOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::NegFOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNchwMaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNchwMaxOpGenericAdaptorBase::PoolingNchwMaxOpGenericAdaptorBase(PoolingNchwMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNchwMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNchwMaxOpAdaptor::PoolingNchwMaxOpAdaptor(PoolingNchwMaxOp op) : PoolingNchwMaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNchwMaxOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nchw_max' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nchw_max' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNchwMaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNchwMaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNchwMaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNchwMaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNchwMaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNchwMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNchwMaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNchwMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNchwMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNchwMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNchwMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNchwMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNchwMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwMaxOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNchwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNchwMaxOp::getRegionBuilder());
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNchwMaxOp::getRegionBuilder());
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNchwMaxOp::getRegionBuilder());
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwMaxOp PoolingNchwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNchwMaxOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNchwMaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNchwMaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNchwMaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNchwMaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNchwSumOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNchwSumOpGenericAdaptorBase::PoolingNchwSumOpGenericAdaptorBase(PoolingNchwSumOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNchwSumOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNchwSumOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwSumOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwSumOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwSumOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNchwSumOpAdaptor::PoolingNchwSumOpAdaptor(PoolingNchwSumOp op) : PoolingNchwSumOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNchwSumOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nchw_sum' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nchw_sum' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNchwSumOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNchwSumOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNchwSumOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNchwSumOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNchwSumOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNchwSumOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNchwSumOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNchwSumOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNchwSumOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNchwSumOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNchwSumOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNchwSumOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNchwSumOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNchwSumOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNchwSumOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNchwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNchwSumOp::getRegionBuilder());
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNchwSumOp::getRegionBuilder());
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNchwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNchwSumOp::getRegionBuilder());
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNchwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNchwSumOp PoolingNchwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNchwSumOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNchwSumOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNchwSumOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNchwSumOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNchwSumOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNcwMaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNcwMaxOpGenericAdaptorBase::PoolingNcwMaxOpGenericAdaptorBase(PoolingNcwMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNcwMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNcwMaxOpAdaptor::PoolingNcwMaxOpAdaptor(PoolingNcwMaxOp op) : PoolingNcwMaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNcwMaxOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_ncw_max' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_ncw_max' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNcwMaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNcwMaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNcwMaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNcwMaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNcwMaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNcwMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNcwMaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNcwMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNcwMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNcwMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNcwMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNcwMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNcwMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwMaxOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNcwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNcwMaxOp::getRegionBuilder());
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNcwMaxOp::getRegionBuilder());
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNcwMaxOp::getRegionBuilder());
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwMaxOp PoolingNcwMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNcwMaxOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNcwMaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNcwMaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNcwMaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNcwMaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNcwSumOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNcwSumOpGenericAdaptorBase::PoolingNcwSumOpGenericAdaptorBase(PoolingNcwSumOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNcwSumOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNcwSumOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwSumOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwSumOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwSumOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNcwSumOpAdaptor::PoolingNcwSumOpAdaptor(PoolingNcwSumOp op) : PoolingNcwSumOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNcwSumOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_ncw_sum' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_ncw_sum' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNcwSumOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNcwSumOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNcwSumOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNcwSumOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNcwSumOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNcwSumOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNcwSumOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNcwSumOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNcwSumOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNcwSumOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNcwSumOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNcwSumOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNcwSumOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNcwSumOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNcwSumOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNcwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNcwSumOp::getRegionBuilder());
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNcwSumOp::getRegionBuilder());
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNcwSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNcwSumOp::getRegionBuilder());
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNcwSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNcwSumOp PoolingNcwSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNcwSumOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNcwSumOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNcwSumOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNcwSumOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNcwSumOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNdhwcMaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNdhwcMaxOpGenericAdaptorBase::PoolingNdhwcMaxOpGenericAdaptorBase(PoolingNdhwcMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNdhwcMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNdhwcMaxOpAdaptor::PoolingNdhwcMaxOpAdaptor(PoolingNdhwcMaxOp op) : PoolingNdhwcMaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNdhwcMaxOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_max' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_max' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNdhwcMaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNdhwcMaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNdhwcMaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNdhwcMaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNdhwcMaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNdhwcMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNdhwcMaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNdhwcMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNdhwcMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNdhwcMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNdhwcMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNdhwcMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMaxOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNdhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNdhwcMaxOp::getRegionBuilder());
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNdhwcMaxOp::getRegionBuilder());
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNdhwcMaxOp::getRegionBuilder());
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMaxOp PoolingNdhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNdhwcMaxOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcMaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNdhwcMaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNdhwcMaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNdhwcMaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNdhwcMinOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNdhwcMinOpGenericAdaptorBase::PoolingNdhwcMinOpGenericAdaptorBase(PoolingNdhwcMinOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNdhwcMinOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNdhwcMinOpAdaptor::PoolingNdhwcMinOpAdaptor(PoolingNdhwcMinOp op) : PoolingNdhwcMinOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNdhwcMinOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_min' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_min' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNdhwcMinOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNdhwcMinOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNdhwcMinOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNdhwcMinOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNdhwcMinOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNdhwcMinOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNdhwcMinOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNdhwcMinOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNdhwcMinOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNdhwcMinOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNdhwcMinOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcMinOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNdhwcMinOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcMinOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNdhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNdhwcMinOp::getRegionBuilder());
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNdhwcMinOp::getRegionBuilder());
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNdhwcMinOp::getRegionBuilder());
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcMinOp PoolingNdhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNdhwcMinOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcMinOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNdhwcMinOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNdhwcMinOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNdhwcMinOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNdhwcSumOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNdhwcSumOpGenericAdaptorBase::PoolingNdhwcSumOpGenericAdaptorBase(PoolingNdhwcSumOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNdhwcSumOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNdhwcSumOpAdaptor::PoolingNdhwcSumOpAdaptor(PoolingNdhwcSumOp op) : PoolingNdhwcSumOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNdhwcSumOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_sum' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({3})))))
return emitError(loc, "'linalg.pooling_ndhwc_sum' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [3]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNdhwcSumOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNdhwcSumOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNdhwcSumOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNdhwcSumOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNdhwcSumOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNdhwcSumOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNdhwcSumOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNdhwcSumOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNdhwcSumOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNdhwcSumOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNdhwcSumOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcSumOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNdhwcSumOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNdhwcSumOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({3}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNdhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNdhwcSumOp::getRegionBuilder());
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNdhwcSumOp::getRegionBuilder());
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNdhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNdhwcSumOp::getRegionBuilder());
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNdhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNdhwcSumOp PoolingNdhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNdhwcSumOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps6(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNdhwcSumOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNdhwcSumOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNdhwcSumOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNdhwcSumOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNhwcMaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNhwcMaxOpGenericAdaptorBase::PoolingNhwcMaxOpGenericAdaptorBase(PoolingNhwcMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNhwcMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNhwcMaxOpAdaptor::PoolingNhwcMaxOpAdaptor(PoolingNhwcMaxOp op) : PoolingNhwcMaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNhwcMaxOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_max' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_max' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNhwcMaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNhwcMaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNhwcMaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNhwcMaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNhwcMaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNhwcMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNhwcMaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNhwcMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNhwcMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNhwcMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNhwcMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNhwcMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNhwcMaxOp::getRegionBuilder());
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNhwcMaxOp::getRegionBuilder());
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNhwcMaxOp::getRegionBuilder());
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxOp PoolingNhwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNhwcMaxOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNhwcMaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNhwcMaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNhwcMaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNhwcMaxUnsignedOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNhwcMaxUnsignedOpGenericAdaptorBase::PoolingNhwcMaxUnsignedOpGenericAdaptorBase(PoolingNhwcMaxUnsignedOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNhwcMaxUnsignedOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNhwcMaxUnsignedOpAdaptor::PoolingNhwcMaxUnsignedOpAdaptor(PoolingNhwcMaxUnsignedOp op) : PoolingNhwcMaxUnsignedOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_max_unsigned' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_max_unsigned' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNhwcMaxUnsignedOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNhwcMaxUnsignedOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNhwcMaxUnsignedOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNhwcMaxUnsignedOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNhwcMaxUnsignedOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNhwcMaxUnsignedOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNhwcMaxUnsignedOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNhwcMaxUnsignedOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNhwcMaxUnsignedOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNhwcMaxUnsignedOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMaxUnsignedOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNhwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNhwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNhwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNhwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMaxUnsignedOp PoolingNhwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNhwcMaxUnsignedOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNhwcMaxUnsignedOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNhwcMaxUnsignedOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNhwcMinOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNhwcMinOpGenericAdaptorBase::PoolingNhwcMinOpGenericAdaptorBase(PoolingNhwcMinOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNhwcMinOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNhwcMinOpAdaptor::PoolingNhwcMinOpAdaptor(PoolingNhwcMinOp op) : PoolingNhwcMinOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNhwcMinOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_min' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_min' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNhwcMinOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNhwcMinOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNhwcMinOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNhwcMinOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNhwcMinOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNhwcMinOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNhwcMinOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNhwcMinOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNhwcMinOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNhwcMinOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNhwcMinOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMinOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNhwcMinOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNhwcMinOp::getRegionBuilder());
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNhwcMinOp::getRegionBuilder());
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNhwcMinOp::getRegionBuilder());
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinOp PoolingNhwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNhwcMinOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMinOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNhwcMinOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNhwcMinOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNhwcMinOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNhwcMinUnsignedOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNhwcMinUnsignedOpGenericAdaptorBase::PoolingNhwcMinUnsignedOpGenericAdaptorBase(PoolingNhwcMinUnsignedOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNhwcMinUnsignedOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNhwcMinUnsignedOpAdaptor::PoolingNhwcMinUnsignedOpAdaptor(PoolingNhwcMinUnsignedOp op) : PoolingNhwcMinUnsignedOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNhwcMinUnsignedOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_min_unsigned' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_min_unsigned' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNhwcMinUnsignedOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNhwcMinUnsignedOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNhwcMinUnsignedOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNhwcMinUnsignedOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNhwcMinUnsignedOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNhwcMinUnsignedOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNhwcMinUnsignedOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNhwcMinUnsignedOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNhwcMinUnsignedOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNhwcMinUnsignedOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcMinUnsignedOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNhwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNhwcMinUnsignedOp::getRegionBuilder());
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNhwcMinUnsignedOp::getRegionBuilder());
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNhwcMinUnsignedOp::getRegionBuilder());
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcMinUnsignedOp PoolingNhwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNhwcMinUnsignedOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNhwcMinUnsignedOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNhwcMinUnsignedOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNhwcSumOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNhwcSumOpGenericAdaptorBase::PoolingNhwcSumOpGenericAdaptorBase(PoolingNhwcSumOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNhwcSumOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNhwcSumOpAdaptor::PoolingNhwcSumOpAdaptor(PoolingNhwcSumOp op) : PoolingNhwcSumOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNhwcSumOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_sum' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({2})))))
return emitError(loc, "'linalg.pooling_nhwc_sum' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [2]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNhwcSumOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNhwcSumOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNhwcSumOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNhwcSumOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNhwcSumOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNhwcSumOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNhwcSumOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNhwcSumOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNhwcSumOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNhwcSumOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNhwcSumOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcSumOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNhwcSumOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNhwcSumOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({2}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1), static_cast<int64_t>(1) }));
return attr;
}
void PoolingNhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNhwcSumOp::getRegionBuilder());
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNhwcSumOp::getRegionBuilder());
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNhwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNhwcSumOp::getRegionBuilder());
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNhwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNhwcSumOp PoolingNhwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNhwcSumOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps5(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNhwcSumOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNhwcSumOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNhwcSumOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNhwcSumOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNwcMaxOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNwcMaxOpGenericAdaptorBase::PoolingNwcMaxOpGenericAdaptorBase(PoolingNwcMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNwcMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNwcMaxOpAdaptor::PoolingNwcMaxOpAdaptor(PoolingNwcMaxOp op) : PoolingNwcMaxOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNwcMaxOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_max' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_max' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNwcMaxOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNwcMaxOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNwcMaxOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNwcMaxOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNwcMaxOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNwcMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNwcMaxOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNwcMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNwcMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNwcMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNwcMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNwcMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNwcMaxOp::getRegionBuilder());
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNwcMaxOp::getRegionBuilder());
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNwcMaxOp::getRegionBuilder());
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxOp PoolingNwcMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNwcMaxOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMaxOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNwcMaxOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNwcMaxOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNwcMaxOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNwcMaxUnsignedOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNwcMaxUnsignedOpGenericAdaptorBase::PoolingNwcMaxUnsignedOpGenericAdaptorBase(PoolingNwcMaxUnsignedOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNwcMaxUnsignedOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNwcMaxUnsignedOpAdaptor::PoolingNwcMaxUnsignedOpAdaptor(PoolingNwcMaxUnsignedOp op) : PoolingNwcMaxUnsignedOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNwcMaxUnsignedOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_max_unsigned' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_max_unsigned' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNwcMaxUnsignedOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNwcMaxUnsignedOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNwcMaxUnsignedOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNwcMaxUnsignedOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNwcMaxUnsignedOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNwcMaxUnsignedOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNwcMaxUnsignedOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNwcMaxUnsignedOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNwcMaxUnsignedOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNwcMaxUnsignedOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMaxUnsignedOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMaxUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNwcMaxUnsignedOp::getRegionBuilder());
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMaxUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMaxUnsignedOp PoolingNwcMaxUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNwcMaxUnsignedOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNwcMaxUnsignedOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNwcMaxUnsignedOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNwcMinOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNwcMinOpGenericAdaptorBase::PoolingNwcMinOpGenericAdaptorBase(PoolingNwcMinOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNwcMinOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNwcMinOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNwcMinOpAdaptor::PoolingNwcMinOpAdaptor(PoolingNwcMinOp op) : PoolingNwcMinOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNwcMinOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_min' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_min' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNwcMinOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNwcMinOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNwcMinOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNwcMinOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNwcMinOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNwcMinOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNwcMinOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNwcMinOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNwcMinOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNwcMinOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNwcMinOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMinOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNwcMinOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNwcMinOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNwcMinOp::getRegionBuilder());
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNwcMinOp::getRegionBuilder());
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNwcMinOp::getRegionBuilder());
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinOp PoolingNwcMinOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNwcMinOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMinOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNwcMinOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNwcMinOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNwcMinOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNwcMinUnsignedOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNwcMinUnsignedOpGenericAdaptorBase::PoolingNwcMinUnsignedOpGenericAdaptorBase(PoolingNwcMinUnsignedOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNwcMinUnsignedOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNwcMinUnsignedOpAdaptor::PoolingNwcMinUnsignedOpAdaptor(PoolingNwcMinUnsignedOp op) : PoolingNwcMinUnsignedOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNwcMinUnsignedOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_min_unsigned' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_min_unsigned' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNwcMinUnsignedOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNwcMinUnsignedOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNwcMinUnsignedOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNwcMinUnsignedOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNwcMinUnsignedOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNwcMinUnsignedOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNwcMinUnsignedOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNwcMinUnsignedOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNwcMinUnsignedOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNwcMinUnsignedOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcMinUnsignedOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNwcMinUnsignedOp::getRegionBuilder());
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNwcMinUnsignedOp::getRegionBuilder());
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcMinUnsignedOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNwcMinUnsignedOp::getRegionBuilder());
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcMinUnsignedOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcMinUnsignedOp PoolingNwcMinUnsignedOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNwcMinUnsignedOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNwcMinUnsignedOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNwcMinUnsignedOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PoolingNwcSumOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PoolingNwcSumOpGenericAdaptorBase::PoolingNwcSumOpGenericAdaptorBase(PoolingNwcSumOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PoolingNwcSumOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::DenseIntElementsAttr PoolingNwcSumOpGenericAdaptorBase::getStridesAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().strides);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcSumOpGenericAdaptorBase::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcSumOpGenericAdaptorBase::getDilationsAttr() {
auto attr = ::llvm::dyn_cast_or_null<::mlir::DenseIntElementsAttr>(getProperties().dilations);
if (!attr)
attr = ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcSumOpGenericAdaptorBase::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder(odsAttrs.getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
} // namespace detail
PoolingNwcSumOpAdaptor::PoolingNwcSumOpAdaptor(PoolingNwcSumOp op) : PoolingNwcSumOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PoolingNwcSumOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (tblgen_strides && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_strides))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_strides).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_sum' op attribute 'strides' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
if (tblgen_dilations && !((((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_dilations))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getElementType().isSignlessInteger(64)))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_dilations).getType().getShape() == ::mlir::ArrayRef<int64_t>({1})))))
return emitError(loc, "'linalg.pooling_nwc_sum' op attribute 'dilations' failed to satisfy constraint: 64-bit signless int elements attribute of shape [1]");
return ::mlir::success();
}
std::pair<unsigned, unsigned> PoolingNwcSumOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PoolingNwcSumOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PoolingNwcSumOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PoolingNwcSumOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PoolingNwcSumOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dilations;
auto attr = dict.get("dilations");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.strides;
auto attr = dict.get("strides");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PoolingNwcSumOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dilations;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dilations",
propStorage));
}
{
const auto &propStorage = prop.strides;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("strides",
propStorage));
}
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PoolingNwcSumOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dilations.getAsOpaquePointer()),
llvm::hash_value(prop.strides.getAsOpaquePointer()),
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PoolingNwcSumOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dilations")
return prop.dilations;
if (name == "strides")
return prop.strides;
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PoolingNwcSumOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dilations") {
prop.dilations = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dilations)>>(value);
return;
}
if (name == "strides") {
prop.strides = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.strides)>>(value);
return;
}
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PoolingNwcSumOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dilations) attrs.append("dilations", prop.dilations);
if (prop.strides) attrs.append("strides", prop.strides);
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PoolingNwcSumOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDilationsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "dilations", emitError)))
return ::mlir::failure();
}
{
::mlir::Attribute attr = attrs.get(getStridesAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(attr, "strides", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcSumOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readOptionalAttribute(prop.dilations)))
return ::mlir::failure();
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
if (::mlir::failed(reader.readOptionalAttribute(prop.strides)))
return ::mlir::failure();
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PoolingNwcSumOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeOptionalAttribute(prop.dilations);
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
writer.writeOptionalAttribute(prop.strides);
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
::mlir::DenseIntElementsAttr PoolingNwcSumOp::getStrides() {
auto attr = getStridesAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
::mlir::DenseIntElementsAttr PoolingNwcSumOp::getDilations() {
auto attr = getDilationsAttr();
if (!attr)
return ::mlir::DenseIntElementsAttr::get(::mlir::RankedTensorType::get({1}, ::mlir::Builder((*this)->getContext()).getIntegerType(64)), ::llvm::ArrayRef({ static_cast<int64_t>(1) }));
return attr;
}
void PoolingNwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PoolingNwcSumOp::getRegionBuilder());
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PoolingNwcSumOp::getRegionBuilder());
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void PoolingNwcSumOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
odsState.addAttribute("strides", strides);
odsState.addAttribute("dilations", dilations);
buildStructuredOp(odsBuilder, odsState, resultTensorTypes, inputs, outputs,
attributes, PoolingNwcSumOp::getRegionBuilder());
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PoolingNwcSumOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PoolingNwcSumOp PoolingNwcSumOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, Attribute strides, Attribute dilations, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(strides)>(strides), std::forward<decltype(dilations)>(dilations), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PoolingNwcSumOp::verifyInvariantsImpl() {
auto tblgen_dilations = getProperties().dilations; (void)tblgen_dilations;
auto tblgen_strides = getProperties().strides; (void)tblgen_strides;
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_strides, "strides")))
return ::mlir::failure();
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps4(*this, tblgen_dilations, "dilations")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PoolingNwcSumOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PoolingNwcSumOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.strides;
auto stridesAttrName = ::mlir::StringAttr::get(ctx, "strides");
auto attr = dict.get(stridesAttrName);
usedKeys.insert(stridesAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for strides in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `strides` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
{
auto &propStorage = prop.dilations;
auto dilationsAttrName = ::mlir::StringAttr::get(ctx, "dilations");
auto attr = dict.get(dilationsAttrName);
usedKeys.insert(dilationsAttrName);
if (attr || /*isRequired=*/false) {
if (!attr) {
emitError() << "expected key entry for dilations in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dilations` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PoolingNwcSumOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PoolingNwcSumOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::PowFOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
PowFOpGenericAdaptorBase::PowFOpGenericAdaptorBase(PowFOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> PowFOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
PowFOpAdaptor::PowFOpAdaptor(PowFOp op) : PowFOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult PowFOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> PowFOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange PowFOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange PowFOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> PowFOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult PowFOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute PowFOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code PowFOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> PowFOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void PowFOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void PowFOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult PowFOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult PowFOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void PowFOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void PowFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, PowFOp::getRegionBuilder());
}
PowFOp PowFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PowFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PowFOp PowFOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PowFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, PowFOp::getRegionBuilder());
}
PowFOp PowFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PowFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PowFOp PowFOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void PowFOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
PowFOp PowFOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<PowFOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
PowFOp PowFOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult PowFOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult PowFOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult PowFOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::PowFOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::PowFOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::QuantizedBatchMatmulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
QuantizedBatchMatmulOpGenericAdaptorBase::QuantizedBatchMatmulOpGenericAdaptorBase(QuantizedBatchMatmulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> QuantizedBatchMatmulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
QuantizedBatchMatmulOpAdaptor::QuantizedBatchMatmulOpAdaptor(QuantizedBatchMatmulOp op) : QuantizedBatchMatmulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult QuantizedBatchMatmulOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> QuantizedBatchMatmulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange QuantizedBatchMatmulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange QuantizedBatchMatmulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> QuantizedBatchMatmulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult QuantizedBatchMatmulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute QuantizedBatchMatmulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code QuantizedBatchMatmulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> QuantizedBatchMatmulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void QuantizedBatchMatmulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void QuantizedBatchMatmulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult QuantizedBatchMatmulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult QuantizedBatchMatmulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void QuantizedBatchMatmulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void QuantizedBatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, QuantizedBatchMatmulOp::getRegionBuilder());
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedBatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void QuantizedBatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, QuantizedBatchMatmulOp::getRegionBuilder());
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedBatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void QuantizedBatchMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedBatchMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedBatchMatmulOp QuantizedBatchMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult QuantizedBatchMatmulOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult QuantizedBatchMatmulOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult QuantizedBatchMatmulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::QuantizedBatchMatmulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::QuantizedBatchMatmulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::QuantizedMatmulOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
QuantizedMatmulOpGenericAdaptorBase::QuantizedMatmulOpGenericAdaptorBase(QuantizedMatmulOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> QuantizedMatmulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
QuantizedMatmulOpAdaptor::QuantizedMatmulOpAdaptor(QuantizedMatmulOp op) : QuantizedMatmulOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult QuantizedMatmulOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> QuantizedMatmulOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange QuantizedMatmulOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange QuantizedMatmulOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> QuantizedMatmulOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult QuantizedMatmulOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute QuantizedMatmulOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code QuantizedMatmulOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> QuantizedMatmulOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void QuantizedMatmulOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void QuantizedMatmulOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult QuantizedMatmulOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult QuantizedMatmulOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void QuantizedMatmulOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void QuantizedMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, QuantizedMatmulOp::getRegionBuilder());
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void QuantizedMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, QuantizedMatmulOp::getRegionBuilder());
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void QuantizedMatmulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<QuantizedMatmulOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
QuantizedMatmulOp QuantizedMatmulOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult QuantizedMatmulOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult QuantizedMatmulOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult QuantizedMatmulOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::QuantizedMatmulOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::QuantizedMatmulOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ReciprocalOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ReciprocalOpGenericAdaptorBase::ReciprocalOpGenericAdaptorBase(ReciprocalOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ReciprocalOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
ReciprocalOpAdaptor::ReciprocalOpAdaptor(ReciprocalOp op) : ReciprocalOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ReciprocalOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> ReciprocalOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange ReciprocalOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange ReciprocalOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> ReciprocalOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ReciprocalOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute ReciprocalOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ReciprocalOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> ReciprocalOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void ReciprocalOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void ReciprocalOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult ReciprocalOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult ReciprocalOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void ReciprocalOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void ReciprocalOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, ReciprocalOp::getRegionBuilder());
}
ReciprocalOp ReciprocalOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ReciprocalOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReciprocalOp ReciprocalOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ReciprocalOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, ReciprocalOp::getRegionBuilder());
}
ReciprocalOp ReciprocalOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ReciprocalOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReciprocalOp ReciprocalOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void ReciprocalOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
ReciprocalOp ReciprocalOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ReciprocalOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReciprocalOp ReciprocalOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult ReciprocalOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ReciprocalOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult ReciprocalOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ReciprocalOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ReciprocalOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::ReduceOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
ReduceOpGenericAdaptorBase::ReduceOpGenericAdaptorBase(ReduceOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> ReduceOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
bool isVariadic[] = {true, true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (odsOperandsSize - 0) / 2;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::ArrayRef<int64_t> ReduceOpGenericAdaptorBase::getDimensions() {
auto attr = getDimensionsAttr();
return attr;
}
} // namespace detail
ReduceOpAdaptor::ReduceOpAdaptor(ReduceOp op) : ReduceOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult ReduceOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_dimensions = getProperties().dimensions; (void)tblgen_dimensions;
if (!tblgen_dimensions) return emitError(loc, "'linalg.reduce' op requires attribute 'dimensions'");
if (tblgen_dimensions && !(((::llvm::isa<::mlir::DenseI64ArrayAttr>(tblgen_dimensions))) && (((llvm::is_sorted(::llvm::cast<DenseI64ArrayAttr>(tblgen_dimensions).asArrayRef()))) && (([](::llvm::ArrayRef<int64_t> a) {
return std::adjacent_find(std::begin(a), std::end(a)) == std::end(a);
}(::llvm::cast<DenseI64ArrayAttr>(tblgen_dimensions).asArrayRef()))))))
return emitError(loc, "'linalg.reduce' op attribute 'dimensions' failed to satisfy constraint: i64 dense array attribute should be in increasing order");
return ::mlir::success();
}
std::pair<unsigned, unsigned> ReduceOp::getODSOperandIndexAndLength(unsigned index) {
bool isVariadic[] = {true, true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumOperands() - 0) / 2;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::mlir::MutableOperandRange ReduceOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);
return mutableRange;
}
::mlir::MutableOperandRange ReduceOp::getInitsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);
return mutableRange;
}
std::pair<unsigned, unsigned> ReduceOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult ReduceOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.dimensions;
auto attr = dict.get("dimensions");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dimensions` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
return ::mlir::success();
}
::mlir::Attribute ReduceOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.dimensions;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("dimensions",
propStorage));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code ReduceOp::computePropertiesHash(const Properties &prop) {
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.dimensions.getAsOpaquePointer()));
}
std::optional<mlir::Attribute> ReduceOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "dimensions")
return prop.dimensions;
return std::nullopt;
}
void ReduceOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "dimensions") {
prop.dimensions = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.dimensions)>>(value);
return;
}
}
void ReduceOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.dimensions) attrs.append("dimensions", prop.dimensions);
}
::llvm::LogicalResult ReduceOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getDimensionsAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps10(attr, "dimensions", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ReduceOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readAttribute(prop.dimensions)))
return ::mlir::failure();
return ::mlir::success();
}
void ReduceOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeAttribute(prop.dimensions);
}
::llvm::ArrayRef<int64_t> ReduceOp::getDimensions() {
auto attr = getDimensionsAttr();
return attr;
}
void ReduceOp::setDimensions(::llvm::ArrayRef<int64_t> attrValue) {
getProperties().dimensions = ::mlir::Builder((*this)->getContext()).getDenseI64ArrayAttr(attrValue);
}
ReduceOp ReduceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange inits, ArrayRef<int64_t> dimensions, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg3, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(odsArg3)>(odsArg3), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ReduceOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReduceOp ReduceOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange inits, ArrayRef<int64_t> dimensions, function_ref<void(OpBuilder &, Location, ValueRange)> odsArg3, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions), std::forward<decltype(odsArg3)>(odsArg3), std::forward<decltype(attributes)>(attributes));
}
void ReduceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::mlir::DenseI64ArrayAttr dimensions) {
odsState.addOperands(inputs);
odsState.addOperands(inits);
odsState.getOrAddProperties<Properties>().dimensions = dimensions;
(void)odsState.addRegion();
odsState.addTypes(resultType0);
}
ReduceOp ReduceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::mlir::DenseI64ArrayAttr dimensions) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultType0)>(resultType0), std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions));
auto __res__ = ::llvm::dyn_cast<ReduceOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReduceOp ReduceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::mlir::DenseI64ArrayAttr dimensions) {
return create(builder, builder.getLoc(), std::forward<decltype(resultType0)>(resultType0), std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions));
}
void ReduceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::llvm::ArrayRef<int64_t> dimensions) {
odsState.addOperands(inputs);
odsState.addOperands(inits);
odsState.getOrAddProperties<Properties>().dimensions = odsBuilder.getDenseI64ArrayAttr(dimensions);
(void)odsState.addRegion();
odsState.addTypes(resultType0);
}
ReduceOp ReduceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::llvm::ArrayRef<int64_t> dimensions) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultType0)>(resultType0), std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions));
auto __res__ = ::llvm::dyn_cast<ReduceOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReduceOp ReduceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultType0, ::mlir::ValueRange inputs, ::mlir::ValueRange inits, ::llvm::ArrayRef<int64_t> dimensions) {
return create(builder, builder.getLoc(), std::forward<decltype(resultType0)>(resultType0), std::forward<decltype(inputs)>(inputs), std::forward<decltype(inits)>(inits), std::forward<decltype(dimensions)>(dimensions));
}
void ReduceOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
if (!attributes.empty()) {
(void)odsState.getOrAddProperties<ReduceOp::Properties>();
::mlir::PropertyRef properties = odsState.getRawProperties();
std::optional<::mlir::RegisteredOperationName> info =
odsState.name.getRegisteredInfo();
if (failed(info->setOpPropertiesFromAttribute(odsState.name, properties,
odsState.attributes.getDictionary(odsState.getContext()), nullptr)))
::llvm::report_fatal_error("Property conversion failed.");
}
}
ReduceOp ReduceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<ReduceOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReduceOp ReduceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
void ReduceOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
odsState.addOperands(operands);
odsState.useProperties(const_cast<Properties&>(properties));
odsState.addAttributes(discardableAttributes);
for (unsigned i = 0; i != 1; ++i)
(void)odsState.addRegion();
odsState.addTypes(resultTypes);
}
ReduceOp ReduceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
auto __res__ = ::llvm::dyn_cast<ReduceOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
ReduceOp ReduceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTypes)>(resultTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(properties)>(properties), std::forward<decltype(discardableAttributes)>(discardableAttributes));
}
::llvm::LogicalResult ReduceOp::verifyInvariantsImpl() {
auto tblgen_dimensions = getProperties().dimensions; (void)tblgen_dimensions;
if (!tblgen_dimensions) return emitOpError("requires attribute 'dimensions'");
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps10(*this, tblgen_dimensions, "dimensions")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps6(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps6(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps5(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps2(*this, region, "combiner", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult ReduceOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult ReduceOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.dimensions;
auto dimensionsAttrName = ::mlir::StringAttr::get(ctx, "dimensions");
auto attr = dict.get(dimensionsAttrName);
usedKeys.insert(dimensionsAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for dimensions in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `dimensions` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::ReduceOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::ReduceOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::RoundOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
RoundOpGenericAdaptorBase::RoundOpGenericAdaptorBase(RoundOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> RoundOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
RoundOpAdaptor::RoundOpAdaptor(RoundOp op) : RoundOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult RoundOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> RoundOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange RoundOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange RoundOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> RoundOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult RoundOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute RoundOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code RoundOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> RoundOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void RoundOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void RoundOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult RoundOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult RoundOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void RoundOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void RoundOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, RoundOp::getRegionBuilder());
}
RoundOp RoundOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RoundOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RoundOp RoundOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void RoundOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, RoundOp::getRegionBuilder());
}
RoundOp RoundOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RoundOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RoundOp RoundOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void RoundOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
RoundOp RoundOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RoundOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RoundOp RoundOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult RoundOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult RoundOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult RoundOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::RoundOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::RoundOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::RsqrtOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
RsqrtOpGenericAdaptorBase::RsqrtOpGenericAdaptorBase(RsqrtOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> RsqrtOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
RsqrtOpAdaptor::RsqrtOpAdaptor(RsqrtOp op) : RsqrtOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult RsqrtOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> RsqrtOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange RsqrtOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange RsqrtOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> RsqrtOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult RsqrtOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute RsqrtOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code RsqrtOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> RsqrtOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void RsqrtOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void RsqrtOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult RsqrtOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult RsqrtOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void RsqrtOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void RsqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, RsqrtOp::getRegionBuilder());
}
RsqrtOp RsqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RsqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RsqrtOp RsqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void RsqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, RsqrtOp::getRegionBuilder());
}
RsqrtOp RsqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RsqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RsqrtOp RsqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void RsqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
RsqrtOp RsqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<RsqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
RsqrtOp RsqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult RsqrtOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult RsqrtOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult RsqrtOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::RsqrtOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::RsqrtOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::SelectOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
SelectOpGenericAdaptorBase::SelectOpGenericAdaptorBase(SelectOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> SelectOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
SelectOpAdaptor::SelectOpAdaptor(SelectOp op) : SelectOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult SelectOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> SelectOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange SelectOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange SelectOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> SelectOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult SelectOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute SelectOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code SelectOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> SelectOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void SelectOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void SelectOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult SelectOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult SelectOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void SelectOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void SelectOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, SelectOp::getRegionBuilder());
}
SelectOp SelectOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SelectOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SelectOp SelectOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SelectOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, SelectOp::getRegionBuilder());
}
SelectOp SelectOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SelectOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SelectOp SelectOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SelectOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
SelectOp SelectOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SelectOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SelectOp SelectOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult SelectOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult SelectOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult SelectOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::SelectOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::SelectOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::SqrtOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
SqrtOpGenericAdaptorBase::SqrtOpGenericAdaptorBase(SqrtOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> SqrtOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
SqrtOpAdaptor::SqrtOpAdaptor(SqrtOp op) : SqrtOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult SqrtOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> SqrtOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange SqrtOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange SqrtOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> SqrtOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult SqrtOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute SqrtOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code SqrtOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> SqrtOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void SqrtOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void SqrtOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult SqrtOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult SqrtOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void SqrtOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void SqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, SqrtOp::getRegionBuilder());
}
SqrtOp SqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SqrtOp SqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, SqrtOp::getRegionBuilder());
}
SqrtOp SqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SqrtOp SqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SqrtOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
SqrtOp SqrtOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SqrtOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SqrtOp SqrtOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult SqrtOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult SqrtOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult SqrtOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::SqrtOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::SqrtOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::SquareOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
SquareOpGenericAdaptorBase::SquareOpGenericAdaptorBase(SquareOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> SquareOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
SquareOpAdaptor::SquareOpAdaptor(SquareOp op) : SquareOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult SquareOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> SquareOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange SquareOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange SquareOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> SquareOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult SquareOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute SquareOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code SquareOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> SquareOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void SquareOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void SquareOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult SquareOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult SquareOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void SquareOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void SquareOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, SquareOp::getRegionBuilder());
}
SquareOp SquareOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SquareOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SquareOp SquareOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SquareOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, SquareOp::getRegionBuilder());
}
SquareOp SquareOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SquareOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SquareOp SquareOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SquareOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
SquareOp SquareOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SquareOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SquareOp SquareOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult SquareOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult SquareOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult SquareOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::SquareOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::SquareOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::SubOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
SubOpGenericAdaptorBase::SubOpGenericAdaptorBase(SubOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> SubOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
SubOpAdaptor::SubOpAdaptor(SubOp op) : SubOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult SubOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> SubOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange SubOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange SubOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> SubOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult SubOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute SubOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code SubOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> SubOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void SubOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void SubOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult SubOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult SubOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void SubOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void SubOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, SubOp::getRegionBuilder());
}
SubOp SubOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SubOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SubOp SubOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SubOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, SubOp::getRegionBuilder());
}
SubOp SubOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SubOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SubOp SubOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void SubOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
SubOp SubOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<SubOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
SubOp SubOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult SubOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult SubOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult SubOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::SubOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::SubOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::TanhOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
TanhOpGenericAdaptorBase::TanhOpGenericAdaptorBase(TanhOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> TanhOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
TanhOpAdaptor::TanhOpAdaptor(TanhOp op) : TanhOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult TanhOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> TanhOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange TanhOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange TanhOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> TanhOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult TanhOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute TanhOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code TanhOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> TanhOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void TanhOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void TanhOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult TanhOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult TanhOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void TanhOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void TanhOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, TanhOp::getRegionBuilder());
}
TanhOp TanhOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<TanhOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
TanhOp TanhOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void TanhOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, TanhOp::getRegionBuilder());
}
TanhOp TanhOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<TanhOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
TanhOp TanhOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void TanhOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
TanhOp TanhOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<TanhOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
TanhOp TanhOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult TanhOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult TanhOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult TanhOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::TanhOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::TanhOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::TransposeOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
TransposeOpGenericAdaptorBase::TransposeOpGenericAdaptorBase(TransposeOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
::llvm::ArrayRef<int64_t> TransposeOpGenericAdaptorBase::getPermutation() {
auto attr = getPermutationAttr();
return attr;
}
} // namespace detail
TransposeOpAdaptor::TransposeOpAdaptor(TransposeOp op) : TransposeOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult TransposeOpAdaptor::verify(::mlir::Location loc) {
auto tblgen_permutation = getProperties().permutation; (void)tblgen_permutation;
if (!tblgen_permutation) return emitError(loc, "'linalg.transpose' op requires attribute 'permutation'");
if (tblgen_permutation && !((::llvm::isa<::mlir::DenseI64ArrayAttr>(tblgen_permutation))))
return emitError(loc, "'linalg.transpose' op attribute 'permutation' failed to satisfy constraint: i64 dense array attribute");
return ::mlir::success();
}
std::pair<unsigned, unsigned> TransposeOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult TransposeOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto &propStorage = prop.permutation;
auto attr = dict.get("permutation");
if (attr) {
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `permutation` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
return ::mlir::success();
}
::mlir::Attribute TransposeOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.permutation;
if (propStorage)
attrs.push_back(odsBuilder.getNamedAttr("permutation",
propStorage));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code TransposeOp::computePropertiesHash(const Properties &prop) {
using llvm::hash_value;
return llvm::hash_combine(
llvm::hash_value(prop.permutation.getAsOpaquePointer()));
}
std::optional<mlir::Attribute> TransposeOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "permutation")
return prop.permutation;
return std::nullopt;
}
void TransposeOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "permutation") {
prop.permutation = ::llvm::dyn_cast_or_null<std::remove_reference_t<decltype(prop.permutation)>>(value);
return;
}
}
void TransposeOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
if (prop.permutation) attrs.append("permutation", prop.permutation);
}
::llvm::LogicalResult TransposeOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
{
::mlir::Attribute attr = attrs.get(getPermutationAttrName(opName));
if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps3(attr, "permutation", emitError)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult TransposeOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (::mlir::failed(reader.readAttribute(prop.permutation)))
return ::mlir::failure();
return ::mlir::success();
}
void TransposeOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
writer.writeAttribute(prop.permutation);
}
::llvm::ArrayRef<int64_t> TransposeOp::getPermutation() {
auto attr = getPermutationAttr();
return attr;
}
void TransposeOp::setPermutation(::llvm::ArrayRef<int64_t> attrValue) {
getProperties().permutation = ::mlir::Builder((*this)->getContext()).getDenseI64ArrayAttr(attrValue);
}
TransposeOp TransposeOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value input, Value init, DenseI64ArrayAttr permutation, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(permutation)>(permutation), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<TransposeOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
TransposeOp TransposeOp::create(::mlir::ImplicitLocOpBuilder &builder, Value input, Value init, DenseI64ArrayAttr permutation, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(permutation)>(permutation), std::forward<decltype(attributes)>(attributes));
}
TransposeOp TransposeOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value input, Value init, ArrayRef<int64_t> permutation, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(permutation)>(permutation), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<TransposeOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
TransposeOp TransposeOp::create(::mlir::ImplicitLocOpBuilder &builder, Value input, Value init, ArrayRef<int64_t> permutation, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(input)>(input), std::forward<decltype(init)>(init), std::forward<decltype(permutation)>(permutation), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult TransposeOp::verifyInvariantsImpl() {
auto tblgen_permutation = getProperties().permutation; (void)tblgen_permutation;
if (!tblgen_permutation) return emitOpError("requires attribute 'permutation'");
if (::mlir::failed(__mlir_ods_local_attr_constraint_LinalgStructuredOps3(*this, tblgen_permutation, "permutation")))
return ::mlir::failure();
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps4(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps4(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps5(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps2(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult TransposeOp::verifyInvariants() {
if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))
return ::mlir::success();
return ::mlir::failure();
}
::llvm::LogicalResult TransposeOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
{
auto &propStorage = prop.permutation;
auto permutationAttrName = ::mlir::StringAttr::get(ctx, "permutation");
auto attr = dict.get(permutationAttrName);
usedKeys.insert(permutationAttrName);
if (attr || /*isRequired=*/true) {
if (!attr) {
emitError() << "expected key entry for permutation in DictionaryAttr to set "
"Properties.";
return ::mlir::failure();
}
auto convertedAttr = ::llvm::dyn_cast<std::remove_reference_t<decltype(propStorage)>>(attr);
if (convertedAttr) {
propStorage = convertedAttr;
} else {
emitError() << "Invalid attribute `permutation` in property conversion: " << attr;
return ::mlir::failure();
}
}
}
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::TransposeOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::TransposeOpGenericAdaptorBase::Properties)
namespace mlir::linalg {
//===----------------------------------------------------------------------===//
// ::mlir::linalg::VecmatOp definitions
//===----------------------------------------------------------------------===//
namespace detail {
VecmatOpGenericAdaptorBase::VecmatOpGenericAdaptorBase(VecmatOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {}
std::pair<unsigned, unsigned> VecmatOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
} // namespace detail
VecmatOpAdaptor::VecmatOpAdaptor(VecmatOp op) : VecmatOpGenericAdaptor(op->getOperands(), op) {}
::llvm::LogicalResult VecmatOpAdaptor::verify(::mlir::Location loc) {
return ::mlir::success();
}
std::pair<unsigned, unsigned> VecmatOp::getODSOperandIndexAndLength(unsigned index) {
::llvm::ArrayRef<int32_t> sizeAttr = getProperties().operandSegmentSizes;
unsigned start = 0;
for (unsigned i = 0; i < index; ++i)
start += sizeAttr[i];
return {start, sizeAttr[index]};
}
::mlir::MutableOperandRange VecmatOp::getInputsMutable() {
auto range = getODSOperandIndexAndLength(0);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(0u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
::mlir::MutableOperandRange VecmatOp::getOutputsMutable() {
auto range = getODSOperandIndexAndLength(1);
auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(1u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)}));
return mutableRange;
}
std::pair<unsigned, unsigned> VecmatOp::getODSResultIndexAndLength(unsigned index) {
bool isVariadic[] = {true};
int prevVariadicCount = 0;
for (unsigned i = 0; i < index; ++i)
if (isVariadic[i]) ++prevVariadicCount;
// Calculate how many dynamic values a static variadic operand corresponds to.
// This assumes all static variadic operands have the same dynamic value count.
int variadicSize = (getOperation()->getNumResults() - 0) / 1;
// `index` passed in as the parameter is the static index which counts each
// operand (variadic or not) as size 1. So here for each previous static variadic
// operand, we need to offset by (variadicSize - 1) to get where the dynamic
// value pack for this static operand starts.
int start = index + (variadicSize - 1) * prevVariadicCount;
int size = isVariadic[index] ? variadicSize : 1;
return {start, size};
}
::llvm::LogicalResult VecmatOp::setPropertiesFromAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
{
auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr,
::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult {
return convertFromAttribute(propStorage, propAttr, emitError);
};
auto attr = dict.get("operandSegmentSizes"); if (!attr) attr = dict.get("operand_segment_sizes");;
;
if (attr && ::mlir::failed(setFromAttr(prop.operandSegmentSizes, attr, [&]() {
return emitError() << "for `operandSegmentSizes`: ";
})))
return ::mlir::failure();
}
return ::mlir::success();
}
::mlir::Attribute VecmatOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) {
::mlir::SmallVector<::mlir::NamedAttribute> attrs;
::mlir::Builder odsBuilder{ctx};
{
const auto &propStorage = prop.operandSegmentSizes;
auto attr = [&]() -> ::mlir::Attribute {
return ::mlir::DenseI32ArrayAttr::get(ctx, propStorage);
}();
attrs.push_back(odsBuilder.getNamedAttr("operandSegmentSizes", attr));
}
if (!attrs.empty())
return odsBuilder.getDictionaryAttr(attrs);
return {};
}
llvm::hash_code VecmatOp::computePropertiesHash(const Properties &prop) {
auto hash_operandSegmentSizes_ = [] (const auto &propStorage) -> llvm::hash_code {
using ::llvm::hash_value;
return ::llvm::hash_combine_range(std::begin(propStorage), std::end(propStorage));;
};
using llvm::hash_value;
return llvm::hash_combine(
hash_operandSegmentSizes_(prop.operandSegmentSizes));
}
std::optional<mlir::Attribute> VecmatOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }();
return std::nullopt;
}
void VecmatOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) {
if (name == "operand_segment_sizes" || name == "operandSegmentSizes") {
auto arrAttr = ::llvm::dyn_cast_or_null<::mlir::DenseI32ArrayAttr>(value);
if (!arrAttr) return;
if (arrAttr.size() != sizeof(prop.operandSegmentSizes) / sizeof(int32_t))
return;
llvm::copy(arrAttr.asArrayRef(), prop.operandSegmentSizes.begin());
return;
}
}
void VecmatOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) {
attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }());
}
::llvm::LogicalResult VecmatOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
return ::mlir::success();
}
::llvm::LogicalResult VecmatOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) {
auto &prop = state.getOrAddProperties<Properties>(); (void)prop;
if (reader.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
::mlir::DenseI32ArrayAttr attr;
if (::mlir::failed(reader.readAttribute(attr))) return ::mlir::failure();
if (attr.size() > static_cast<int64_t>(sizeof(propStorage) / sizeof(int32_t))) {
reader.emitError("size mismatch for operand/result_segment_size");
return ::mlir::failure();
}
::llvm::copy(::llvm::ArrayRef<int32_t>(attr), propStorage.begin());
}
{
auto &propStorage = prop.operandSegmentSizes;
auto readProp = [&]() {
if (reader.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
return reader.readSparseArray(::llvm::MutableArrayRef(propStorage));
;
return ::mlir::success();
};
if (::mlir::failed(readProp()))
return ::mlir::failure();
}
return ::mlir::success();
}
void VecmatOp::writeProperties(::mlir::DialectBytecodeWriter &writer) {
auto &prop = getProperties(); (void)prop;
if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) {
auto &propStorage = prop.operandSegmentSizes;
writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage));
}
{
auto &propStorage = prop.operandSegmentSizes;
if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6)
writer.writeSparseArray(::llvm::ArrayRef(propStorage));
;
}
}
void VecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, std::nullopt, inputs, outputs,
attributes, VecmatOp::getRegionBuilder());
}
VecmatOp VecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<VecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
VecmatOp VecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void VecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
buildStructuredOp(odsBuilder, odsState, resultTensorTypes,
inputs, outputs, attributes, VecmatOp::getRegionBuilder());
}
VecmatOp VecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<VecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
VecmatOp VecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange inputs, ValueRange outputs, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(inputs)>(inputs), std::forward<decltype(outputs)>(outputs), std::forward<decltype(attributes)>(attributes));
}
void VecmatOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
odsState.addOperands(operands);
odsState.addAttributes(attributes);
odsState.addTypes(resultTensorTypes);
(void)odsState.addRegion();
}
VecmatOp VecmatOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
::mlir::OperationState __state__(location, getOperationName());
build(builder, __state__, std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
auto __res__ = ::llvm::dyn_cast<VecmatOp>(builder.create(__state__));
assert(__res__ && "builder didn't return the right type");
return __res__;
}
VecmatOp VecmatOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes) {
return create(builder, builder.getLoc(), std::forward<decltype(resultTensorTypes)>(resultTensorTypes), std::forward<decltype(operands)>(operands), std::forward<decltype(attributes)>(attributes));
}
::llvm::LogicalResult VecmatOp::verifyInvariantsImpl() {
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSOperands(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps1(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
auto valueGroup1 = getODSOperands(1);
for (auto v : valueGroup1) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps2(*this, v.getType(), "operand", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
auto valueGroup0 = getODSResults(0);
for (auto v : valueGroup0) {
if (::mlir::failed(__mlir_ods_local_type_constraint_LinalgStructuredOps3(*this, v.getType(), "result", index++)))
return ::mlir::failure();
}
}
{
unsigned index = 0; (void)index;
for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))
if (::mlir::failed(__mlir_ods_local_region_constraint_LinalgStructuredOps1(*this, region, "region", index++)))
return ::mlir::failure();
}
return ::mlir::success();
}
::llvm::LogicalResult VecmatOp::verifyInvariants() {
return verifyInvariantsImpl();
}
::llvm::LogicalResult VecmatOp::setPropertiesFromParsedAttr(Properties &prop, ::mlir::Attribute attr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
::mlir::DictionaryAttr dict = ::llvm::dyn_cast<::mlir::DictionaryAttr>(attr);
if (!dict) {
emitError() << "expected DictionaryAttr to set properties";
return ::mlir::failure();
}
// keep track of used keys in the input dictionary to be able to error out
// if there are some unknown ones.
::mlir::DenseSet<::mlir::StringAttr> usedKeys;
::mlir::MLIRContext *ctx = dict.getContext();
(void)ctx;
for (::mlir::NamedAttribute attr : dict) {
if (!usedKeys.contains(attr.getName()))
return emitError() << "unknown key '" << attr.getName() <<
"' when parsing properties dictionary";
}
return ::mlir::success();
}
} // namespace mlir::linalg
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::VecmatOp)
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::linalg::detail::VecmatOpGenericAdaptorBase::Properties)
#endif // GET_OP_CLASSES