/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* Op Definitions *| |* *| |* Automatically generated file, do not edit! *| |* From: AffineOps.td *| |* *| \*===----------------------------------------------------------------------===*/ #ifdef GET_OP_LIST #undef GET_OP_LIST ::mlir::affine::AffineApplyOp, ::mlir::affine::AffineDelinearizeIndexOp, ::mlir::affine::AffineDmaStartOp, ::mlir::affine::AffineDmaWaitOp, ::mlir::affine::AffineForOp, ::mlir::affine::AffineIfOp, ::mlir::affine::AffineLinearizeIndexOp, ::mlir::affine::AffineLoadOp, ::mlir::affine::AffineMaxOp, ::mlir::affine::AffineMinOp, ::mlir::affine::AffineParallelOp, ::mlir::affine::AffinePrefetchOp, ::mlir::affine::AffineStoreOp, ::mlir::affine::AffineVectorLoadOp, ::mlir::affine::AffineVectorStoreOp, ::mlir::affine::AffineYieldOp #endif // GET_OP_LIST #ifdef GET_OP_CLASSES #undef GET_OP_CLASSES //===----------------------------------------------------------------------===// // Local Utility Method Definitions //===----------------------------------------------------------------------===// static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps1( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((::llvm::isa<::mlir::IndexType>(type)))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be variadic of index, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps2( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((::llvm::isa<::mlir::IndexType>(type)))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be index, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps3( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((::llvm::isa<::mlir::IndexType>(type))) || (((::llvm::isa<::mlir::VectorType>(type))) && ([](::mlir::Type elementType) { return (::llvm::isa<::mlir::IndexType>(elementType)); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be index or vector of index, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps4( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((::llvm::isa<::mlir::IndexType>(type))) || (((::llvm::isa<::mlir::VectorType>(type))) && ([](::mlir::Type elementType) { return (::llvm::isa<::mlir::IndexType>(elementType)); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be variadic of index or vector of index, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps5( ::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_AffineOps6( ::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())))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be memref of any non-token type values, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps7( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(!((::llvm::isa<::mlir::TokenType>(type))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be any non-token type, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_AffineOps8( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ([](::mlir::Type elementType) { return !((::llvm::isa<::mlir::TokenType>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType())))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be vector of any non-token type values, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps1( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::AffineMapAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: AffineMap attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps1( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps1(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps2( ::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_AffineOps2( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps2(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps3( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !(((::llvm::isa<::mlir::IntegerAttr>(attr))) && ((::llvm::isa<::mlir::IndexType>(::llvm::cast<::mlir::IntegerAttr>(attr).getType()))))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: index attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps3( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps3(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps4( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::IntegerSetAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: IntegerSet attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps4( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps4(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps5( ::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::arith::AtomicRMWKindAttr>(attr))); })))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: Reduction ops"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps5( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps5(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps6( ::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(32))))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: 32-bit signless integer elements attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps6( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps6(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps7( ::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::IntegerAttr>(attr))) && ((::llvm::cast<::mlir::IntegerAttr>(attr).getType().isSignlessInteger(64)))); })))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: 64-bit integer array attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps7( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps7(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps8( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::BoolAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: bool attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps8( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps8(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps9( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((((::llvm::isa<::mlir::IntegerAttr>(attr))) && ((::llvm::cast<::mlir::IntegerAttr>(attr).getType().isSignlessInteger(32)))) && ((::llvm::cast<::mlir::IntegerAttr>(attr).getInt() >= 0)) && ((::llvm::cast<::mlir::IntegerAttr>(attr).getInt() <= 3)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: 32-bit signless integer attribute whose minimum value is 0 whose maximum value is 3"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_AffineOps9( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_AffineOps9(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_region_constraint_AffineOps1( ::mlir::Operation *op, ::mlir::Region ®ion, ::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(); } static ::llvm::LogicalResult __mlir_ods_local_region_constraint_AffineOps2( ::mlir::Operation *op, ::mlir::Region ®ion, ::llvm::StringRef regionName, unsigned regionIndex) { if (!((true))) { return op->emitOpError("region #") << regionIndex << (regionName.empty() ? " " : " ('" + regionName + "') ") << "failed to verify constraint: any region"; } return ::mlir::success(); } namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineApplyOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineApplyOpGenericAdaptorBase::AffineApplyOpGenericAdaptorBase(AffineApplyOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineApplyOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::AffineMap AffineApplyOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineApplyOpAdaptor::AffineApplyOpAdaptor(AffineApplyOp op) : AffineApplyOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineApplyOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.apply' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.apply' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineApplyOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } ::mlir::MutableOperandRange AffineApplyOp::getMapOperandsMutable() { auto range = getODSOperandIndexAndLength(0); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineApplyOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineApplyOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineApplyOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineApplyOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineApplyOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineApplyOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineApplyOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineApplyOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineApplyOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineApplyOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineApplyOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ArrayRef exprList, ValueRange mapOperands) { build(odsBuilder, odsState, odsBuilder.getIndexType(), AffineMap::inferFromExprList(exprList, odsBuilder.getContext()) .front(), mapOperands); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ArrayRef exprList, ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(exprList), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ArrayRef exprList, ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(exprList), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = map; odsState.addTypes(resultType0); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = map; ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineApplyOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); odsState.addTypes(resultType0); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineApplyOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(mapOperands)); } void AffineApplyOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineApplyOp AffineApplyOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineApplyOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(attributes)); } void AffineApplyOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineApplyOp AffineApplyOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } void AffineApplyOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { odsState.addOperands(operands); odsState.useProperties(const_cast(properties)); odsState.addAttributes(discardableAttributes); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineApplyOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineApplyOp AffineApplyOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineApplyOp AffineApplyOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineApplyOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps2(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineApplyOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineApplyOp::inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type>&inferredReturnTypes) { inferredReturnTypes.resize(1); ::mlir::Builder odsBuilder(context); ::mlir::Type odsInferredType0 = odsBuilder.getIndexType(); inferredReturnTypes[0] = odsInferredType0; return ::mlir::success(); } ::llvm::LogicalResult AffineApplyOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineApplyOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineApplyOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineApplyOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineDelinearizeIndexOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineDelinearizeIndexOpGenericAdaptorBase::AffineDelinearizeIndexOpGenericAdaptorBase(AffineDelinearizeIndexOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineDelinearizeIndexOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, 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 - 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}; } ::llvm::ArrayRef AffineDelinearizeIndexOpGenericAdaptorBase::getStaticBasis() { auto attr = getStaticBasisAttr(); return attr; } } // namespace detail AffineDelinearizeIndexOpAdaptor::AffineDelinearizeIndexOpAdaptor(AffineDelinearizeIndexOp op) : AffineDelinearizeIndexOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineDelinearizeIndexOpAdaptor::verify(::mlir::Location loc) { auto tblgen_static_basis = getProperties().static_basis; (void)tblgen_static_basis; if (!tblgen_static_basis) return emitError(loc, "'affine.delinearize_index' op requires attribute 'static_basis'"); if (tblgen_static_basis && !((::llvm::isa<::mlir::DenseI64ArrayAttr>(tblgen_static_basis)))) return emitError(loc, "'affine.delinearize_index' op attribute 'static_basis' failed to satisfy constraint: i64 dense array attribute"); return ::mlir::success(); } std::pair AffineDelinearizeIndexOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, 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() - 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 AffineDelinearizeIndexOp::getDynamicBasisMutable() { auto range = getODSOperandIndexAndLength(1); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } std::pair AffineDelinearizeIndexOp::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 AffineDelinearizeIndexOp::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.static_basis; auto attr = dict.get("static_basis"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `static_basis` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineDelinearizeIndexOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.static_basis; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("static_basis", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineDelinearizeIndexOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.static_basis.getAsOpaquePointer())); } std::optional AffineDelinearizeIndexOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "static_basis") return prop.static_basis; return std::nullopt; } void AffineDelinearizeIndexOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "static_basis") { prop.static_basis = ::llvm::dyn_cast_or_null>(value); return; } } void AffineDelinearizeIndexOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.static_basis) attrs.append("static_basis", prop.static_basis); } ::llvm::LogicalResult AffineDelinearizeIndexOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getStaticBasisAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps2(attr, "static_basis", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineDelinearizeIndexOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.static_basis))) return ::mlir::failure(); return ::mlir::success(); } void AffineDelinearizeIndexOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.static_basis); } ::llvm::ArrayRef AffineDelinearizeIndexOp::getStaticBasis() { auto attr = getStaticBasisAttr(); return attr; } void AffineDelinearizeIndexOp::setStaticBasis(::llvm::ArrayRef attrValue) { getProperties().static_basis = ::mlir::Builder((*this)->getContext()).getDenseI64ArrayAttr(attrValue); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value linear_index, ValueRange dynamic_basis, ArrayRef static_basis, bool hasOuterBound) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(hasOuterBound)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, Value linear_index, ValueRange dynamic_basis, ArrayRef static_basis, bool hasOuterBound) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(hasOuterBound)); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value linear_index, ValueRange basis, bool hasOuterBound) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, Value linear_index, ValueRange basis, bool hasOuterBound) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value linear_index, ArrayRef basis, bool hasOuterBound) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, Value linear_index, ArrayRef basis, bool hasOuterBound) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value linear_index, ArrayRef basis, bool hasOuterBound) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, Value linear_index, ArrayRef basis, bool hasOuterBound) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(basis), std::forward(hasOuterBound)); } void AffineDelinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis) { odsState.addOperands(linear_index); odsState.addOperands(dynamic_basis); odsState.getOrAddProperties().static_basis = static_basis; odsState.addTypes(multi_index); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(multi_index), std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis) { return create(builder, builder.getLoc(), std::forward(multi_index), std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis)); } void AffineDelinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis) { odsState.addOperands(linear_index); odsState.addOperands(dynamic_basis); odsState.getOrAddProperties().static_basis = odsBuilder.getDenseI64ArrayAttr(static_basis); odsState.addTypes(multi_index); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(multi_index), std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange multi_index, ::mlir::Value linear_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis) { return create(builder, builder.getLoc(), std::forward(multi_index), std::forward(linear_index), std::forward(dynamic_basis), std::forward(static_basis)); } void AffineDelinearizeIndexOp::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); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineDelinearizeIndexOp::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)); odsState.addAttributes(discardableAttributes); odsState.addTypes(resultTypes); } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDelinearizeIndexOp AffineDelinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineDelinearizeIndexOp::verifyInvariantsImpl() { auto tblgen_static_basis = getProperties().static_basis; (void)tblgen_static_basis; if (!tblgen_static_basis) return emitOpError("requires attribute 'static_basis'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps2(*this, tblgen_static_basis, "static_basis"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps4(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } if (!((std::equal_to<>()(this->getODSResults(0).getType()[0], (*this->getODSOperands(0).begin()).getType())))) return emitOpError("failed to verify that linear_index type must match result types"); return ::mlir::success(); } ::llvm::LogicalResult AffineDelinearizeIndexOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult AffineDelinearizeIndexOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::OpAsmParser::UnresolvedOperand linear_indexRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> linear_indexOperands(&linear_indexRawOperand, 1); ::llvm::SMLoc linear_indexOperandsLoc; (void)linear_indexOperandsLoc; ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> dynamic_basisOperands; ::llvm::SMLoc dynamic_basisOperandsLoc; (void)dynamic_basisOperandsLoc; ::mlir::DenseI64ArrayAttr static_basisAttr; ::llvm::SmallVector<::mlir::Type, 1> multi_indexTypes; linear_indexOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(linear_indexRawOperand)) return ::mlir::failure(); if (parser.parseKeyword("into")) return ::mlir::failure(); { dynamic_basisOperandsLoc = parser.getCurrentLocation(); auto odsResult = parseDynamicIndexList(parser, dynamic_basisOperands, static_basisAttr, {}, ::mlir::AsmParser::Delimiter::Paren); if (odsResult) return ::mlir::failure(); result.getOrAddProperties().static_basis = static_basisAttr; } { auto loc = parser.getCurrentLocation();(void)loc; if (parser.parseOptionalAttrDict(result.attributes)) return ::mlir::failure(); if (failed(verifyInherentAttrs(result.name, result.attributes, [&]() { return parser.emitError(loc) << "'" << result.name.getStringRef() << "' op "; }))) return ::mlir::failure(); } if (parser.parseColon()) return ::mlir::failure(); if (parser.parseTypeList(multi_indexTypes)) return ::mlir::failure(); for (::mlir::Type type : multi_indexTypes) { (void)type; if (!(((::llvm::isa<::mlir::IndexType>(type))) || (((::llvm::isa<::mlir::VectorType>(type))) && ([](::mlir::Type elementType) { return (::llvm::isa<::mlir::IndexType>(elementType)); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) { return parser.emitError(parser.getNameLoc()) << "'multi_index' must be variadic of index or vector of index, but got " << type; } } ::mlir::Type odsBuildableType0 = parser.getBuilder().getIndexType(); result.addTypes(multi_indexTypes); if (parser.resolveOperands(linear_indexOperands, multi_indexTypes[0], linear_indexOperandsLoc, result.operands)) return ::mlir::failure(); if (parser.resolveOperands(dynamic_basisOperands, odsBuildableType0, dynamic_basisOperandsLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } void AffineDelinearizeIndexOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getLinearIndex(); _odsPrinter << ' ' << "into"; _odsPrinter << ' '; printDynamicIndexList(_odsPrinter, *this, getDynamicBasis(), getStaticBasisAttr(), {}, ::mlir::AsmParser::Delimiter::Paren); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("static_basis"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter << getMultiIndex().getTypes(); } void AffineDelinearizeIndexOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineDelinearizeIndexOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineDelinearizeIndexOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineDmaStartOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineDmaStartOpGenericAdaptorBase::AffineDmaStartOpGenericAdaptorBase(AffineDmaStartOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineDmaStartOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::AffineMap AffineDmaStartOpGenericAdaptorBase::getSrcMap() { auto attr = getSrcMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineDmaStartOpGenericAdaptorBase::getDstMap() { auto attr = getDstMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineDmaStartOpGenericAdaptorBase::getTagMap() { auto attr = getTagMapAttr(); return attr.getValue(); } } // namespace detail AffineDmaStartOpAdaptor::AffineDmaStartOpAdaptor(AffineDmaStartOp op) : AffineDmaStartOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineDmaStartOpAdaptor::verify(::mlir::Location loc) { auto tblgen_dst_map = getProperties().dst_map; (void)tblgen_dst_map; if (!tblgen_dst_map) return emitError(loc, "'affine.dma_start' op requires attribute 'dst_map'"); auto tblgen_src_map = getProperties().src_map; (void)tblgen_src_map; if (!tblgen_src_map) return emitError(loc, "'affine.dma_start' op requires attribute 'src_map'"); auto tblgen_tag_map = getProperties().tag_map; (void)tblgen_tag_map; if (!tblgen_tag_map) return emitError(loc, "'affine.dma_start' op requires attribute 'tag_map'"); if (tblgen_src_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_src_map)))) return emitError(loc, "'affine.dma_start' op attribute 'src_map' failed to satisfy constraint: AffineMap attribute"); if (tblgen_dst_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_dst_map)))) return emitError(loc, "'affine.dma_start' op attribute 'dst_map' failed to satisfy constraint: AffineMap attribute"); if (tblgen_tag_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_tag_map)))) return emitError(loc, "'affine.dma_start' op attribute 'tag_map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineDmaStartOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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 AffineDmaStartOp::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.dst_map; auto attr = dict.get("dst_map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `dst_map` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.src_map; auto attr = dict.get("src_map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `src_map` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tag_map; auto attr = dict.get("tag_map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tag_map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineDmaStartOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.dst_map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("dst_map", propStorage)); } { const auto &propStorage = prop.src_map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("src_map", propStorage)); } { const auto &propStorage = prop.tag_map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tag_map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineDmaStartOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.dst_map.getAsOpaquePointer()), llvm::hash_value(prop.src_map.getAsOpaquePointer()), llvm::hash_value(prop.tag_map.getAsOpaquePointer())); } std::optional AffineDmaStartOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "dst_map") return prop.dst_map; if (name == "src_map") return prop.src_map; if (name == "tag_map") return prop.tag_map; return std::nullopt; } void AffineDmaStartOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "dst_map") { prop.dst_map = ::llvm::dyn_cast_or_null>(value); return; } if (name == "src_map") { prop.src_map = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tag_map") { prop.tag_map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineDmaStartOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.dst_map) attrs.append("dst_map", prop.dst_map); if (prop.src_map) attrs.append("src_map", prop.src_map); if (prop.tag_map) attrs.append("tag_map", prop.tag_map); } ::llvm::LogicalResult AffineDmaStartOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getDstMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "dst_map", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getSrcMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "src_map", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTagMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "tag_map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineDmaStartOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.dst_map))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.src_map))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tag_map))) return ::mlir::failure(); return ::mlir::success(); } void AffineDmaStartOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.dst_map); writer.writeAttribute(prop.src_map); writer.writeAttribute(prop.tag_map); } ::mlir::AffineMap AffineDmaStartOp::getSrcMap() { auto attr = getSrcMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineDmaStartOp::getDstMap() { auto attr = getDstMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineDmaStartOp::getTagMap() { auto attr = getTagMapAttr(); return attr.getValue(); } void AffineDmaStartOp::setSrcMap(::mlir::AffineMap attrValue) { getProperties().src_map = ::mlir::AffineMapAttr::get(attrValue); } void AffineDmaStartOp::setDstMap(::mlir::AffineMap attrValue) { getProperties().dst_map = ::mlir::AffineMapAttr::get(attrValue); } void AffineDmaStartOp::setTagMap(::mlir::AffineMap attrValue) { getProperties().tag_map = ::mlir::AffineMapAttr::get(attrValue); } AffineDmaStartOp AffineDmaStartOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value srcMemRef, AffineMap srcMap, ValueRange srcIndices, Value destMemRef, AffineMap dstMap, ValueRange destIndices, Value tagMemRef, AffineMap tagMap, ValueRange tagIndices, Value numElements, Value stride, Value elementsPerStride) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(srcMemRef), std::forward(srcMap), std::forward(srcIndices), std::forward(destMemRef), std::forward(dstMap), std::forward(destIndices), std::forward(tagMemRef), std::forward(tagMap), std::forward(tagIndices), std::forward(numElements), std::forward(stride), std::forward(elementsPerStride)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDmaStartOp AffineDmaStartOp::create(::mlir::ImplicitLocOpBuilder &builder, Value srcMemRef, AffineMap srcMap, ValueRange srcIndices, Value destMemRef, AffineMap dstMap, ValueRange destIndices, Value tagMemRef, AffineMap tagMap, ValueRange tagIndices, Value numElements, Value stride, Value elementsPerStride) { return create(builder, builder.getLoc(), std::forward(srcMemRef), std::forward(srcMap), std::forward(srcIndices), std::forward(destMemRef), std::forward(dstMap), std::forward(destIndices), std::forward(tagMemRef), std::forward(tagMap), std::forward(tagIndices), std::forward(numElements), std::forward(stride), std::forward(elementsPerStride)); } ::llvm::LogicalResult AffineDmaStartOp::verifyInvariantsImpl() { auto tblgen_dst_map = getProperties().dst_map; (void)tblgen_dst_map; if (!tblgen_dst_map) return emitOpError("requires attribute 'dst_map'"); auto tblgen_src_map = getProperties().src_map; (void)tblgen_src_map; if (!tblgen_src_map) return emitOpError("requires attribute 'src_map'"); auto tblgen_tag_map = getProperties().tag_map; (void)tblgen_tag_map; if (!tblgen_tag_map) return emitOpError("requires attribute 'tag_map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_src_map, "src_map"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_dst_map, "dst_map"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_tag_map, "tag_map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps5(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineDmaStartOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineDmaStartOp::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.src_map; auto src_mapAttrName = ::mlir::StringAttr::get(ctx, "src_map"); auto attr = dict.get(src_mapAttrName); usedKeys.insert(src_mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for src_map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `src_map` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.dst_map; auto dst_mapAttrName = ::mlir::StringAttr::get(ctx, "dst_map"); auto attr = dict.get(dst_mapAttrName); usedKeys.insert(dst_mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for dst_map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `dst_map` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tag_map; auto tag_mapAttrName = ::mlir::StringAttr::get(ctx, "tag_map"); auto attr = dict.get(tag_mapAttrName); usedKeys.insert(tag_mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tag_map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tag_map` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineDmaStartOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineDmaStartOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineDmaWaitOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineDmaWaitOpGenericAdaptorBase::AffineDmaWaitOpGenericAdaptorBase(AffineDmaWaitOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineDmaWaitOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::AffineMap AffineDmaWaitOpGenericAdaptorBase::getTagMap() { auto attr = getTagMapAttr(); return attr.getValue(); } } // namespace detail AffineDmaWaitOpAdaptor::AffineDmaWaitOpAdaptor(AffineDmaWaitOp op) : AffineDmaWaitOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineDmaWaitOpAdaptor::verify(::mlir::Location loc) { auto tblgen_tag_map = getProperties().tag_map; (void)tblgen_tag_map; if (!tblgen_tag_map) return emitError(loc, "'affine.dma_wait' op requires attribute 'tag_map'"); if (tblgen_tag_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_tag_map)))) return emitError(loc, "'affine.dma_wait' op attribute 'tag_map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineDmaWaitOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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 AffineDmaWaitOp::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.tag_map; auto attr = dict.get("tag_map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tag_map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineDmaWaitOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.tag_map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tag_map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineDmaWaitOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.tag_map.getAsOpaquePointer())); } std::optional AffineDmaWaitOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "tag_map") return prop.tag_map; return std::nullopt; } void AffineDmaWaitOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "tag_map") { prop.tag_map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineDmaWaitOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.tag_map) attrs.append("tag_map", prop.tag_map); } ::llvm::LogicalResult AffineDmaWaitOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getTagMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "tag_map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineDmaWaitOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.tag_map))) return ::mlir::failure(); return ::mlir::success(); } void AffineDmaWaitOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.tag_map); } ::mlir::AffineMap AffineDmaWaitOp::getTagMap() { auto attr = getTagMapAttr(); return attr.getValue(); } void AffineDmaWaitOp::setTagMap(::mlir::AffineMap attrValue) { getProperties().tag_map = ::mlir::AffineMapAttr::get(attrValue); } AffineDmaWaitOp AffineDmaWaitOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value tagMemRef, AffineMap tagMap, ValueRange tagIndices, Value numElements) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(tagMemRef), std::forward(tagMap), std::forward(tagIndices), std::forward(numElements)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineDmaWaitOp AffineDmaWaitOp::create(::mlir::ImplicitLocOpBuilder &builder, Value tagMemRef, AffineMap tagMap, ValueRange tagIndices, Value numElements) { return create(builder, builder.getLoc(), std::forward(tagMemRef), std::forward(tagMap), std::forward(tagIndices), std::forward(numElements)); } ::llvm::LogicalResult AffineDmaWaitOp::verifyInvariantsImpl() { auto tblgen_tag_map = getProperties().tag_map; (void)tblgen_tag_map; if (!tblgen_tag_map) return emitOpError("requires attribute 'tag_map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_tag_map, "tag_map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps5(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineDmaWaitOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineDmaWaitOp::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.tag_map; auto tag_mapAttrName = ::mlir::StringAttr::get(ctx, "tag_map"); auto attr = dict.get(tag_mapAttrName); usedKeys.insert(tag_mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tag_map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tag_map` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineDmaWaitOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineDmaWaitOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineForOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineForOpGenericAdaptorBase::AffineForOpGenericAdaptorBase(AffineForOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineForOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { ::llvm::ArrayRef sizeAttr = getProperties().operandSegmentSizes; unsigned start = 0; for (unsigned i = 0; i < index; ++i) start += sizeAttr[i]; return {start, sizeAttr[index]}; } ::mlir::AffineMap AffineForOpGenericAdaptorBase::getLowerBoundMap() { auto attr = getLowerBoundMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineForOpGenericAdaptorBase::getUpperBoundMap() { auto attr = getUpperBoundMapAttr(); return attr.getValue(); } ::llvm::APInt AffineForOpGenericAdaptorBase::getStep() { auto attr = getStepAttr(); return attr.getValue(); } } // namespace detail AffineForOpAdaptor::AffineForOpAdaptor(AffineForOp op) : AffineForOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineForOpAdaptor::verify(::mlir::Location loc) { auto tblgen_lowerBoundMap = getProperties().lowerBoundMap; (void)tblgen_lowerBoundMap; if (!tblgen_lowerBoundMap) return emitError(loc, "'affine.for' op requires attribute 'lowerBoundMap'"); auto tblgen_step = getProperties().step; (void)tblgen_step; if (!tblgen_step) return emitError(loc, "'affine.for' op requires attribute 'step'"); auto tblgen_upperBoundMap = getProperties().upperBoundMap; (void)tblgen_upperBoundMap; if (!tblgen_upperBoundMap) return emitError(loc, "'affine.for' op requires attribute 'upperBoundMap'"); if (tblgen_lowerBoundMap && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_lowerBoundMap)))) return emitError(loc, "'affine.for' op attribute 'lowerBoundMap' failed to satisfy constraint: AffineMap attribute"); if (tblgen_upperBoundMap && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_upperBoundMap)))) return emitError(loc, "'affine.for' op attribute 'upperBoundMap' failed to satisfy constraint: AffineMap attribute"); if (tblgen_step && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_step))) && ((::llvm::isa<::mlir::IndexType>(::llvm::cast<::mlir::IntegerAttr>(tblgen_step).getType()))))) return emitError(loc, "'affine.for' op attribute 'step' failed to satisfy constraint: index attribute"); return ::mlir::success(); } std::pair AffineForOp::getODSOperandIndexAndLength(unsigned index) { ::llvm::ArrayRef sizeAttr = getProperties().operandSegmentSizes; unsigned start = 0; for (unsigned i = 0; i < index; ++i) start += sizeAttr[i]; return {start, sizeAttr[index]}; } ::mlir::MutableOperandRange AffineForOp::getLowerBoundOperandsMutable() { 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 AffineForOp::getUpperBoundOperandsMutable() { 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; } ::mlir::MutableOperandRange AffineForOp::getInitsMutable() { auto range = getODSOperandIndexAndLength(2); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second, ::mlir::MutableOperandRange::OperandSegment(2u, {getOperandSegmentSizesAttrName(), ::mlir::DenseI32ArrayAttr::get(getContext(), getProperties().operandSegmentSizes)})); return mutableRange; } std::pair AffineForOp::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 AffineForOp::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.lowerBoundMap; auto attr = dict.get("lowerBoundMap"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.step; auto attr = dict.get("step"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `step` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundMap; auto attr = dict.get("upperBoundMap"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundMap` 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 AffineForOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.lowerBoundMap; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("lowerBoundMap", propStorage)); } { const auto &propStorage = prop.step; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("step", propStorage)); } { const auto &propStorage = prop.upperBoundMap; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("upperBoundMap", 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 AffineForOp::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.lowerBoundMap.getAsOpaquePointer()), llvm::hash_value(prop.step.getAsOpaquePointer()), llvm::hash_value(prop.upperBoundMap.getAsOpaquePointer()), hash_operandSegmentSizes_(prop.operandSegmentSizes)); } std::optional AffineForOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "lowerBoundMap") return prop.lowerBoundMap; if (name == "step") return prop.step; if (name == "upperBoundMap") return prop.upperBoundMap; if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }(); return std::nullopt; } void AffineForOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "lowerBoundMap") { prop.lowerBoundMap = ::llvm::dyn_cast_or_null>(value); return; } if (name == "step") { prop.step = ::llvm::dyn_cast_or_null>(value); return; } if (name == "upperBoundMap") { prop.upperBoundMap = ::llvm::dyn_cast_or_null>(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 AffineForOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.lowerBoundMap) attrs.append("lowerBoundMap", prop.lowerBoundMap); if (prop.step) attrs.append("step", prop.step); if (prop.upperBoundMap) attrs.append("upperBoundMap", prop.upperBoundMap); attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }()); } ::llvm::LogicalResult AffineForOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getLowerBoundMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "lowerBoundMap", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getStepAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps3(attr, "step", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getUpperBoundMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "upperBoundMap", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineForOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.lowerBoundMap))) 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(sizeof(propStorage) / sizeof(int32_t))) { reader.emitError("size mismatch for operand/result_segment_size"); return ::mlir::failure(); } ::llvm::copy(::llvm::ArrayRef(attr), propStorage.begin()); } if (::mlir::failed(reader.readAttribute(prop.step))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.upperBoundMap))) 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 AffineForOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.lowerBoundMap); if (writer.getBytecodeVersion() < /*kNativePropertiesODSSegmentSize=*/6) { auto &propStorage = prop.operandSegmentSizes; writer.writeAttribute(::mlir::DenseI32ArrayAttr::get(this->getContext(), propStorage)); } writer.writeAttribute(prop.step); writer.writeAttribute(prop.upperBoundMap); { auto &propStorage = prop.operandSegmentSizes; if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6) writer.writeSparseArray(::llvm::ArrayRef(propStorage)); ; } } ::mlir::AffineMap AffineForOp::getLowerBoundMap() { auto attr = getLowerBoundMapAttr(); return attr.getValue(); } ::mlir::AffineMap AffineForOp::getUpperBoundMap() { auto attr = getUpperBoundMapAttr(); return attr.getValue(); } ::llvm::APInt AffineForOp::getStep() { auto attr = getStepAttr(); return attr.getValue(); } void AffineForOp::setLowerBoundMap(::mlir::AffineMap attrValue) { getProperties().lowerBoundMap = ::mlir::AffineMapAttr::get(attrValue); } void AffineForOp::setUpperBoundMap(::mlir::AffineMap attrValue) { getProperties().upperBoundMap = ::mlir::AffineMapAttr::get(attrValue); } void AffineForOp::setStep(::llvm::APInt attrValue) { getProperties().step = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIndexType(), attrValue); } AffineForOp AffineForOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, int64_t lowerBound, int64_t upperBound, int64_t step, ValueRange iterArgs, function_ref bodyBuilder) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(lowerBound), std::forward(upperBound), std::forward(step), std::forward(iterArgs), std::forward(bodyBuilder)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineForOp AffineForOp::create(::mlir::ImplicitLocOpBuilder &builder, int64_t lowerBound, int64_t upperBound, int64_t step, ValueRange iterArgs, function_ref bodyBuilder) { return create(builder, builder.getLoc(), std::forward(lowerBound), std::forward(upperBound), std::forward(step), std::forward(iterArgs), std::forward(bodyBuilder)); } AffineForOp AffineForOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange lbOperands, AffineMap lbMap, ValueRange ubOperands, AffineMap ubMap, int64_t step, ValueRange iterArgs, function_ref bodyBuilder) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(lbOperands), std::forward(lbMap), std::forward(ubOperands), std::forward(ubMap), std::forward(step), std::forward(iterArgs), std::forward(bodyBuilder)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineForOp AffineForOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange lbOperands, AffineMap lbMap, ValueRange ubOperands, AffineMap ubMap, int64_t step, ValueRange iterArgs, function_ref bodyBuilder) { return create(builder, builder.getLoc(), std::forward(lbOperands), std::forward(lbMap), std::forward(ubOperands), std::forward(ubMap), std::forward(step), std::forward(iterArgs), std::forward(bodyBuilder)); } ::llvm::LogicalResult AffineForOp::verifyInvariantsImpl() { auto tblgen_lowerBoundMap = getProperties().lowerBoundMap; (void)tblgen_lowerBoundMap; if (!tblgen_lowerBoundMap) return emitOpError("requires attribute 'lowerBoundMap'"); auto tblgen_step = getProperties().step; (void)tblgen_step; if (!tblgen_step) return emitOpError("requires attribute 'step'"); auto tblgen_upperBoundMap = getProperties().upperBoundMap; (void)tblgen_upperBoundMap; if (!tblgen_upperBoundMap) return emitOpError("requires attribute 'upperBoundMap'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_lowerBoundMap, "lowerBoundMap"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_upperBoundMap, "upperBoundMap"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps3(*this, tblgen_step, "step"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps5(*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_AffineOps5(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } { unsigned index = 0; (void)index; for (auto ®ion : ::llvm::MutableArrayRef((*this)->getRegion(0))) if (::mlir::failed(__mlir_ods_local_region_constraint_AffineOps1(*this, region, "region", index++))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineForOp::verifyInvariants() { return verifyInvariantsImpl(); } ::llvm::LogicalResult AffineForOp::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.lowerBoundMap; auto lowerBoundMapAttrName = ::mlir::StringAttr::get(ctx, "lowerBoundMap"); auto attr = dict.get(lowerBoundMapAttrName); usedKeys.insert(lowerBoundMapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for lowerBoundMap in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundMap; auto upperBoundMapAttrName = ::mlir::StringAttr::get(ctx, "upperBoundMap"); auto attr = dict.get(upperBoundMapAttrName); usedKeys.insert(upperBoundMapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for upperBoundMap in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.step; auto stepAttrName = ::mlir::StringAttr::get(ctx, "step"); auto attr = dict.get(stepAttrName); usedKeys.insert(stepAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for step in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `step` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineForOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineForOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineIfOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineIfOpGenericAdaptorBase::AffineIfOpGenericAdaptorBase(AffineIfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineIfOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::IntegerSet AffineIfOpGenericAdaptorBase::getCondition() { auto attr = getConditionAttr(); return attr.getValue(); } } // namespace detail AffineIfOpAdaptor::AffineIfOpAdaptor(AffineIfOp op) : AffineIfOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineIfOpAdaptor::verify(::mlir::Location loc) { auto tblgen_condition = getProperties().condition; (void)tblgen_condition; if (!tblgen_condition) return emitError(loc, "'affine.if' op requires attribute 'condition'"); if (tblgen_condition && !((::llvm::isa<::mlir::IntegerSetAttr>(tblgen_condition)))) return emitError(loc, "'affine.if' op attribute 'condition' failed to satisfy constraint: IntegerSet attribute"); return ::mlir::success(); } std::pair AffineIfOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } std::pair AffineIfOp::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 AffineIfOp::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.condition; auto attr = dict.get("condition"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `condition` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineIfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.condition; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("condition", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineIfOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.condition.getAsOpaquePointer())); } std::optional AffineIfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "condition") return prop.condition; return std::nullopt; } void AffineIfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "condition") { prop.condition = ::llvm::dyn_cast_or_null>(value); return; } } void AffineIfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.condition) attrs.append("condition", prop.condition); } ::llvm::LogicalResult AffineIfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getConditionAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps4(attr, "condition", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineIfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.condition))) return ::mlir::failure(); return ::mlir::success(); } void AffineIfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.condition); } ::mlir::IntegerSet AffineIfOp::getCondition() { auto attr = getConditionAttr(); return attr.getValue(); } void AffineIfOp::setCondition(::mlir::IntegerSet attrValue) { getProperties().condition = ::mlir::IntegerSetAttr::get(attrValue); } AffineIfOp AffineIfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, IntegerSet set, ValueRange args, bool withElseRegion) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(set), std::forward(args), std::forward(withElseRegion)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineIfOp AffineIfOp::create(::mlir::ImplicitLocOpBuilder &builder, IntegerSet set, ValueRange args, bool withElseRegion) { return create(builder, builder.getLoc(), std::forward(set), std::forward(args), std::forward(withElseRegion)); } AffineIfOp AffineIfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTypes, IntegerSet set, ValueRange args, bool withElseRegion) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(set), std::forward(args), std::forward(withElseRegion)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineIfOp AffineIfOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTypes, IntegerSet set, ValueRange args, bool withElseRegion) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(set), std::forward(args), std::forward(withElseRegion)); } ::llvm::LogicalResult AffineIfOp::verifyInvariantsImpl() { auto tblgen_condition = getProperties().condition; (void)tblgen_condition; if (!tblgen_condition) return emitOpError("requires attribute 'condition'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps4(*this, tblgen_condition, "condition"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps5(*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_AffineOps5(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } { unsigned index = 0; (void)index; for (auto ®ion : ::llvm::MutableArrayRef((*this)->getRegion(0))) if (::mlir::failed(__mlir_ods_local_region_constraint_AffineOps1(*this, region, "thenRegion", index++))) return ::mlir::failure(); for (auto ®ion : ::llvm::MutableArrayRef((*this)->getRegion(1))) if (::mlir::failed(__mlir_ods_local_region_constraint_AffineOps2(*this, region, "elseRegion", index++))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineIfOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineIfOp::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.condition; auto conditionAttrName = ::mlir::StringAttr::get(ctx, "condition"); auto attr = dict.get(conditionAttrName); usedKeys.insert(conditionAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for condition in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `condition` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineIfOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineIfOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineLinearizeIndexOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineLinearizeIndexOpGenericAdaptorBase::AffineLinearizeIndexOpGenericAdaptorBase(AffineLinearizeIndexOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineLinearizeIndexOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { ::llvm::ArrayRef sizeAttr = getProperties().operandSegmentSizes; unsigned start = 0; for (unsigned i = 0; i < index; ++i) start += sizeAttr[i]; return {start, sizeAttr[index]}; } ::llvm::ArrayRef AffineLinearizeIndexOpGenericAdaptorBase::getStaticBasis() { auto attr = getStaticBasisAttr(); return attr; } } // namespace detail AffineLinearizeIndexOpAdaptor::AffineLinearizeIndexOpAdaptor(AffineLinearizeIndexOp op) : AffineLinearizeIndexOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineLinearizeIndexOpAdaptor::verify(::mlir::Location loc) { auto tblgen_static_basis = getProperties().static_basis; (void)tblgen_static_basis; if (!tblgen_static_basis) return emitError(loc, "'affine.linearize_index' op requires attribute 'static_basis'"); if (tblgen_static_basis && !((::llvm::isa<::mlir::DenseI64ArrayAttr>(tblgen_static_basis)))) return emitError(loc, "'affine.linearize_index' op attribute 'static_basis' failed to satisfy constraint: i64 dense array attribute"); return ::mlir::success(); } std::pair AffineLinearizeIndexOp::getODSOperandIndexAndLength(unsigned index) { ::llvm::ArrayRef sizeAttr = getProperties().operandSegmentSizes; unsigned start = 0; for (unsigned i = 0; i < index; ++i) start += sizeAttr[i]; return {start, sizeAttr[index]}; } ::mlir::MutableOperandRange AffineLinearizeIndexOp::getMultiIndexMutable() { 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 AffineLinearizeIndexOp::getDynamicBasisMutable() { 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; } ::llvm::LogicalResult AffineLinearizeIndexOp::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.static_basis; auto attr = dict.get("static_basis"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `static_basis` in property conversion: " << attr; return ::mlir::failure(); } } } { auto setFromAttr = [] (auto &propStorage, ::mlir::Attribute propAttr, ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) -> ::mlir::LogicalResult { if (::llvm::isa<::mlir::UnitAttr>(propAttr)) { propStorage = true; return ::mlir::success(); } if (auto boolAttr = ::llvm::dyn_cast<::mlir::BoolAttr>(propAttr)) { propStorage = boolAttr.getValue(); return ::mlir::success(); } return ::mlir::failure(); }; auto attr = dict.get("disjoint");; ; if (attr) { if (::mlir::failed(setFromAttr(prop.disjoint, attr, [&]() { return emitError() << "for `disjoint`: "; }))) return ::mlir::failure(); } else { prop.disjoint = false; } } { 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 AffineLinearizeIndexOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.static_basis; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("static_basis", propStorage)); } { const auto &propStorage = prop.disjoint; auto attr = [&]() -> ::mlir::Attribute { if (propStorage) return ::mlir::UnitAttr::get(ctx); else return ::mlir::BoolAttr::get(ctx, false); }(); attrs.push_back(odsBuilder.getNamedAttr("disjoint", attr)); } { 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 AffineLinearizeIndexOp::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.static_basis.getAsOpaquePointer()), hash_value(prop.disjoint), hash_operandSegmentSizes_(prop.operandSegmentSizes)); } std::optional AffineLinearizeIndexOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "static_basis") return prop.static_basis; if (name == "operand_segment_sizes" || name == "operandSegmentSizes") return [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }(); return std::nullopt; } void AffineLinearizeIndexOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "static_basis") { prop.static_basis = ::llvm::dyn_cast_or_null>(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 AffineLinearizeIndexOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.static_basis) attrs.append("static_basis", prop.static_basis); attrs.append("operandSegmentSizes", [&]() -> ::mlir::Attribute { return ::mlir::DenseI32ArrayAttr::get(ctx, prop.operandSegmentSizes); }()); } ::llvm::LogicalResult AffineLinearizeIndexOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getStaticBasisAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps2(attr, "static_basis", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineLinearizeIndexOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (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(sizeof(propStorage) / sizeof(int32_t))) { reader.emitError("size mismatch for operand/result_segment_size"); return ::mlir::failure(); } ::llvm::copy(::llvm::ArrayRef(attr), propStorage.begin()); } if (::mlir::failed(reader.readAttribute(prop.static_basis))) return ::mlir::failure(); { auto &propStorage = prop.disjoint; auto readProp = [&]() { if (::mlir::failed(reader.readBool(propStorage))) return ::mlir::failure();; return ::mlir::success(); }; if (::mlir::failed(readProp())) 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 AffineLinearizeIndexOp::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)); } writer.writeAttribute(prop.static_basis); { auto &propStorage = prop.disjoint; writer.writeOwnedBool(propStorage);; } { auto &propStorage = prop.operandSegmentSizes; if (writer.getBytecodeVersion() >= /*kNativePropertiesODSSegmentSize=*/6) writer.writeSparseArray(::llvm::ArrayRef(propStorage)); ; } } ::llvm::ArrayRef AffineLinearizeIndexOp::getStaticBasis() { auto attr = getStaticBasisAttr(); return attr; } void AffineLinearizeIndexOp::setStaticBasis(::llvm::ArrayRef attrValue) { getProperties().static_basis = ::mlir::Builder((*this)->getContext()).getDenseI64ArrayAttr(attrValue); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange multi_index, ValueRange basis, bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(multi_index), std::forward(basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange multi_index, ValueRange basis, bool disjoint) { return create(builder, builder.getLoc(), std::forward(multi_index), std::forward(basis), std::forward(disjoint)); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange multi_index, ArrayRef basis, bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(multi_index), std::forward(basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange multi_index, ArrayRef basis, bool disjoint) { return create(builder, builder.getLoc(), std::forward(multi_index), std::forward(basis), std::forward(disjoint)); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ValueRange multi_index, ArrayRef basis, bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(multi_index), std::forward(basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ValueRange multi_index, ArrayRef basis, bool disjoint) { return create(builder, builder.getLoc(), std::forward(multi_index), std::forward(basis), std::forward(disjoint)); } void AffineLinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { odsState.addOperands(multi_index); odsState.addOperands(dynamic_basis); ::llvm::copy(::llvm::ArrayRef({static_cast(multi_index.size()), static_cast(dynamic_basis.size())}), odsState.getOrAddProperties().operandSegmentSizes.begin()); odsState.getOrAddProperties().setDisjoint(disjoint); odsState.getOrAddProperties().static_basis = static_basis; odsState.addTypes(linear_index); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); } void AffineLinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { odsState.addOperands(multi_index); odsState.addOperands(dynamic_basis); ::llvm::copy(::llvm::ArrayRef({static_cast(multi_index.size()), static_cast(dynamic_basis.size())}), odsState.getOrAddProperties().operandSegmentSizes.begin()); odsState.getOrAddProperties().setDisjoint(disjoint); odsState.getOrAddProperties().static_basis = static_basis; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::mlir::DenseI64ArrayAttr static_basis, /*optional*/bool disjoint) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); } void AffineLinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { odsState.addOperands(multi_index); odsState.addOperands(dynamic_basis); ::llvm::copy(::llvm::ArrayRef({static_cast(multi_index.size()), static_cast(dynamic_basis.size())}), odsState.getOrAddProperties().operandSegmentSizes.begin()); odsState.getOrAddProperties().setDisjoint(disjoint); odsState.getOrAddProperties().static_basis = odsBuilder.getDenseI64ArrayAttr(static_basis); odsState.addTypes(linear_index); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(linear_index), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type linear_index, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { return create(builder, builder.getLoc(), std::forward(linear_index), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); } void AffineLinearizeIndexOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { odsState.addOperands(multi_index); odsState.addOperands(dynamic_basis); ::llvm::copy(::llvm::ArrayRef({static_cast(multi_index.size()), static_cast(dynamic_basis.size())}), odsState.getOrAddProperties().operandSegmentSizes.begin()); odsState.getOrAddProperties().setDisjoint(disjoint); odsState.getOrAddProperties().static_basis = odsBuilder.getDenseI64ArrayAttr(static_basis); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange multi_index, ::mlir::ValueRange dynamic_basis, ::llvm::ArrayRef static_basis, /*optional*/bool disjoint) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(multi_index), std::forward(dynamic_basis), std::forward(static_basis), std::forward(disjoint)); } void AffineLinearizeIndexOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineLinearizeIndexOp AffineLinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineLinearizeIndexOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineLinearizeIndexOp AffineLinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLinearizeIndexOp AffineLinearizeIndexOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineLinearizeIndexOp::verifyInvariantsImpl() { auto tblgen_static_basis = getProperties().static_basis; (void)tblgen_static_basis; if (!tblgen_static_basis) return emitOpError("requires attribute 'static_basis'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps2(*this, tblgen_static_basis, "static_basis"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps4(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps3(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } if (!(([](::mlir::Type a, ::mlir::TypeRange b) { return llvm::all_of(b, [a](::mlir::Type t) { return t == a; }); }((*this->getODSResults(0).begin()).getType(), this->getODSOperands(0).getType())))) return emitOpError("failed to verify that multi_index types must match result type"); return ::mlir::success(); } ::llvm::LogicalResult AffineLinearizeIndexOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult AffineLinearizeIndexOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> multi_indexOperands; ::llvm::SMLoc multi_indexOperandsLoc; (void)multi_indexOperandsLoc; ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> dynamic_basisOperands; ::llvm::SMLoc dynamic_basisOperandsLoc; (void)dynamic_basisOperandsLoc; ::mlir::DenseI64ArrayAttr static_basisAttr; ::mlir::Type linear_indexRawType{}; ::llvm::ArrayRef<::mlir::Type> linear_indexTypes(&linear_indexRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("disjoint"))) { result.getOrAddProperties().disjoint = true; } if (parser.parseLSquare()) return ::mlir::failure(); multi_indexOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperandList(multi_indexOperands)) return ::mlir::failure(); if (parser.parseRSquare()) return ::mlir::failure(); if (parser.parseKeyword("by")) return ::mlir::failure(); { dynamic_basisOperandsLoc = parser.getCurrentLocation(); auto odsResult = parseDynamicIndexList(parser, dynamic_basisOperands, static_basisAttr, {}, ::mlir::AsmParser::Delimiter::Paren); if (odsResult) return ::mlir::failure(); result.getOrAddProperties().static_basis = static_basisAttr; } { auto loc = parser.getCurrentLocation();(void)loc; if (parser.parseOptionalAttrDict(result.attributes)) return ::mlir::failure(); if (failed(verifyInherentAttrs(result.name, result.attributes, [&]() { return parser.emitError(loc) << "'" << result.name.getStringRef() << "' op "; }))) return ::mlir::failure(); } if (parser.parseColon()) return ::mlir::failure(); { ::mlir::Type type; if (parser.parseCustomTypeWithFallback(type)) return ::mlir::failure(); linear_indexRawType = type; } ::llvm::copy(::llvm::ArrayRef({static_cast(multi_indexOperands.size()), static_cast(dynamic_basisOperands.size())}), result.getOrAddProperties().operandSegmentSizes.begin()); for (::mlir::Type type : linear_indexTypes) { (void)type; if (!(((::llvm::isa<::mlir::IndexType>(type))) || (((::llvm::isa<::mlir::VectorType>(type))) && ([](::mlir::Type elementType) { return (::llvm::isa<::mlir::IndexType>(elementType)); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))))) { return parser.emitError(parser.getNameLoc()) << "'linear_index' must be index or vector of index, but got " << type; } } ::mlir::Type odsBuildableType0 = parser.getBuilder().getIndexType(); result.addTypes(linear_indexTypes); if (parser.resolveOperands(multi_indexOperands, linear_indexTypes[0], multi_indexOperandsLoc, result.operands)) return ::mlir::failure(); if (parser.resolveOperands(dynamic_basisOperands, odsBuildableType0, dynamic_basisOperandsLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } void AffineLinearizeIndexOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getDisjoint() != false) { _odsPrinter << ' ' << "disjoint"; } _odsPrinter << ' '; _odsPrinter << "["; _odsPrinter << getMultiIndex(); _odsPrinter << "]"; _odsPrinter << ' ' << "by"; _odsPrinter << ' '; printDynamicIndexList(_odsPrinter, *this, getDynamicBasis(), getStaticBasisAttr(), {}, ::mlir::AsmParser::Delimiter::Paren); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("operandSegmentSizes"); elidedAttrs.push_back("static_basis"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getLinearIndex().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } void AffineLinearizeIndexOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineLinearizeIndexOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineLinearizeIndexOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineLoadOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineLoadOpGenericAdaptorBase::AffineLoadOpGenericAdaptorBase(AffineLoadOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineLoadOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, 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 - 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::AffineMap AffineLoadOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineLoadOpAdaptor::AffineLoadOpAdaptor(AffineLoadOp op) : AffineLoadOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineLoadOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.load' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.load' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineLoadOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, 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() - 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 AffineLoadOp::getIndicesMutable() { auto range = getODSOperandIndexAndLength(1); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineLoadOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineLoadOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineLoadOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineLoadOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineLoadOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineLoadOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineLoadOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineLoadOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineLoadOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineLoadOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineLoadOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, AffineMap map, ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, AffineMap map, ValueRange operands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(operands)); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value memref, ValueRange indices) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(memref), std::forward(indices)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, Value memref, ValueRange indices) { return create(builder, builder.getLoc(), std::forward(memref), std::forward(indices)); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value memref, AffineMap map, ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(memref), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, Value memref, AffineMap map, ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(memref), std::forward(map), std::forward(mapOperands)); } void AffineLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = map; odsState.addTypes(result); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); odsState.addTypes(result); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineLoadOp AffineLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineLoadOp::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); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineLoadOp AffineLoadOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineLoadOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineLoadOp AffineLoadOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineLoadOp AffineLoadOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineLoadOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps6(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineLoadOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineLoadOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineLoadOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { { auto valueRange = getODSOperandIndexAndLength(0); for (unsigned idx = valueRange.first; idx < valueRange.first + valueRange.second; idx++) { effects.emplace_back(::mlir::MemoryEffects::Read::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineLoadOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineLoadOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineMaxOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineMaxOpGenericAdaptorBase::AffineMaxOpGenericAdaptorBase(AffineMaxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineMaxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::AffineMap AffineMaxOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineMaxOpAdaptor::AffineMaxOpAdaptor(AffineMaxOp op) : AffineMaxOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineMaxOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.max' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.max' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineMaxOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } ::mlir::MutableOperandRange AffineMaxOp::getOperandsMutable() { auto range = getODSOperandIndexAndLength(0); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineMaxOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineMaxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineMaxOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineMaxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineMaxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineMaxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineMaxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineMaxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineMaxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineMaxOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineMaxOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; odsState.addTypes(resultType0); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMaxOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); odsState.addTypes(resultType0); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMaxOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(operands)); } void AffineMaxOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineMaxOp AffineMaxOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMaxOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(attributes)); } void AffineMaxOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineMaxOp AffineMaxOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } void AffineMaxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { odsState.addOperands(operands); odsState.useProperties(const_cast(properties)); odsState.addAttributes(discardableAttributes); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMaxOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineMaxOp AffineMaxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMaxOp AffineMaxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineMaxOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps2(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineMaxOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineMaxOp::inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type>&inferredReturnTypes) { inferredReturnTypes.resize(1); ::mlir::Builder odsBuilder(context); ::mlir::Type odsInferredType0 = odsBuilder.getIndexType(); inferredReturnTypes[0] = odsInferredType0; return ::mlir::success(); } ::llvm::LogicalResult AffineMaxOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineMaxOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineMaxOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineMaxOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineMinOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineMinOpGenericAdaptorBase::AffineMinOpGenericAdaptorBase(AffineMinOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineMinOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::AffineMap AffineMinOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineMinOpAdaptor::AffineMinOpAdaptor(AffineMinOp op) : AffineMinOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineMinOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.min' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.min' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineMinOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } ::mlir::MutableOperandRange AffineMinOp::getOperandsMutable() { auto range = getODSOperandIndexAndLength(0); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineMinOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineMinOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineMinOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineMinOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineMinOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineMinOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineMinOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineMinOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineMinOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineMinOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineMinOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; odsState.addTypes(resultType0); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMinOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMapAttr map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); odsState.addTypes(resultType0); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType0), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type resultType0, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultType0), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMinOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, odsState.operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) odsState.addTypes(inferredReturnTypes); else ::mlir::detail::reportFatalInferReturnTypesError(odsState); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { odsState.addOperands(operands); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::AffineMap map, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(map), std::forward(operands)); } void AffineMinOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineMinOp AffineMinOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMinOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(attributes)); } void AffineMinOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineMinOp AffineMinOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } void AffineMinOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { odsState.addOperands(operands); odsState.useProperties(const_cast(properties)); odsState.addAttributes(discardableAttributes); ::llvm::SmallVector<::mlir::Type, 2> inferredReturnTypes; if (::mlir::succeeded(AffineMinOp::inferReturnTypes(odsBuilder.getContext(), odsState.location, operands, odsState.attributes.getDictionary(odsState.getContext()), odsState.getRawProperties(), odsState.regions, inferredReturnTypes))) { assert(inferredReturnTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(inferredReturnTypes); } else { ::llvm::report_fatal_error("Failed to infer result type(s)."); } } AffineMinOp AffineMinOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineMinOp AffineMinOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { return create(builder, builder.getLoc(), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineMinOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps2(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineMinOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineMinOp::inferReturnTypes(::mlir::MLIRContext *context, ::std::optional<::mlir::Location> location, ::mlir::ValueRange operands, ::mlir::DictionaryAttr attributes, ::mlir::PropertyRef properties, ::mlir::RegionRange regions, ::llvm::SmallVectorImpl<::mlir::Type>&inferredReturnTypes) { inferredReturnTypes.resize(1); ::mlir::Builder odsBuilder(context); ::mlir::Type odsInferredType0 = odsBuilder.getIndexType(); inferredReturnTypes[0] = odsInferredType0; return ::mlir::success(); } ::llvm::LogicalResult AffineMinOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineMinOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineMinOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineMinOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineParallelOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineParallelOpGenericAdaptorBase::AffineParallelOpGenericAdaptorBase(AffineParallelOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineParallelOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } ::mlir::ArrayAttr AffineParallelOpGenericAdaptorBase::getReductions() { auto attr = getReductionsAttr(); return attr; } ::mlir::AffineMap AffineParallelOpGenericAdaptorBase::getLowerBoundsMap() { auto attr = getLowerBoundsMapAttr(); return attr.getValue(); } ::mlir::DenseIntElementsAttr AffineParallelOpGenericAdaptorBase::getLowerBoundsGroups() { auto attr = getLowerBoundsGroupsAttr(); return attr; } ::mlir::AffineMap AffineParallelOpGenericAdaptorBase::getUpperBoundsMap() { auto attr = getUpperBoundsMapAttr(); return attr.getValue(); } ::mlir::DenseIntElementsAttr AffineParallelOpGenericAdaptorBase::getUpperBoundsGroups() { auto attr = getUpperBoundsGroupsAttr(); return attr; } ::llvm::SmallVector AffineParallelOpGenericAdaptorBase::getSteps() { auto attr = getStepsAttr(); return llvm::to_vector<4>( llvm::map_range(attr.getAsRange(), [](mlir::IntegerAttr attr) { return attr.getInt(); }));; } } // namespace detail AffineParallelOpAdaptor::AffineParallelOpAdaptor(AffineParallelOp op) : AffineParallelOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineParallelOpAdaptor::verify(::mlir::Location loc) { auto tblgen_lowerBoundsGroups = getProperties().lowerBoundsGroups; (void)tblgen_lowerBoundsGroups; if (!tblgen_lowerBoundsGroups) return emitError(loc, "'affine.parallel' op requires attribute 'lowerBoundsGroups'"); auto tblgen_lowerBoundsMap = getProperties().lowerBoundsMap; (void)tblgen_lowerBoundsMap; if (!tblgen_lowerBoundsMap) return emitError(loc, "'affine.parallel' op requires attribute 'lowerBoundsMap'"); auto tblgen_reductions = getProperties().reductions; (void)tblgen_reductions; if (!tblgen_reductions) return emitError(loc, "'affine.parallel' op requires attribute 'reductions'"); auto tblgen_steps = getProperties().steps; (void)tblgen_steps; if (!tblgen_steps) return emitError(loc, "'affine.parallel' op requires attribute 'steps'"); auto tblgen_upperBoundsGroups = getProperties().upperBoundsGroups; (void)tblgen_upperBoundsGroups; if (!tblgen_upperBoundsGroups) return emitError(loc, "'affine.parallel' op requires attribute 'upperBoundsGroups'"); auto tblgen_upperBoundsMap = getProperties().upperBoundsMap; (void)tblgen_upperBoundsMap; if (!tblgen_upperBoundsMap) return emitError(loc, "'affine.parallel' op requires attribute 'upperBoundsMap'"); if (tblgen_reductions && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_reductions))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_reductions), [&](::mlir::Attribute attr) { return attr && ((::llvm::isa<::mlir::arith::AtomicRMWKindAttr>(attr))); })))) return emitError(loc, "'affine.parallel' op attribute 'reductions' failed to satisfy constraint: Reduction ops"); if (tblgen_lowerBoundsMap && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_lowerBoundsMap)))) return emitError(loc, "'affine.parallel' op attribute 'lowerBoundsMap' failed to satisfy constraint: AffineMap attribute"); if (tblgen_lowerBoundsGroups && !(((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_lowerBoundsGroups))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_lowerBoundsGroups).getType().getElementType().isSignlessInteger(32))))) return emitError(loc, "'affine.parallel' op attribute 'lowerBoundsGroups' failed to satisfy constraint: 32-bit signless integer elements attribute"); if (tblgen_upperBoundsMap && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_upperBoundsMap)))) return emitError(loc, "'affine.parallel' op attribute 'upperBoundsMap' failed to satisfy constraint: AffineMap attribute"); if (tblgen_upperBoundsGroups && !(((::llvm::isa<::mlir::DenseIntElementsAttr>(tblgen_upperBoundsGroups))) && ((::llvm::cast<::mlir::DenseIntElementsAttr>(tblgen_upperBoundsGroups).getType().getElementType().isSignlessInteger(32))))) return emitError(loc, "'affine.parallel' op attribute 'upperBoundsGroups' failed to satisfy constraint: 32-bit signless integer elements attribute"); if (tblgen_steps && !(((::llvm::isa<::mlir::ArrayAttr>(tblgen_steps))) && (::llvm::all_of(::llvm::cast<::mlir::ArrayAttr>(tblgen_steps), [&](::mlir::Attribute attr) { return attr && (((::llvm::isa<::mlir::IntegerAttr>(attr))) && ((::llvm::cast<::mlir::IntegerAttr>(attr).getType().isSignlessInteger(64)))); })))) return emitError(loc, "'affine.parallel' op attribute 'steps' failed to satisfy constraint: 64-bit integer array attribute"); return ::mlir::success(); } std::pair AffineParallelOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } ::mlir::MutableOperandRange AffineParallelOp::getMapOperandsMutable() { auto range = getODSOperandIndexAndLength(0); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } std::pair AffineParallelOp::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 AffineParallelOp::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.lowerBoundsGroups; auto attr = dict.get("lowerBoundsGroups"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundsGroups` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.lowerBoundsMap; auto attr = dict.get("lowerBoundsMap"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundsMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.reductions; auto attr = dict.get("reductions"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `reductions` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.steps; auto attr = dict.get("steps"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `steps` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundsGroups; auto attr = dict.get("upperBoundsGroups"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundsGroups` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundsMap; auto attr = dict.get("upperBoundsMap"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundsMap` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineParallelOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.lowerBoundsGroups; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("lowerBoundsGroups", propStorage)); } { const auto &propStorage = prop.lowerBoundsMap; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("lowerBoundsMap", propStorage)); } { const auto &propStorage = prop.reductions; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("reductions", propStorage)); } { const auto &propStorage = prop.steps; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("steps", propStorage)); } { const auto &propStorage = prop.upperBoundsGroups; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("upperBoundsGroups", propStorage)); } { const auto &propStorage = prop.upperBoundsMap; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("upperBoundsMap", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineParallelOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.lowerBoundsGroups.getAsOpaquePointer()), llvm::hash_value(prop.lowerBoundsMap.getAsOpaquePointer()), llvm::hash_value(prop.reductions.getAsOpaquePointer()), llvm::hash_value(prop.steps.getAsOpaquePointer()), llvm::hash_value(prop.upperBoundsGroups.getAsOpaquePointer()), llvm::hash_value(prop.upperBoundsMap.getAsOpaquePointer())); } std::optional AffineParallelOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "lowerBoundsGroups") return prop.lowerBoundsGroups; if (name == "lowerBoundsMap") return prop.lowerBoundsMap; if (name == "reductions") return prop.reductions; if (name == "steps") return prop.steps; if (name == "upperBoundsGroups") return prop.upperBoundsGroups; if (name == "upperBoundsMap") return prop.upperBoundsMap; return std::nullopt; } void AffineParallelOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "lowerBoundsGroups") { prop.lowerBoundsGroups = ::llvm::dyn_cast_or_null>(value); return; } if (name == "lowerBoundsMap") { prop.lowerBoundsMap = ::llvm::dyn_cast_or_null>(value); return; } if (name == "reductions") { prop.reductions = ::llvm::dyn_cast_or_null>(value); return; } if (name == "steps") { prop.steps = ::llvm::dyn_cast_or_null>(value); return; } if (name == "upperBoundsGroups") { prop.upperBoundsGroups = ::llvm::dyn_cast_or_null>(value); return; } if (name == "upperBoundsMap") { prop.upperBoundsMap = ::llvm::dyn_cast_or_null>(value); return; } } void AffineParallelOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.lowerBoundsGroups) attrs.append("lowerBoundsGroups", prop.lowerBoundsGroups); if (prop.lowerBoundsMap) attrs.append("lowerBoundsMap", prop.lowerBoundsMap); if (prop.reductions) attrs.append("reductions", prop.reductions); if (prop.steps) attrs.append("steps", prop.steps); if (prop.upperBoundsGroups) attrs.append("upperBoundsGroups", prop.upperBoundsGroups); if (prop.upperBoundsMap) attrs.append("upperBoundsMap", prop.upperBoundsMap); } ::llvm::LogicalResult AffineParallelOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getLowerBoundsGroupsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps6(attr, "lowerBoundsGroups", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getLowerBoundsMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "lowerBoundsMap", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getReductionsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps5(attr, "reductions", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getStepsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps7(attr, "steps", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getUpperBoundsGroupsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps6(attr, "upperBoundsGroups", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getUpperBoundsMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "upperBoundsMap", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineParallelOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.lowerBoundsGroups))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.lowerBoundsMap))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.reductions))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.steps))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.upperBoundsGroups))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.upperBoundsMap))) return ::mlir::failure(); return ::mlir::success(); } void AffineParallelOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.lowerBoundsGroups); writer.writeAttribute(prop.lowerBoundsMap); writer.writeAttribute(prop.reductions); writer.writeAttribute(prop.steps); writer.writeAttribute(prop.upperBoundsGroups); writer.writeAttribute(prop.upperBoundsMap); } ::mlir::ArrayAttr AffineParallelOp::getReductions() { auto attr = getReductionsAttr(); return attr; } ::mlir::AffineMap AffineParallelOp::getLowerBoundsMap() { auto attr = getLowerBoundsMapAttr(); return attr.getValue(); } ::mlir::DenseIntElementsAttr AffineParallelOp::getLowerBoundsGroups() { auto attr = getLowerBoundsGroupsAttr(); return attr; } ::mlir::AffineMap AffineParallelOp::getUpperBoundsMap() { auto attr = getUpperBoundsMapAttr(); return attr.getValue(); } ::mlir::DenseIntElementsAttr AffineParallelOp::getUpperBoundsGroups() { auto attr = getUpperBoundsGroupsAttr(); return attr; } ::llvm::SmallVector AffineParallelOp::getSteps() { auto attr = getStepsAttr(); return llvm::to_vector<4>( llvm::map_range(attr.getAsRange(), [](mlir::IntegerAttr attr) { return attr.getInt(); }));; } void AffineParallelOp::setLowerBoundsMap(::mlir::AffineMap attrValue) { getProperties().lowerBoundsMap = ::mlir::AffineMapAttr::get(attrValue); } void AffineParallelOp::setUpperBoundsMap(::mlir::AffineMap attrValue) { getProperties().upperBoundsMap = ::mlir::AffineMapAttr::get(attrValue); } void AffineParallelOp::setSteps(::llvm::SmallVector attrValue) { getProperties().steps = ::mlir::Builder((*this)->getContext()).getI64ArrayAttr(attrValue); } AffineParallelOp AffineParallelOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTypes, ArrayRef reductions, ArrayRef ranges) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(reductions), std::forward(ranges)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTypes, ArrayRef reductions, ArrayRef ranges) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(reductions), std::forward(ranges)); } AffineParallelOp AffineParallelOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, TypeRange resultTypes, ArrayRef reductions, ArrayRef lbMaps, ValueRange lbArgs, ArrayRef ubMaps, ValueRange ubArgs, ArrayRef steps) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(reductions), std::forward(lbMaps), std::forward(lbArgs), std::forward(ubMaps), std::forward(ubArgs), std::forward(steps)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::create(::mlir::ImplicitLocOpBuilder &builder, TypeRange resultTypes, ArrayRef reductions, ArrayRef lbMaps, ValueRange lbArgs, ArrayRef ubMaps, ValueRange ubArgs, ArrayRef steps) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(reductions), std::forward(lbMaps), std::forward(lbArgs), std::forward(ubMaps), std::forward(ubArgs), std::forward(steps)); } void AffineParallelOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMapAttr lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMapAttr upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::mlir::ArrayAttr steps, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().reductions = reductions; odsState.getOrAddProperties().lowerBoundsMap = lowerBoundsMap; odsState.getOrAddProperties().lowerBoundsGroups = lowerBoundsGroups; odsState.getOrAddProperties().upperBoundsMap = upperBoundsMap; odsState.getOrAddProperties().upperBoundsGroups = upperBoundsGroups; odsState.getOrAddProperties().steps = steps; (void)odsState.addRegion(); odsState.addTypes(results); } AffineParallelOp AffineParallelOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMapAttr lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMapAttr upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::mlir::ArrayAttr steps, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(results), std::forward(reductions), std::forward(lowerBoundsMap), std::forward(lowerBoundsGroups), std::forward(upperBoundsMap), std::forward(upperBoundsGroups), std::forward(steps), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMapAttr lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMapAttr upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::mlir::ArrayAttr steps, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(results), std::forward(reductions), std::forward(lowerBoundsMap), std::forward(lowerBoundsGroups), std::forward(upperBoundsMap), std::forward(upperBoundsGroups), std::forward(steps), std::forward(mapOperands)); } void AffineParallelOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMap lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMap upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::llvm::SmallVector steps, ::mlir::ValueRange mapOperands) { odsState.addOperands(mapOperands); odsState.getOrAddProperties().reductions = reductions; odsState.getOrAddProperties().lowerBoundsMap = ::mlir::AffineMapAttr::get(lowerBoundsMap); odsState.getOrAddProperties().lowerBoundsGroups = lowerBoundsGroups; odsState.getOrAddProperties().upperBoundsMap = ::mlir::AffineMapAttr::get(upperBoundsMap); odsState.getOrAddProperties().upperBoundsGroups = upperBoundsGroups; odsState.getOrAddProperties().steps = odsBuilder.getI64ArrayAttr(steps); (void)odsState.addRegion(); odsState.addTypes(results); } AffineParallelOp AffineParallelOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMap lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMap upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::llvm::SmallVector steps, ::mlir::ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(results), std::forward(reductions), std::forward(lowerBoundsMap), std::forward(lowerBoundsGroups), std::forward(upperBoundsMap), std::forward(upperBoundsGroups), std::forward(steps), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange results, ::mlir::ArrayAttr reductions, ::mlir::AffineMap lowerBoundsMap, ::mlir::DenseIntElementsAttr lowerBoundsGroups, ::mlir::AffineMap upperBoundsMap, ::mlir::DenseIntElementsAttr upperBoundsGroups, ::llvm::SmallVector steps, ::mlir::ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(results), std::forward(reductions), std::forward(lowerBoundsMap), std::forward(lowerBoundsGroups), std::forward(upperBoundsMap), std::forward(upperBoundsGroups), std::forward(steps), std::forward(mapOperands)); } void AffineParallelOp::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(); ::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."); } } AffineParallelOp AffineParallelOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineParallelOp::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)); odsState.addAttributes(discardableAttributes); for (unsigned i = 0; i != 1; ++i) (void)odsState.addRegion(); odsState.addTypes(resultTypes); } AffineParallelOp AffineParallelOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineParallelOp AffineParallelOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineParallelOp::verifyInvariantsImpl() { auto tblgen_lowerBoundsGroups = getProperties().lowerBoundsGroups; (void)tblgen_lowerBoundsGroups; if (!tblgen_lowerBoundsGroups) return emitOpError("requires attribute 'lowerBoundsGroups'"); auto tblgen_lowerBoundsMap = getProperties().lowerBoundsMap; (void)tblgen_lowerBoundsMap; if (!tblgen_lowerBoundsMap) return emitOpError("requires attribute 'lowerBoundsMap'"); auto tblgen_reductions = getProperties().reductions; (void)tblgen_reductions; if (!tblgen_reductions) return emitOpError("requires attribute 'reductions'"); auto tblgen_steps = getProperties().steps; (void)tblgen_steps; if (!tblgen_steps) return emitOpError("requires attribute 'steps'"); auto tblgen_upperBoundsGroups = getProperties().upperBoundsGroups; (void)tblgen_upperBoundsGroups; if (!tblgen_upperBoundsGroups) return emitOpError("requires attribute 'upperBoundsGroups'"); auto tblgen_upperBoundsMap = getProperties().upperBoundsMap; (void)tblgen_upperBoundsMap; if (!tblgen_upperBoundsMap) return emitOpError("requires attribute 'upperBoundsMap'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps5(*this, tblgen_reductions, "reductions"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_lowerBoundsMap, "lowerBoundsMap"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps6(*this, tblgen_lowerBoundsGroups, "lowerBoundsGroups"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_upperBoundsMap, "upperBoundsMap"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps6(*this, tblgen_upperBoundsGroups, "upperBoundsGroups"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps7(*this, tblgen_steps, "steps"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps5(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } { unsigned index = 0; (void)index; for (auto ®ion : ::llvm::MutableArrayRef((*this)->getRegion(0))) if (::mlir::failed(__mlir_ods_local_region_constraint_AffineOps1(*this, region, "region", index++))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineParallelOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineParallelOp::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.reductions; auto reductionsAttrName = ::mlir::StringAttr::get(ctx, "reductions"); auto attr = dict.get(reductionsAttrName); usedKeys.insert(reductionsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for reductions in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `reductions` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.lowerBoundsMap; auto lowerBoundsMapAttrName = ::mlir::StringAttr::get(ctx, "lowerBoundsMap"); auto attr = dict.get(lowerBoundsMapAttrName); usedKeys.insert(lowerBoundsMapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for lowerBoundsMap in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundsMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.lowerBoundsGroups; auto lowerBoundsGroupsAttrName = ::mlir::StringAttr::get(ctx, "lowerBoundsGroups"); auto attr = dict.get(lowerBoundsGroupsAttrName); usedKeys.insert(lowerBoundsGroupsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for lowerBoundsGroups in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `lowerBoundsGroups` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundsMap; auto upperBoundsMapAttrName = ::mlir::StringAttr::get(ctx, "upperBoundsMap"); auto attr = dict.get(upperBoundsMapAttrName); usedKeys.insert(upperBoundsMapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for upperBoundsMap in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundsMap` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.upperBoundsGroups; auto upperBoundsGroupsAttrName = ::mlir::StringAttr::get(ctx, "upperBoundsGroups"); auto attr = dict.get(upperBoundsGroupsAttrName); usedKeys.insert(upperBoundsGroupsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for upperBoundsGroups in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `upperBoundsGroups` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.steps; auto stepsAttrName = ::mlir::StringAttr::get(ctx, "steps"); auto attr = dict.get(stepsAttrName); usedKeys.insert(stepsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for steps in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `steps` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineParallelOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineParallelOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffinePrefetchOp definitions //===----------------------------------------------------------------------===// namespace detail { AffinePrefetchOpGenericAdaptorBase::AffinePrefetchOpGenericAdaptorBase(AffinePrefetchOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffinePrefetchOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, 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 - 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}; } bool AffinePrefetchOpGenericAdaptorBase::getIsWrite() { auto attr = getIsWriteAttr(); return attr.getValue(); } uint32_t AffinePrefetchOpGenericAdaptorBase::getLocalityHint() { auto attr = getLocalityHintAttr(); return attr.getValue().getZExtValue(); } bool AffinePrefetchOpGenericAdaptorBase::getIsDataCache() { auto attr = getIsDataCacheAttr(); return attr.getValue(); } ::mlir::AffineMap AffinePrefetchOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffinePrefetchOpAdaptor::AffinePrefetchOpAdaptor(AffinePrefetchOp op) : AffinePrefetchOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffinePrefetchOpAdaptor::verify(::mlir::Location loc) { auto tblgen_isDataCache = getProperties().isDataCache; (void)tblgen_isDataCache; if (!tblgen_isDataCache) return emitError(loc, "'affine.prefetch' op requires attribute 'isDataCache'"); auto tblgen_isWrite = getProperties().isWrite; (void)tblgen_isWrite; if (!tblgen_isWrite) return emitError(loc, "'affine.prefetch' op requires attribute 'isWrite'"); auto tblgen_localityHint = getProperties().localityHint; (void)tblgen_localityHint; if (!tblgen_localityHint) return emitError(loc, "'affine.prefetch' op requires attribute 'localityHint'"); auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.prefetch' op requires attribute 'map'"); if (tblgen_isWrite && !((::llvm::isa<::mlir::BoolAttr>(tblgen_isWrite)))) return emitError(loc, "'affine.prefetch' op attribute 'isWrite' failed to satisfy constraint: bool attribute"); if (tblgen_localityHint && !((((::llvm::isa<::mlir::IntegerAttr>(tblgen_localityHint))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_localityHint).getType().isSignlessInteger(32)))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_localityHint).getInt() >= 0)) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_localityHint).getInt() <= 3)))) return emitError(loc, "'affine.prefetch' op attribute 'localityHint' failed to satisfy constraint: 32-bit signless integer attribute whose minimum value is 0 whose maximum value is 3"); if (tblgen_isDataCache && !((::llvm::isa<::mlir::BoolAttr>(tblgen_isDataCache)))) return emitError(loc, "'affine.prefetch' op attribute 'isDataCache' failed to satisfy constraint: bool attribute"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.prefetch' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffinePrefetchOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, 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() - 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 AffinePrefetchOp::getIndicesMutable() { auto range = getODSOperandIndexAndLength(1); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffinePrefetchOp::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.isDataCache; auto attr = dict.get("isDataCache"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `isDataCache` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.isWrite; auto attr = dict.get("isWrite"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `isWrite` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.localityHint; auto attr = dict.get("localityHint"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `localityHint` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffinePrefetchOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.isDataCache; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("isDataCache", propStorage)); } { const auto &propStorage = prop.isWrite; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("isWrite", propStorage)); } { const auto &propStorage = prop.localityHint; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("localityHint", propStorage)); } { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffinePrefetchOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.isDataCache.getAsOpaquePointer()), llvm::hash_value(prop.isWrite.getAsOpaquePointer()), llvm::hash_value(prop.localityHint.getAsOpaquePointer()), llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffinePrefetchOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "isDataCache") return prop.isDataCache; if (name == "isWrite") return prop.isWrite; if (name == "localityHint") return prop.localityHint; if (name == "map") return prop.map; return std::nullopt; } void AffinePrefetchOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "isDataCache") { prop.isDataCache = ::llvm::dyn_cast_or_null>(value); return; } if (name == "isWrite") { prop.isWrite = ::llvm::dyn_cast_or_null>(value); return; } if (name == "localityHint") { prop.localityHint = ::llvm::dyn_cast_or_null>(value); return; } if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffinePrefetchOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.isDataCache) attrs.append("isDataCache", prop.isDataCache); if (prop.isWrite) attrs.append("isWrite", prop.isWrite); if (prop.localityHint) attrs.append("localityHint", prop.localityHint); if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffinePrefetchOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getIsDataCacheAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps8(attr, "isDataCache", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getIsWriteAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps8(attr, "isWrite", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getLocalityHintAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps9(attr, "localityHint", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffinePrefetchOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.isDataCache))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.isWrite))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.localityHint))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffinePrefetchOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.isDataCache); writer.writeAttribute(prop.isWrite); writer.writeAttribute(prop.localityHint); writer.writeAttribute(prop.map); } bool AffinePrefetchOp::getIsWrite() { auto attr = getIsWriteAttr(); return attr.getValue(); } uint32_t AffinePrefetchOp::getLocalityHint() { auto attr = getLocalityHintAttr(); return attr.getValue().getZExtValue(); } bool AffinePrefetchOp::getIsDataCache() { auto attr = getIsDataCacheAttr(); return attr.getValue(); } ::mlir::AffineMap AffinePrefetchOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffinePrefetchOp::setIsWrite(bool attrValue) { getProperties().isWrite = ::mlir::Builder((*this)->getContext()).getBoolAttr(attrValue); } void AffinePrefetchOp::setLocalityHint(uint32_t attrValue) { getProperties().localityHint = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void AffinePrefetchOp::setIsDataCache(bool attrValue) { getProperties().isDataCache = ::mlir::Builder((*this)->getContext()).getBoolAttr(attrValue); } void AffinePrefetchOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } void AffinePrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, Value memref, AffineMap map, ArrayRef mapOperands, bool isWrite, unsigned localityHint, bool isDataCache) { assert(map.getNumInputs() == mapOperands.size() && "inconsistent index info"); auto localityHintAttr = odsBuilder.getI32IntegerAttr(localityHint); auto isWriteAttr = odsBuilder.getBoolAttr(isWrite); auto isDataCacheAttr = odsBuilder.getBoolAttr(isDataCache); odsState.addOperands(memref); odsState.addOperands(mapOperands); Properties &prop = odsState.getOrAddProperties(); prop.map = AffineMapAttr::get(map); prop.localityHint = localityHintAttr; prop.isWrite = isWriteAttr; prop.isDataCache = isDataCacheAttr; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value memref, AffineMap map, ArrayRef mapOperands, bool isWrite, unsigned localityHint, bool isDataCache) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(memref), std::forward(map), std::forward(mapOperands), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, Value memref, AffineMap map, ArrayRef mapOperands, bool isWrite, unsigned localityHint, bool isDataCache) { return create(builder, builder.getLoc(), std::forward(memref), std::forward(map), std::forward(mapOperands), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache)); } void AffinePrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().isWrite = isWrite; odsState.getOrAddProperties().localityHint = localityHint; odsState.getOrAddProperties().isDataCache = isDataCache; odsState.getOrAddProperties().map = map; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); } void AffinePrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().isWrite = isWrite; odsState.getOrAddProperties().localityHint = localityHint; odsState.getOrAddProperties().isDataCache = isDataCache; odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffinePrefetchOp AffinePrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::BoolAttr isWrite, ::mlir::IntegerAttr localityHint, ::mlir::BoolAttr isDataCache, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); } void AffinePrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().isWrite = odsBuilder.getBoolAttr(isWrite); odsState.getOrAddProperties().localityHint = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), localityHint); odsState.getOrAddProperties().isDataCache = odsBuilder.getBoolAttr(isDataCache); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); } AffinePrefetchOp AffinePrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); } void AffinePrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().isWrite = odsBuilder.getBoolAttr(isWrite); odsState.getOrAddProperties().localityHint = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), localityHint); odsState.getOrAddProperties().isDataCache = odsBuilder.getBoolAttr(isDataCache); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffinePrefetchOp AffinePrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, bool isWrite, uint32_t localityHint, bool isDataCache, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(isWrite), std::forward(localityHint), std::forward(isDataCache), std::forward(map)); } void AffinePrefetchOp::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); assert(resultTypes.size() == 0u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffinePrefetchOp AffinePrefetchOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffinePrefetchOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 0u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffinePrefetchOp AffinePrefetchOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffinePrefetchOp AffinePrefetchOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffinePrefetchOp::verifyInvariantsImpl() { auto tblgen_isDataCache = getProperties().isDataCache; (void)tblgen_isDataCache; if (!tblgen_isDataCache) return emitOpError("requires attribute 'isDataCache'"); auto tblgen_isWrite = getProperties().isWrite; (void)tblgen_isWrite; if (!tblgen_isWrite) return emitOpError("requires attribute 'isWrite'"); auto tblgen_localityHint = getProperties().localityHint; (void)tblgen_localityHint; if (!tblgen_localityHint) return emitOpError("requires attribute 'localityHint'"); auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps8(*this, tblgen_isWrite, "isWrite"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps9(*this, tblgen_localityHint, "localityHint"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps8(*this, tblgen_isDataCache, "isDataCache"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps6(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffinePrefetchOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffinePrefetchOp::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.isWrite; auto isWriteAttrName = ::mlir::StringAttr::get(ctx, "isWrite"); auto attr = dict.get(isWriteAttrName); usedKeys.insert(isWriteAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for isWrite in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `isWrite` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.localityHint; auto localityHintAttrName = ::mlir::StringAttr::get(ctx, "localityHint"); auto attr = dict.get(localityHintAttrName); usedKeys.insert(localityHintAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for localityHint in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `localityHint` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.isDataCache; auto isDataCacheAttrName = ::mlir::StringAttr::get(ctx, "isDataCache"); auto attr = dict.get(isDataCacheAttrName); usedKeys.insert(isDataCacheAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for isDataCache in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `isDataCache` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffinePrefetchOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffinePrefetchOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineStoreOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineStoreOpGenericAdaptorBase::AffineStoreOpGenericAdaptorBase(AffineStoreOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineStoreOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, false, 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 - 2) / 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::AffineMap AffineStoreOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineStoreOpAdaptor::AffineStoreOpAdaptor(AffineStoreOp op) : AffineStoreOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineStoreOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.store' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.store' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineStoreOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, false, 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() - 2) / 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 AffineStoreOp::getIndicesMutable() { auto range = getODSOperandIndexAndLength(2); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineStoreOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineStoreOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineStoreOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineStoreOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineStoreOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineStoreOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineStoreOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineStoreOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineStoreOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineStoreOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineStoreOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } AffineStoreOp AffineStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value valueToStore, Value memref, ValueRange indices) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(valueToStore), std::forward(memref), std::forward(indices)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineStoreOp AffineStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, Value valueToStore, Value memref, ValueRange indices) { return create(builder, builder.getLoc(), std::forward(valueToStore), std::forward(memref), std::forward(indices)); } AffineStoreOp AffineStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value valueToStore, Value memref, AffineMap map, ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(valueToStore), std::forward(memref), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineStoreOp AffineStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, Value valueToStore, Value memref, AffineMap map, ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(valueToStore), std::forward(memref), std::forward(map), std::forward(mapOperands)); } ::llvm::LogicalResult AffineStoreOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps7(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps6(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineStoreOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineStoreOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineStoreOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { { auto valueRange = getODSOperandIndexAndLength(1); for (unsigned idx = valueRange.first; idx < valueRange.first + valueRange.second; idx++) { effects.emplace_back(::mlir::MemoryEffects::Write::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineStoreOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineStoreOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineVectorLoadOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineVectorLoadOpGenericAdaptorBase::AffineVectorLoadOpGenericAdaptorBase(AffineVectorLoadOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineVectorLoadOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, 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 - 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::AffineMap AffineVectorLoadOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineVectorLoadOpAdaptor::AffineVectorLoadOpAdaptor(AffineVectorLoadOp op) : AffineVectorLoadOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineVectorLoadOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.vector_load' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.vector_load' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineVectorLoadOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, 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() - 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 AffineVectorLoadOp::getIndicesMutable() { auto range = getODSOperandIndexAndLength(1); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineVectorLoadOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineVectorLoadOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineVectorLoadOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineVectorLoadOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineVectorLoadOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineVectorLoadOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineVectorLoadOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineVectorLoadOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineVectorLoadOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineVectorLoadOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineVectorLoadOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, VectorType resultType, AffineMap map, ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType), std::forward(map), std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, VectorType resultType, AffineMap map, ValueRange operands) { return create(builder, builder.getLoc(), std::forward(resultType), std::forward(map), std::forward(operands)); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, VectorType resultType, Value memref, ValueRange indices) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType), std::forward(memref), std::forward(indices)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, VectorType resultType, Value memref, ValueRange indices) { return create(builder, builder.getLoc(), std::forward(resultType), std::forward(memref), std::forward(indices)); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, VectorType resultType, Value memref, AffineMap map, ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultType), std::forward(memref), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, VectorType resultType, Value memref, AffineMap map, ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(resultType), std::forward(memref), std::forward(map), std::forward(mapOperands)); } void AffineVectorLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = map; odsState.addTypes(result); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineVectorLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = map; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMapAttr map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineVectorLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); odsState.addTypes(result); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type result, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(result), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineVectorLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { odsState.addOperands(memref); odsState.addOperands(indices); odsState.getOrAddProperties().map = ::mlir::AffineMapAttr::get(map); assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value memref, ::mlir::ValueRange indices, ::mlir::AffineMap map) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(memref), std::forward(indices), std::forward(map)); } void AffineVectorLoadOp::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); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); if (!attributes.empty()) { (void)odsState.getOrAddProperties(); ::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."); } } AffineVectorLoadOp AffineVectorLoadOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineVectorLoadOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 1u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineVectorLoadOp AffineVectorLoadOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorLoadOp AffineVectorLoadOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineVectorLoadOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps6(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*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_AffineOps8(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineVectorLoadOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineVectorLoadOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineVectorLoadOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { { auto valueRange = getODSOperandIndexAndLength(0); for (unsigned idx = valueRange.first; idx < valueRange.first + valueRange.second; idx++) { effects.emplace_back(::mlir::MemoryEffects::Read::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineVectorLoadOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineVectorLoadOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineVectorStoreOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineVectorStoreOpGenericAdaptorBase::AffineVectorStoreOpGenericAdaptorBase(AffineVectorStoreOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineVectorStoreOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, false, 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 - 2) / 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::AffineMap AffineVectorStoreOpGenericAdaptorBase::getMap() { auto attr = getMapAttr(); return attr.getValue(); } } // namespace detail AffineVectorStoreOpAdaptor::AffineVectorStoreOpAdaptor(AffineVectorStoreOp op) : AffineVectorStoreOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineVectorStoreOpAdaptor::verify(::mlir::Location loc) { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitError(loc, "'affine.vector_store' op requires attribute 'map'"); if (tblgen_map && !((::llvm::isa<::mlir::AffineMapAttr>(tblgen_map)))) return emitError(loc, "'affine.vector_store' op attribute 'map' failed to satisfy constraint: AffineMap attribute"); return ::mlir::success(); } std::pair AffineVectorStoreOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, false, 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() - 2) / 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 AffineVectorStoreOp::getIndicesMutable() { auto range = getODSOperandIndexAndLength(2); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineVectorStoreOp::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.map; auto attr = dict.get("map"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute AffineVectorStoreOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.map; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("map", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code AffineVectorStoreOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.map.getAsOpaquePointer())); } std::optional AffineVectorStoreOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "map") return prop.map; return std::nullopt; } void AffineVectorStoreOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "map") { prop.map = ::llvm::dyn_cast_or_null>(value); return; } } void AffineVectorStoreOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.map) attrs.append("map", prop.map); } ::llvm::LogicalResult AffineVectorStoreOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getMapAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(attr, "map", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult AffineVectorStoreOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.map))) return ::mlir::failure(); return ::mlir::success(); } void AffineVectorStoreOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.map); } ::mlir::AffineMap AffineVectorStoreOp::getMap() { auto attr = getMapAttr(); return attr.getValue(); } void AffineVectorStoreOp::setMap(::mlir::AffineMap attrValue) { getProperties().map = ::mlir::AffineMapAttr::get(attrValue); } AffineVectorStoreOp AffineVectorStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value valueToStore, Value memref, ValueRange indices) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(valueToStore), std::forward(memref), std::forward(indices)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorStoreOp AffineVectorStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, Value valueToStore, Value memref, ValueRange indices) { return create(builder, builder.getLoc(), std::forward(valueToStore), std::forward(memref), std::forward(indices)); } AffineVectorStoreOp AffineVectorStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, Value valueToStore, Value memref, AffineMap map, ValueRange mapOperands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(valueToStore), std::forward(memref), std::forward(map), std::forward(mapOperands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineVectorStoreOp AffineVectorStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, Value valueToStore, Value memref, AffineMap map, ValueRange mapOperands) { return create(builder, builder.getLoc(), std::forward(valueToStore), std::forward(memref), std::forward(map), std::forward(mapOperands)); } ::llvm::LogicalResult AffineVectorStoreOp::verifyInvariantsImpl() { auto tblgen_map = getProperties().map; (void)tblgen_map; if (!tblgen_map) return emitOpError("requires attribute 'map'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_AffineOps1(*this, tblgen_map, "map"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps8(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps6(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineVectorStoreOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::llvm::LogicalResult AffineVectorStoreOp::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.map; auto mapAttrName = ::mlir::StringAttr::get(ctx, "map"); auto attr = dict.get(mapAttrName); usedKeys.insert(mapAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for map in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `map` 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(); } void AffineVectorStoreOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { { auto valueRange = getODSOperandIndexAndLength(1); for (unsigned idx = valueRange.first; idx < valueRange.first + valueRange.second; idx++) { effects.emplace_back(::mlir::MemoryEffects::Write::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineVectorStoreOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::detail::AffineVectorStoreOpGenericAdaptorBase::Properties) namespace mlir::affine { //===----------------------------------------------------------------------===// // ::mlir::affine::AffineYieldOp definitions //===----------------------------------------------------------------------===// namespace detail { AffineYieldOpGenericAdaptorBase::AffineYieldOpGenericAdaptorBase(AffineYieldOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair AffineYieldOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { 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 = (odsOperandsSize - 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}; } } // namespace detail AffineYieldOpAdaptor::AffineYieldOpAdaptor(AffineYieldOp op) : AffineYieldOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult AffineYieldOpAdaptor::verify(::mlir::Location loc) { return ::mlir::success(); } std::pair AffineYieldOp::getODSOperandIndexAndLength(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()->getNumOperands() - 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}; } ::mlir::MutableOperandRange AffineYieldOp::getOperandsMutable() { auto range = getODSOperandIndexAndLength(0); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult AffineYieldOp::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 AffineYieldOp::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 AffineYieldOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine(); } std::optional AffineYieldOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { return std::nullopt; } void AffineYieldOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { } void AffineYieldOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { } ::llvm::LogicalResult AffineYieldOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { return ::mlir::success(); } void AffineYieldOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState) { build(odsBuilder, odsState, {}); } AffineYieldOp AffineYieldOp::create(::mlir::OpBuilder &builder, ::mlir::Location location) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineYieldOp AffineYieldOp::create(::mlir::ImplicitLocOpBuilder &builder) { return create(builder, builder.getLoc()); } void AffineYieldOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange operands) { odsState.addOperands(operands); } AffineYieldOp AffineYieldOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::ValueRange operands) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(operands)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineYieldOp AffineYieldOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::ValueRange operands) { return create(builder, builder.getLoc(), std::forward(operands)); } void AffineYieldOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { odsState.addOperands(operands); odsState.addAttributes(attributes); assert(resultTypes.size() == 0u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineYieldOp AffineYieldOp::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(resultTypes), std::forward(operands), std::forward(attributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineYieldOp AffineYieldOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(operands), std::forward(attributes)); } void AffineYieldOp::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)); odsState.addAttributes(discardableAttributes); assert(resultTypes.size() == 0u && "mismatched number of return types"); odsState.addTypes(resultTypes); } AffineYieldOp AffineYieldOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } AffineYieldOp AffineYieldOp::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(resultTypes), std::forward(operands), std::forward(properties), std::forward(discardableAttributes)); } ::llvm::LogicalResult AffineYieldOp::verifyInvariantsImpl() { { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_AffineOps5(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult AffineYieldOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult AffineYieldOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> operandsOperands; ::llvm::SMLoc operandsOperandsLoc; (void)operandsOperandsLoc; ::llvm::SmallVector<::mlir::Type, 1> operandsTypes; { auto loc = parser.getCurrentLocation();(void)loc; if (parser.parseOptionalAttrDict(result.attributes)) return ::mlir::failure(); if (failed(verifyInherentAttrs(result.name, result.attributes, [&]() { return parser.emitError(loc) << "'" << result.name.getStringRef() << "' op "; }))) return ::mlir::failure(); } operandsOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperandList(operandsOperands)) return ::mlir::failure(); if (!operandsOperands.empty()) { if (parser.parseColon()) return ::mlir::failure(); if (parser.parseTypeList(operandsTypes)) return ::mlir::failure(); } if (parser.resolveOperands(operandsOperands, operandsTypes, operandsOperandsLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } void AffineYieldOp::print(::mlir::OpAsmPrinter &_odsPrinter) { ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); if (!getOperands().empty()) { _odsPrinter << ' '; _odsPrinter << getOperands(); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter << getOperands().getTypes(); } } void AffineYieldOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) { } } // namespace mlir::affine MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::affine::AffineYieldOp) #endif // GET_OP_CLASSES