/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* Op Definitions *| |* *| |* Automatically generated file, do not edit! *| |* From: XeVMOps.td *| |* *| \*===----------------------------------------------------------------------===*/ #ifdef GET_OP_LIST #undef GET_OP_LIST ::mlir::xevm::BlockLoad2dOp, ::mlir::xevm::BlockLoadOp, ::mlir::xevm::BlockPrefetch2dOp, ::mlir::xevm::BlockStore2dOp, ::mlir::xevm::BlockStoreOp, ::mlir::xevm::ExtfOp, ::mlir::xevm::GridDimXOp, ::mlir::xevm::GridDimYOp, ::mlir::xevm::GridDimZOp, ::mlir::xevm::LaneIdOp, ::mlir::xevm::MMAMxOp, ::mlir::xevm::MMAOp, ::mlir::xevm::MemfenceOp, ::mlir::xevm::PrefetchOp, ::mlir::xevm::SubgroupIdOp, ::mlir::xevm::SubgroupSizeOp, ::mlir::xevm::TruncfOp, ::mlir::xevm::WorkgroupDimXOp, ::mlir::xevm::WorkgroupDimYOp, ::mlir::xevm::WorkgroupDimZOp, ::mlir::xevm::WorkgroupIdXOp, ::mlir::xevm::WorkgroupIdYOp, ::mlir::xevm::WorkgroupIdZOp, ::mlir::xevm::WorkitemIdXOp, ::mlir::xevm::WorkitemIdYOp, ::mlir::xevm::WorkitemIdZOp #endif // GET_OP_LIST #ifdef GET_OP_CLASSES #undef GET_OP_CLASSES //===----------------------------------------------------------------------===// // Local Utility Method Definitions //===----------------------------------------------------------------------===// static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps1( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((::llvm::isa<::mlir::LLVM::LLVMPointerType>(type)))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be LLVM pointer type, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps2( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((type.isSignlessInteger(32)))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be 32-bit signless integer, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps3( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((((::llvm::isa<::mlir::FixedVectorType>(type))) && ([](::mlir::Type elementType) { return ((elementType.isInteger(8))) || ((elementType.isInteger(16))) || ((elementType.isInteger(32))) || ((elementType.isF32())) || ((::llvm::isa<::mlir::FloatTF32Type>(elementType))) || ((elementType.isF16())) || ((::llvm::isa<::mlir::BFloat16Type>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) && ((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() == 1))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be fixed-length vector of 8-bit integer or 16-bit integer or 32-bit integer or 32-bit float or tf32 type or 16-bit float or bfloat16 type values of ranks 1, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps4( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((((type.isSignlessInteger(8))) || ((type.isSignlessInteger(16))) || ((type.isSignlessInteger(32))) || ((type.isSignlessInteger(64)))) || ((((::llvm::isa<::mlir::FixedVectorType>(type))) && ([](::mlir::Type elementType) { return ((elementType.isSignlessInteger(8))) || ((elementType.isSignlessInteger(16))) || ((elementType.isSignlessInteger(32))) || ((elementType.isSignlessInteger(64))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) && ((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() == 1)))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be 8-bit signless integer or 16-bit signless integer or 32-bit signless integer or 64-bit signless integer or fixed-length vector of 8-bit signless integer or 16-bit signless integer or 32-bit signless integer or 64-bit signless integer values of ranks 1, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps5( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((((::llvm::isa<::mlir::FixedVectorType>(type))) && ([](::mlir::Type elementType) { return ((elementType.isSignlessInteger(8))) || ((elementType.isSignlessInteger(4))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) && ((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() == 1)))) || ((type.isSignlessInteger(8))) || ((type.isSignlessInteger(4))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be fixed-length vector of 8-bit signless integer or 4-bit signless integer values of ranks 1 or 8-bit signless integer or 4-bit signless integer, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps6( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((((::llvm::isa<::mlir::FixedVectorType>(type))) && ([](::mlir::Type elementType) { return ((elementType.isF16())) || ((::llvm::isa<::mlir::BFloat16Type>(elementType))); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) && ((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() == 1)))) || ((type.isF16())) || ((::llvm::isa<::mlir::BFloat16Type>(type))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be fixed-length vector of 16-bit float or bfloat16 type values of ranks 1 or 16-bit float or bfloat16 type, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps7( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((type.isSignlessInteger(32))) || ((type.isSignlessInteger(64))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be 32-bit signless integer or 64-bit signless integer, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps8( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!(((((::llvm::isa<::mlir::FixedVectorType>(type))) && ([](::mlir::Type elementType) { return (elementType.isSignlessInteger(8)); }(::llvm::cast<::mlir::ShapedType>(type).getElementType()))) && ((((::llvm::isa<::mlir::VectorType>(type))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() > 0))) && ((::llvm::cast<::mlir::VectorType>(type).getRank() == 1)))) || ((type.isSignlessInteger(8))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be fixed-length vector of 8-bit signless integer values of ranks 1 or 8-bit signless integer, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_type_constraint_XeVMOps9( ::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind, unsigned valueIndex) { if (!((((::llvm::isa<::mlir::LLVM::LLVMPointerType>(type))) && ((::llvm::cast<::mlir::LLVM::LLVMPointerType>(type).getAddressSpace() == 1))) || (((::llvm::isa<::mlir::LLVM::LLVMPointerType>(type))) && ((::llvm::cast<::mlir::LLVM::LLVMPointerType>(type).getAddressSpace() == 4))))) { return op->emitOpError(valueKind) << " #" << valueIndex << " must be LLVM pointer in address space 1 or LLVM pointer in address space 4, but got " << type; } return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps1( ::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))))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: 32-bit signless integer attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps1( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps1(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps2( ::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(1))))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: 1-bit signless integer attribute"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps2( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps2(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps3( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::LoadCacheControlAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: Describe the cache settings for load operators"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps3( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps3(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps4( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::StoreCacheControlAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: Describe the cache settings for store operators"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps4( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps4(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps5( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::ExtfSrcElemTypeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps5( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps5(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps6( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::ExtfDstElemTypeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps6( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps6(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps7( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps7( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps7(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps8( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::MMAShapeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps8( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps8(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps9( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::MMATypesAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps9( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps9(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps10( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::MemScopeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: Describe memory scopes"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps10( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps10(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps11( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::AddrSpaceAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: Describe address spaces"; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps11( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps11(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps12( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::TruncfSrcElemTypeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps12( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps12(attr, attrName, [op]() { return op->emitOpError(); }); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps13( ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { if (attr && !((::llvm::isa<::mlir::xevm::TruncfDstElemTypeAttr>(attr)))) return emitError() << "attribute '" << attrName << "' failed to satisfy constraint: "; return ::mlir::success(); } static ::llvm::LogicalResult __mlir_ods_local_attr_constraint_XeVMOps13( ::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) { return __mlir_ods_local_attr_constraint_XeVMOps13(attr, attrName, [op]() { return op->emitOpError(); }); } namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::BlockLoad2dOp definitions //===----------------------------------------------------------------------===// namespace detail { BlockLoad2dOpGenericAdaptorBase::BlockLoad2dOpGenericAdaptorBase(BlockLoad2dOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} uint32_t BlockLoad2dOpGenericAdaptorBase::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOpGenericAdaptorBase::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOpGenericAdaptorBase::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOpGenericAdaptorBase::getVBlocks() { auto attr = getVBlocksAttr(); return attr.getValue().getZExtValue(); } bool BlockLoad2dOpGenericAdaptorBase::getTranspose() { auto attr = getTransposeAttr(); return attr.getValue().getZExtValue(); } bool BlockLoad2dOpGenericAdaptorBase::getPackRegister() { auto attr = getPackRegisterAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::LoadCacheControl> BlockLoad2dOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail BlockLoad2dOpAdaptor::BlockLoad2dOpAdaptor(BlockLoad2dOp op) : BlockLoad2dOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult BlockLoad2dOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitError(loc, "'xevm.blockload2d' op requires attribute 'elem_size_in_bits'"); auto tblgen_pack_register = getProperties().pack_register; (void)tblgen_pack_register; if (!tblgen_pack_register) return emitError(loc, "'xevm.blockload2d' op requires attribute 'pack_register'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitError(loc, "'xevm.blockload2d' op requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitError(loc, "'xevm.blockload2d' op requires attribute 'tile_width'"); auto tblgen_transpose = getProperties().transpose; (void)tblgen_transpose; if (!tblgen_transpose) return emitError(loc, "'xevm.blockload2d' op requires attribute 'transpose'"); auto tblgen_v_blocks = getProperties().v_blocks; (void)tblgen_v_blocks; if (!tblgen_v_blocks) return emitError(loc, "'xevm.blockload2d' op requires attribute 'v_blocks'"); if (tblgen_elem_size_in_bits && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_elem_size_in_bits))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_elem_size_in_bits).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockload2d' op attribute 'elem_size_in_bits' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_width && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_width))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_width).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockload2d' op attribute 'tile_width' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_height && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_height))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_height).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockload2d' op attribute 'tile_height' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_v_blocks && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_v_blocks))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_v_blocks).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockload2d' op attribute 'v_blocks' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_transpose && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_transpose))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_transpose).getType().isSignlessInteger(1))))) return emitError(loc, "'xevm.blockload2d' op attribute 'transpose' failed to satisfy constraint: 1-bit signless integer attribute"); if (tblgen_pack_register && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_pack_register))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_pack_register).getType().isSignlessInteger(1))))) return emitError(loc, "'xevm.blockload2d' op attribute 'pack_register' failed to satisfy constraint: 1-bit signless integer attribute"); if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::LoadCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.blockload2d' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for load operators"); return ::mlir::success(); } ::llvm::LogicalResult BlockLoad2dOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.elem_size_in_bits; auto attr = dict.get("elem_size_in_bits"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.pack_register; auto attr = dict.get("pack_register"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `pack_register` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto attr = dict.get("tile_height"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto attr = dict.get("tile_width"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.transpose; auto attr = dict.get("transpose"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `transpose` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.v_blocks; auto attr = dict.get("v_blocks"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `v_blocks` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute BlockLoad2dOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } { const auto &propStorage = prop.elem_size_in_bits; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("elem_size_in_bits", propStorage)); } { const auto &propStorage = prop.pack_register; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("pack_register", propStorage)); } { const auto &propStorage = prop.tile_height; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_height", propStorage)); } { const auto &propStorage = prop.tile_width; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_width", propStorage)); } { const auto &propStorage = prop.transpose; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("transpose", propStorage)); } { const auto &propStorage = prop.v_blocks; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("v_blocks", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code BlockLoad2dOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer()), llvm::hash_value(prop.elem_size_in_bits.getAsOpaquePointer()), llvm::hash_value(prop.pack_register.getAsOpaquePointer()), llvm::hash_value(prop.tile_height.getAsOpaquePointer()), llvm::hash_value(prop.tile_width.getAsOpaquePointer()), llvm::hash_value(prop.transpose.getAsOpaquePointer()), llvm::hash_value(prop.v_blocks.getAsOpaquePointer())); } std::optional BlockLoad2dOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; if (name == "elem_size_in_bits") return prop.elem_size_in_bits; if (name == "pack_register") return prop.pack_register; if (name == "tile_height") return prop.tile_height; if (name == "tile_width") return prop.tile_width; if (name == "transpose") return prop.transpose; if (name == "v_blocks") return prop.v_blocks; return std::nullopt; } void BlockLoad2dOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } if (name == "elem_size_in_bits") { prop.elem_size_in_bits = ::llvm::dyn_cast_or_null>(value); return; } if (name == "pack_register") { prop.pack_register = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_height") { prop.tile_height = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_width") { prop.tile_width = ::llvm::dyn_cast_or_null>(value); return; } if (name == "transpose") { prop.transpose = ::llvm::dyn_cast_or_null>(value); return; } if (name == "v_blocks") { prop.v_blocks = ::llvm::dyn_cast_or_null>(value); return; } } void BlockLoad2dOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); if (prop.elem_size_in_bits) attrs.append("elem_size_in_bits", prop.elem_size_in_bits); if (prop.pack_register) attrs.append("pack_register", prop.pack_register); if (prop.tile_height) attrs.append("tile_height", prop.tile_height); if (prop.tile_width) attrs.append("tile_width", prop.tile_width); if (prop.transpose) attrs.append("transpose", prop.transpose); if (prop.v_blocks) attrs.append("v_blocks", prop.v_blocks); } ::llvm::LogicalResult BlockLoad2dOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(attr, "cache_control", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getElemSizeInBitsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "elem_size_in_bits", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getPackRegisterAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps2(attr, "pack_register", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileHeightAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_height", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileWidthAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_width", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTransposeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps2(attr, "transpose", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getVBlocksAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "v_blocks", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult BlockLoad2dOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.elem_size_in_bits))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.pack_register))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_height))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_width))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.transpose))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.v_blocks))) return ::mlir::failure(); return ::mlir::success(); } void BlockLoad2dOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); writer.writeAttribute(prop.elem_size_in_bits); writer.writeAttribute(prop.pack_register); writer.writeAttribute(prop.tile_height); writer.writeAttribute(prop.tile_width); writer.writeAttribute(prop.transpose); writer.writeAttribute(prop.v_blocks); } uint32_t BlockLoad2dOp::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOp::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOp::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockLoad2dOp::getVBlocks() { auto attr = getVBlocksAttr(); return attr.getValue().getZExtValue(); } bool BlockLoad2dOp::getTranspose() { auto attr = getTransposeAttr(); return attr.getValue().getZExtValue(); } bool BlockLoad2dOp::getPackRegister() { auto attr = getPackRegisterAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::LoadCacheControl> BlockLoad2dOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } void BlockLoad2dOp::setElemSizeInBits(uint32_t attrValue) { getProperties().elem_size_in_bits = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockLoad2dOp::setTileWidth(uint32_t attrValue) { getProperties().tile_width = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockLoad2dOp::setTileHeight(uint32_t attrValue) { getProperties().tile_height = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockLoad2dOp::setVBlocks(uint32_t attrValue) { getProperties().v_blocks = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockLoad2dOp::setTranspose(bool attrValue) { getProperties().transpose = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(1), attrValue); } void BlockLoad2dOp::setPackRegister(bool attrValue) { getProperties().pack_register = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(1), attrValue); } void BlockLoad2dOp::setCacheControl(::std::optional<::mlir::xevm::LoadCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::LoadCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void BlockLoad2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; odsState.getOrAddProperties().v_blocks = v_blocks; odsState.getOrAddProperties().transpose = transpose; odsState.getOrAddProperties().pack_register = pack_register; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } odsState.addTypes(res); } BlockLoad2dOp BlockLoad2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoad2dOp BlockLoad2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(res), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); } void BlockLoad2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; odsState.getOrAddProperties().v_blocks = v_blocks; odsState.getOrAddProperties().transpose = transpose; odsState.getOrAddProperties().pack_register = pack_register; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockLoad2dOp BlockLoad2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoad2dOp BlockLoad2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, ::mlir::IntegerAttr transpose, ::mlir::IntegerAttr pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); } void BlockLoad2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); odsState.getOrAddProperties().v_blocks = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), v_blocks); odsState.getOrAddProperties().transpose = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(1), transpose); odsState.getOrAddProperties().pack_register = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(1), pack_register); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } odsState.addTypes(res); } BlockLoad2dOp BlockLoad2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoad2dOp BlockLoad2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(res), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); } void BlockLoad2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); odsState.getOrAddProperties().v_blocks = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), v_blocks); odsState.getOrAddProperties().transpose = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(1), transpose); odsState.getOrAddProperties().pack_register = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(1), pack_register); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockLoad2dOp BlockLoad2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoad2dOp BlockLoad2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, bool transpose, bool pack_register, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(transpose), std::forward(pack_register), std::forward(cache_control)); } void BlockLoad2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 6u && "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."); } } BlockLoad2dOp BlockLoad2dOp::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__; } BlockLoad2dOp BlockLoad2dOp::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 BlockLoad2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 6u && "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); } BlockLoad2dOp BlockLoad2dOp::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__; } BlockLoad2dOp BlockLoad2dOp::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 BlockLoad2dOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitOpError("requires attribute 'elem_size_in_bits'"); auto tblgen_pack_register = getProperties().pack_register; (void)tblgen_pack_register; if (!tblgen_pack_register) return emitOpError("requires attribute 'pack_register'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitOpError("requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitOpError("requires attribute 'tile_width'"); auto tblgen_transpose = getProperties().transpose; (void)tblgen_transpose; if (!tblgen_transpose) return emitOpError("requires attribute 'transpose'"); auto tblgen_v_blocks = getProperties().v_blocks; (void)tblgen_v_blocks; if (!tblgen_v_blocks) return emitOpError("requires attribute 'v_blocks'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_elem_size_in_bits, "elem_size_in_bits"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_width, "tile_width"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_height, "tile_height"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_v_blocks, "v_blocks"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps2(*this, tblgen_transpose, "transpose"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps2(*this, tblgen_pack_register, "pack_register"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup3 = getODSOperands(3); for (auto v : valueGroup3) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup4 = getODSOperands(4); for (auto v : valueGroup4) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup5 = getODSOperands(5); for (auto v : valueGroup5) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*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_XeVMOps3(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult BlockLoad2dOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult BlockLoad2dOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult BlockLoad2dOp::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.elem_size_in_bits; auto elem_size_in_bitsAttrName = ::mlir::StringAttr::get(ctx, "elem_size_in_bits"); auto attr = dict.get(elem_size_in_bitsAttrName); usedKeys.insert(elem_size_in_bitsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for elem_size_in_bits in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto tile_widthAttrName = ::mlir::StringAttr::get(ctx, "tile_width"); auto attr = dict.get(tile_widthAttrName); usedKeys.insert(tile_widthAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_width in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto tile_heightAttrName = ::mlir::StringAttr::get(ctx, "tile_height"); auto attr = dict.get(tile_heightAttrName); usedKeys.insert(tile_heightAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_height in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.v_blocks; auto v_blocksAttrName = ::mlir::StringAttr::get(ctx, "v_blocks"); auto attr = dict.get(v_blocksAttrName); usedKeys.insert(v_blocksAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for v_blocks in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `v_blocks` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.transpose; auto transposeAttrName = ::mlir::StringAttr::get(ctx, "transpose"); auto attr = dict.get(transposeAttrName); usedKeys.insert(transposeAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for transpose in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `transpose` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.pack_register; auto pack_registerAttrName = ::mlir::StringAttr::get(ctx, "pack_register"); auto attr = dict.get(pack_registerAttrName); usedKeys.insert(pack_registerAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for pack_register in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `pack_register` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 BlockLoad2dOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } void BlockLoad2dOp::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::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::BlockLoad2dOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::BlockLoad2dOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::BlockLoadOp definitions //===----------------------------------------------------------------------===// namespace detail { BlockLoadOpGenericAdaptorBase::BlockLoadOpGenericAdaptorBase(BlockLoadOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::xevm::LoadCacheControl> BlockLoadOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail BlockLoadOpAdaptor::BlockLoadOpAdaptor(BlockLoadOp op) : BlockLoadOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult BlockLoadOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::LoadCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.blockload' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for load operators"); return ::mlir::success(); } ::llvm::LogicalResult BlockLoadOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute BlockLoadOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code BlockLoadOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer())); } std::optional BlockLoadOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; return std::nullopt; } void BlockLoadOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } } void BlockLoadOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); } ::llvm::LogicalResult BlockLoadOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(attr, "cache_control", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult BlockLoadOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); return ::mlir::success(); } void BlockLoadOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); } ::std::optional<::mlir::xevm::LoadCacheControl> BlockLoadOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } void BlockLoadOp::setCacheControl(::std::optional<::mlir::xevm::LoadCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::LoadCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void BlockLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } odsState.addTypes(res); } BlockLoadOp BlockLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(ptr), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoadOp BlockLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(res), std::forward(ptr), std::forward(cache_control)); } void BlockLoadOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockLoadOp BlockLoadOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockLoadOp BlockLoadOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(cache_control)); } void BlockLoadOp::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."); } } BlockLoadOp BlockLoadOp::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__; } BlockLoadOp BlockLoadOp::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 BlockLoadOp::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); } BlockLoadOp BlockLoadOp::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__; } BlockLoadOp BlockLoadOp::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 BlockLoadOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps1(*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_XeVMOps4(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult BlockLoadOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult BlockLoadOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult BlockLoadOp::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.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 BlockLoadOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } void BlockLoadOp::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::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::BlockLoadOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::BlockLoadOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::BlockPrefetch2dOp definitions //===----------------------------------------------------------------------===// namespace detail { BlockPrefetch2dOpGenericAdaptorBase::BlockPrefetch2dOpGenericAdaptorBase(BlockPrefetch2dOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} uint32_t BlockPrefetch2dOpGenericAdaptorBase::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOpGenericAdaptorBase::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOpGenericAdaptorBase::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOpGenericAdaptorBase::getVBlocks() { auto attr = getVBlocksAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::LoadCacheControl> BlockPrefetch2dOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail BlockPrefetch2dOpAdaptor::BlockPrefetch2dOpAdaptor(BlockPrefetch2dOp op) : BlockPrefetch2dOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult BlockPrefetch2dOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitError(loc, "'xevm.blockprefetch2d' op requires attribute 'elem_size_in_bits'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitError(loc, "'xevm.blockprefetch2d' op requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitError(loc, "'xevm.blockprefetch2d' op requires attribute 'tile_width'"); auto tblgen_v_blocks = getProperties().v_blocks; (void)tblgen_v_blocks; if (!tblgen_v_blocks) return emitError(loc, "'xevm.blockprefetch2d' op requires attribute 'v_blocks'"); if (tblgen_elem_size_in_bits && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_elem_size_in_bits))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_elem_size_in_bits).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockprefetch2d' op attribute 'elem_size_in_bits' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_width && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_width))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_width).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockprefetch2d' op attribute 'tile_width' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_height && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_height))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_height).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockprefetch2d' op attribute 'tile_height' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_v_blocks && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_v_blocks))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_v_blocks).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockprefetch2d' op attribute 'v_blocks' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::LoadCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.blockprefetch2d' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for load operators"); return ::mlir::success(); } ::llvm::LogicalResult BlockPrefetch2dOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.elem_size_in_bits; auto attr = dict.get("elem_size_in_bits"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto attr = dict.get("tile_height"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto attr = dict.get("tile_width"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.v_blocks; auto attr = dict.get("v_blocks"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `v_blocks` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute BlockPrefetch2dOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } { const auto &propStorage = prop.elem_size_in_bits; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("elem_size_in_bits", propStorage)); } { const auto &propStorage = prop.tile_height; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_height", propStorage)); } { const auto &propStorage = prop.tile_width; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_width", propStorage)); } { const auto &propStorage = prop.v_blocks; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("v_blocks", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code BlockPrefetch2dOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer()), llvm::hash_value(prop.elem_size_in_bits.getAsOpaquePointer()), llvm::hash_value(prop.tile_height.getAsOpaquePointer()), llvm::hash_value(prop.tile_width.getAsOpaquePointer()), llvm::hash_value(prop.v_blocks.getAsOpaquePointer())); } std::optional BlockPrefetch2dOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; if (name == "elem_size_in_bits") return prop.elem_size_in_bits; if (name == "tile_height") return prop.tile_height; if (name == "tile_width") return prop.tile_width; if (name == "v_blocks") return prop.v_blocks; return std::nullopt; } void BlockPrefetch2dOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } if (name == "elem_size_in_bits") { prop.elem_size_in_bits = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_height") { prop.tile_height = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_width") { prop.tile_width = ::llvm::dyn_cast_or_null>(value); return; } if (name == "v_blocks") { prop.v_blocks = ::llvm::dyn_cast_or_null>(value); return; } } void BlockPrefetch2dOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); if (prop.elem_size_in_bits) attrs.append("elem_size_in_bits", prop.elem_size_in_bits); if (prop.tile_height) attrs.append("tile_height", prop.tile_height); if (prop.tile_width) attrs.append("tile_width", prop.tile_width); if (prop.v_blocks) attrs.append("v_blocks", prop.v_blocks); } ::llvm::LogicalResult BlockPrefetch2dOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(attr, "cache_control", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getElemSizeInBitsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "elem_size_in_bits", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileHeightAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_height", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileWidthAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_width", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getVBlocksAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "v_blocks", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult BlockPrefetch2dOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.elem_size_in_bits))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_height))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_width))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.v_blocks))) return ::mlir::failure(); return ::mlir::success(); } void BlockPrefetch2dOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); writer.writeAttribute(prop.elem_size_in_bits); writer.writeAttribute(prop.tile_height); writer.writeAttribute(prop.tile_width); writer.writeAttribute(prop.v_blocks); } uint32_t BlockPrefetch2dOp::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOp::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOp::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockPrefetch2dOp::getVBlocks() { auto attr = getVBlocksAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::LoadCacheControl> BlockPrefetch2dOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } void BlockPrefetch2dOp::setElemSizeInBits(uint32_t attrValue) { getProperties().elem_size_in_bits = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockPrefetch2dOp::setTileWidth(uint32_t attrValue) { getProperties().tile_width = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockPrefetch2dOp::setTileHeight(uint32_t attrValue) { getProperties().tile_height = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockPrefetch2dOp::setVBlocks(uint32_t attrValue) { getProperties().v_blocks = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockPrefetch2dOp::setCacheControl(::std::optional<::mlir::xevm::LoadCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::LoadCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void BlockPrefetch2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; odsState.getOrAddProperties().v_blocks = v_blocks; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); } void BlockPrefetch2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; odsState.getOrAddProperties().v_blocks = v_blocks; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::IntegerAttr v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); } void BlockPrefetch2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); odsState.getOrAddProperties().v_blocks = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), v_blocks); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); } void BlockPrefetch2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); odsState.getOrAddProperties().v_blocks = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), v_blocks); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockPrefetch2dOp BlockPrefetch2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, uint32_t v_blocks, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(v_blocks), std::forward(cache_control)); } void BlockPrefetch2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 6u && "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."); } } BlockPrefetch2dOp BlockPrefetch2dOp::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__; } BlockPrefetch2dOp BlockPrefetch2dOp::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 BlockPrefetch2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 6u && "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); } BlockPrefetch2dOp BlockPrefetch2dOp::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__; } BlockPrefetch2dOp BlockPrefetch2dOp::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 BlockPrefetch2dOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitOpError("requires attribute 'elem_size_in_bits'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitOpError("requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitOpError("requires attribute 'tile_width'"); auto tblgen_v_blocks = getProperties().v_blocks; (void)tblgen_v_blocks; if (!tblgen_v_blocks) return emitOpError("requires attribute 'v_blocks'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_elem_size_in_bits, "elem_size_in_bits"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_width, "tile_width"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_height, "tile_height"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_v_blocks, "v_blocks"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup3 = getODSOperands(3); for (auto v : valueGroup3) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup4 = getODSOperands(4); for (auto v : valueGroup4) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup5 = getODSOperands(5); for (auto v : valueGroup5) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult BlockPrefetch2dOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult BlockPrefetch2dOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::SmallVector<::mlir::Type, 1> allOperandTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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.parseLParen()) return ::mlir::failure(); if (parser.parseTypeList(allOperandTypes)) return ::mlir::failure(); if (parser.parseRParen()) return ::mlir::failure(); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult BlockPrefetch2dOp::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.elem_size_in_bits; auto elem_size_in_bitsAttrName = ::mlir::StringAttr::get(ctx, "elem_size_in_bits"); auto attr = dict.get(elem_size_in_bitsAttrName); usedKeys.insert(elem_size_in_bitsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for elem_size_in_bits in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto tile_widthAttrName = ::mlir::StringAttr::get(ctx, "tile_width"); auto attr = dict.get(tile_widthAttrName); usedKeys.insert(tile_widthAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_width in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto tile_heightAttrName = ::mlir::StringAttr::get(ctx, "tile_height"); auto attr = dict.get(tile_heightAttrName); usedKeys.insert(tile_heightAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_height in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.v_blocks; auto v_blocksAttrName = ::mlir::StringAttr::get(ctx, "v_blocks"); auto attr = dict.get(v_blocksAttrName); usedKeys.insert(v_blocksAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for v_blocks in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `v_blocks` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 BlockPrefetch2dOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' ' << "("; _odsPrinter << getOperation()->getOperandTypes(); _odsPrinter << ")"; } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::BlockPrefetch2dOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::BlockPrefetch2dOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::BlockStore2dOp definitions //===----------------------------------------------------------------------===// namespace detail { BlockStore2dOpGenericAdaptorBase::BlockStore2dOpGenericAdaptorBase(BlockStore2dOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} uint32_t BlockStore2dOpGenericAdaptorBase::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockStore2dOpGenericAdaptorBase::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockStore2dOpGenericAdaptorBase::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::StoreCacheControl> BlockStore2dOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::StoreCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail BlockStore2dOpAdaptor::BlockStore2dOpAdaptor(BlockStore2dOp op) : BlockStore2dOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult BlockStore2dOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitError(loc, "'xevm.blockstore2d' op requires attribute 'elem_size_in_bits'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitError(loc, "'xevm.blockstore2d' op requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitError(loc, "'xevm.blockstore2d' op requires attribute 'tile_width'"); if (tblgen_elem_size_in_bits && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_elem_size_in_bits))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_elem_size_in_bits).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockstore2d' op attribute 'elem_size_in_bits' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_width && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_width))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_width).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockstore2d' op attribute 'tile_width' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_tile_height && !(((::llvm::isa<::mlir::IntegerAttr>(tblgen_tile_height))) && ((::llvm::cast<::mlir::IntegerAttr>(tblgen_tile_height).getType().isSignlessInteger(32))))) return emitError(loc, "'xevm.blockstore2d' op attribute 'tile_height' failed to satisfy constraint: 32-bit signless integer attribute"); if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::StoreCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.blockstore2d' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for store operators"); return ::mlir::success(); } ::llvm::LogicalResult BlockStore2dOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.elem_size_in_bits; auto attr = dict.get("elem_size_in_bits"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto attr = dict.get("tile_height"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto attr = dict.get("tile_width"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute BlockStore2dOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } { const auto &propStorage = prop.elem_size_in_bits; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("elem_size_in_bits", propStorage)); } { const auto &propStorage = prop.tile_height; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_height", propStorage)); } { const auto &propStorage = prop.tile_width; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("tile_width", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code BlockStore2dOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer()), llvm::hash_value(prop.elem_size_in_bits.getAsOpaquePointer()), llvm::hash_value(prop.tile_height.getAsOpaquePointer()), llvm::hash_value(prop.tile_width.getAsOpaquePointer())); } std::optional BlockStore2dOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; if (name == "elem_size_in_bits") return prop.elem_size_in_bits; if (name == "tile_height") return prop.tile_height; if (name == "tile_width") return prop.tile_width; return std::nullopt; } void BlockStore2dOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } if (name == "elem_size_in_bits") { prop.elem_size_in_bits = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_height") { prop.tile_height = ::llvm::dyn_cast_or_null>(value); return; } if (name == "tile_width") { prop.tile_width = ::llvm::dyn_cast_or_null>(value); return; } } void BlockStore2dOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); if (prop.elem_size_in_bits) attrs.append("elem_size_in_bits", prop.elem_size_in_bits); if (prop.tile_height) attrs.append("tile_height", prop.tile_height); if (prop.tile_width) attrs.append("tile_width", prop.tile_width); } ::llvm::LogicalResult BlockStore2dOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps4(attr, "cache_control", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getElemSizeInBitsAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "elem_size_in_bits", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileHeightAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_height", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTileWidthAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(attr, "tile_width", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult BlockStore2dOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.elem_size_in_bits))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_height))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.tile_width))) return ::mlir::failure(); return ::mlir::success(); } void BlockStore2dOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); writer.writeAttribute(prop.elem_size_in_bits); writer.writeAttribute(prop.tile_height); writer.writeAttribute(prop.tile_width); } uint32_t BlockStore2dOp::getElemSizeInBits() { auto attr = getElemSizeInBitsAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockStore2dOp::getTileWidth() { auto attr = getTileWidthAttr(); return attr.getValue().getZExtValue(); } uint32_t BlockStore2dOp::getTileHeight() { auto attr = getTileHeightAttr(); return attr.getValue().getZExtValue(); } ::std::optional<::mlir::xevm::StoreCacheControl> BlockStore2dOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::StoreCacheControl>(attr.getValue()) : (::std::nullopt); } void BlockStore2dOp::setElemSizeInBits(uint32_t attrValue) { getProperties().elem_size_in_bits = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockStore2dOp::setTileWidth(uint32_t attrValue) { getProperties().tile_width = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockStore2dOp::setTileHeight(uint32_t attrValue) { getProperties().tile_height = ::mlir::Builder((*this)->getContext()).getIntegerAttr(::mlir::Builder((*this)->getContext()).getIntegerType(32), attrValue); } void BlockStore2dOp::setCacheControl(::std::optional<::mlir::xevm::StoreCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::StoreCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void BlockStore2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.addOperands(stored_val); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } BlockStore2dOp BlockStore2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStore2dOp BlockStore2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); } void BlockStore2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.addOperands(stored_val); odsState.getOrAddProperties().elem_size_in_bits = elem_size_in_bits; odsState.getOrAddProperties().tile_width = tile_width; odsState.getOrAddProperties().tile_height = tile_height; if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockStore2dOp BlockStore2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStore2dOp BlockStore2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, ::mlir::IntegerAttr elem_size_in_bits, ::mlir::IntegerAttr tile_width, ::mlir::IntegerAttr tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); } void BlockStore2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.addOperands(stored_val); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } BlockStore2dOp BlockStore2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStore2dOp BlockStore2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); } void BlockStore2dOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(base_width); odsState.addOperands(base_height); odsState.addOperands(base_pitch); odsState.addOperands(x); odsState.addOperands(y); odsState.addOperands(stored_val); odsState.getOrAddProperties().elem_size_in_bits = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), elem_size_in_bits); odsState.getOrAddProperties().tile_width = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_width); odsState.getOrAddProperties().tile_height = odsBuilder.getIntegerAttr(odsBuilder.getIntegerType(32), tile_height); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockStore2dOp BlockStore2dOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStore2dOp BlockStore2dOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value base_width, ::mlir::Value base_height, ::mlir::Value base_pitch, ::mlir::Value x, ::mlir::Value y, uint32_t elem_size_in_bits, uint32_t tile_width, uint32_t tile_height, ::mlir::Value stored_val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(base_width), std::forward(base_height), std::forward(base_pitch), std::forward(x), std::forward(y), std::forward(elem_size_in_bits), std::forward(tile_width), std::forward(tile_height), std::forward(stored_val), std::forward(cache_control)); } void BlockStore2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 7u && "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."); } } BlockStore2dOp BlockStore2dOp::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__; } BlockStore2dOp BlockStore2dOp::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 BlockStore2dOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 7u && "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); } BlockStore2dOp BlockStore2dOp::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__; } BlockStore2dOp BlockStore2dOp::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 BlockStore2dOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; auto tblgen_elem_size_in_bits = getProperties().elem_size_in_bits; (void)tblgen_elem_size_in_bits; if (!tblgen_elem_size_in_bits) return emitOpError("requires attribute 'elem_size_in_bits'"); auto tblgen_tile_height = getProperties().tile_height; (void)tblgen_tile_height; if (!tblgen_tile_height) return emitOpError("requires attribute 'tile_height'"); auto tblgen_tile_width = getProperties().tile_width; (void)tblgen_tile_width; if (!tblgen_tile_width) return emitOpError("requires attribute 'tile_width'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_elem_size_in_bits, "elem_size_in_bits"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_width, "tile_width"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps1(*this, tblgen_tile_height, "tile_height"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps4(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup3 = getODSOperands(3); for (auto v : valueGroup3) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup4 = getODSOperands(4); for (auto v : valueGroup4) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup5 = getODSOperands(5); for (auto v : valueGroup5) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps2(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup6 = getODSOperands(6); for (auto v : valueGroup6) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult BlockStore2dOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult BlockStore2dOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::SmallVector<::mlir::Type, 1> allOperandTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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.parseLParen()) return ::mlir::failure(); if (parser.parseTypeList(allOperandTypes)) return ::mlir::failure(); if (parser.parseRParen()) return ::mlir::failure(); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult BlockStore2dOp::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.elem_size_in_bits; auto elem_size_in_bitsAttrName = ::mlir::StringAttr::get(ctx, "elem_size_in_bits"); auto attr = dict.get(elem_size_in_bitsAttrName); usedKeys.insert(elem_size_in_bitsAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for elem_size_in_bits in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `elem_size_in_bits` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_width; auto tile_widthAttrName = ::mlir::StringAttr::get(ctx, "tile_width"); auto attr = dict.get(tile_widthAttrName); usedKeys.insert(tile_widthAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_width in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_width` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.tile_height; auto tile_heightAttrName = ::mlir::StringAttr::get(ctx, "tile_height"); auto attr = dict.get(tile_heightAttrName); usedKeys.insert(tile_heightAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for tile_height in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `tile_height` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 BlockStore2dOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' ' << "("; _odsPrinter << getOperation()->getOperandTypes(); _odsPrinter << ")"; } void BlockStore2dOp::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::Write::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::BlockStore2dOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::BlockStore2dOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::BlockStoreOp definitions //===----------------------------------------------------------------------===// namespace detail { BlockStoreOpGenericAdaptorBase::BlockStoreOpGenericAdaptorBase(BlockStoreOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::xevm::StoreCacheControl> BlockStoreOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::StoreCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail BlockStoreOpAdaptor::BlockStoreOpAdaptor(BlockStoreOp op) : BlockStoreOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult BlockStoreOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::StoreCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.blockstore' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for store operators"); return ::mlir::success(); } ::llvm::LogicalResult BlockStoreOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute BlockStoreOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code BlockStoreOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer())); } std::optional BlockStoreOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; return std::nullopt; } void BlockStoreOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } } void BlockStoreOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); } ::llvm::LogicalResult BlockStoreOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps4(attr, "cache_control", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult BlockStoreOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); return ::mlir::success(); } void BlockStoreOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); } ::std::optional<::mlir::xevm::StoreCacheControl> BlockStoreOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::StoreCacheControl>(attr.getValue()) : (::std::nullopt); } void BlockStoreOp::setCacheControl(::std::optional<::mlir::xevm::StoreCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::StoreCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void BlockStoreOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(val); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } BlockStoreOp BlockStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStoreOp BlockStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(val), std::forward(cache_control)); } void BlockStoreOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { odsState.addOperands(ptr); odsState.addOperands(val); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } BlockStoreOp BlockStoreOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(val), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } BlockStoreOp BlockStoreOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, ::mlir::Value val, /*optional*/::mlir::xevm::StoreCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(val), std::forward(cache_control)); } void BlockStoreOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 2u && "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."); } } BlockStoreOp BlockStoreOp::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__; } BlockStoreOp BlockStoreOp::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 BlockStoreOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 2u && "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); } BlockStoreOp BlockStoreOp::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__; } BlockStoreOp BlockStoreOp::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 BlockStoreOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps4(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps1(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps4(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult BlockStoreOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult BlockStoreOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::SmallVector<::mlir::Type, 1> allOperandTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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.parseLParen()) return ::mlir::failure(); if (parser.parseTypeList(allOperandTypes)) return ::mlir::failure(); if (parser.parseRParen()) return ::mlir::failure(); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult BlockStoreOp::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.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 BlockStoreOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' ' << "("; _odsPrinter << getOperation()->getOperandTypes(); _odsPrinter << ")"; } void BlockStoreOp::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::Write::get(), &getOperation()->getOpOperand(idx), 0, false, ::mlir::SideEffects::DefaultResource::get()); } } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::BlockStoreOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::BlockStoreOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::ExtfOp definitions //===----------------------------------------------------------------------===// namespace detail { ExtfOpGenericAdaptorBase::ExtfOpGenericAdaptorBase(ExtfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::mlir::xevm::ExtfSrcElemTypeAttr ExtfOpGenericAdaptorBase::getSrcEtype() { auto attr = getSrcEtypeAttr(); return ::llvm::cast<::mlir::xevm::ExtfSrcElemTypeAttr>(attr); } ::mlir::xevm::ExtfDstElemTypeAttr ExtfOpGenericAdaptorBase::getDstEtype() { auto attr = getDstEtypeAttr(); return ::llvm::cast<::mlir::xevm::ExtfDstElemTypeAttr>(attr); } } // namespace detail ExtfOpAdaptor::ExtfOpAdaptor(ExtfOp op) : ExtfOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult ExtfOpAdaptor::verify(::mlir::Location loc) { auto tblgen_dst_etype = getProperties().dst_etype; (void)tblgen_dst_etype; if (!tblgen_dst_etype) return emitError(loc, "'xevm.extf' op requires attribute 'dst_etype'"); auto tblgen_src_etype = getProperties().src_etype; (void)tblgen_src_etype; if (!tblgen_src_etype) return emitError(loc, "'xevm.extf' op requires attribute 'src_etype'"); if (tblgen_src_etype && !((::llvm::isa<::mlir::xevm::ExtfSrcElemTypeAttr>(tblgen_src_etype)))) return emitError(loc, "'xevm.extf' op attribute 'src_etype' failed to satisfy constraint: "); if (tblgen_dst_etype && !((::llvm::isa<::mlir::xevm::ExtfDstElemTypeAttr>(tblgen_dst_etype)))) return emitError(loc, "'xevm.extf' op attribute 'dst_etype' failed to satisfy constraint: "); return ::mlir::success(); } ::llvm::LogicalResult ExtfOp::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_etype; auto attr = dict.get("dst_etype"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `dst_etype` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.src_etype; auto attr = dict.get("src_etype"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `src_etype` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute ExtfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.dst_etype; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("dst_etype", propStorage)); } { const auto &propStorage = prop.src_etype; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("src_etype", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code ExtfOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.dst_etype.getAsOpaquePointer()), llvm::hash_value(prop.src_etype.getAsOpaquePointer())); } std::optional ExtfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "dst_etype") return prop.dst_etype; if (name == "src_etype") return prop.src_etype; return std::nullopt; } void ExtfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "dst_etype") { prop.dst_etype = ::llvm::dyn_cast_or_null>(value); return; } if (name == "src_etype") { prop.src_etype = ::llvm::dyn_cast_or_null>(value); return; } } void ExtfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.dst_etype) attrs.append("dst_etype", prop.dst_etype); if (prop.src_etype) attrs.append("src_etype", prop.src_etype); } ::llvm::LogicalResult ExtfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getDstEtypeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps6(attr, "dst_etype", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getSrcEtypeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps5(attr, "src_etype", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult ExtfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.dst_etype))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.src_etype))) return ::mlir::failure(); return ::mlir::success(); } void ExtfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.dst_etype); writer.writeAttribute(prop.src_etype); } ::mlir::xevm::ExtfSrcElemTypeAttr ExtfOp::getSrcEtype() { auto attr = getSrcEtypeAttr(); return ::llvm::cast<::mlir::xevm::ExtfSrcElemTypeAttr>(attr); } ::mlir::xevm::ExtfDstElemTypeAttr ExtfOp::getDstEtype() { auto attr = getDstEtypeAttr(); return ::llvm::cast<::mlir::xevm::ExtfDstElemTypeAttr>(attr); } void ExtfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { odsState.addOperands(src); odsState.getOrAddProperties().src_etype = src_etype; odsState.getOrAddProperties().dst_etype = dst_etype; odsState.addTypes(dst); } ExtfOp ExtfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(dst), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } ExtfOp ExtfOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { return create(builder, builder.getLoc(), std::forward(dst), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); } void ExtfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { odsState.addOperands(src); odsState.getOrAddProperties().src_etype = src_etype; odsState.getOrAddProperties().dst_etype = dst_etype; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } ExtfOp ExtfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } ExtfOp ExtfOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::ExtfSrcElemTypeAttr src_etype, ::mlir::xevm::ExtfDstElemTypeAttr dst_etype) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); } void ExtfOp::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."); } } ExtfOp ExtfOp::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__; } ExtfOp ExtfOp::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 ExtfOp::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); } ExtfOp ExtfOp::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__; } ExtfOp ExtfOp::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 ExtfOp::verifyInvariantsImpl() { auto tblgen_dst_etype = getProperties().dst_etype; (void)tblgen_dst_etype; if (!tblgen_dst_etype) return emitOpError("requires attribute 'dst_etype'"); auto tblgen_src_etype = getProperties().src_etype; (void)tblgen_src_etype; if (!tblgen_src_etype) return emitOpError("requires attribute 'src_etype'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps5(*this, tblgen_src_etype, "src_etype"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps6(*this, tblgen_dst_etype, "dst_etype"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps5(*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_XeVMOps6(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult ExtfOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult ExtfOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::OpAsmParser::UnresolvedOperand srcRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> srcOperands(&srcRawOperand, 1); ::llvm::SMLoc srcOperandsLoc; (void)srcOperandsLoc; ::mlir::xevm::ExtfSrcElemTypeAttr src_etypeAttr; ::mlir::xevm::ExtfDstElemTypeAttr dst_etypeAttr; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; srcOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(srcRawOperand)) return ::mlir::failure(); if (parser.parseLBrace()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(src_etypeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (src_etypeAttr) result.getOrAddProperties().src_etype = src_etypeAttr; if (parser.parseComma()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(dst_etypeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (dst_etypeAttr) result.getOrAddProperties().dst_etype = dst_etypeAttr; if (parser.parseRBrace()) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(srcOperands, allOperandTypes, parser.getNameLoc(), result.operands)) return ::mlir::failure(); return ::mlir::success(); } void ExtfOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getSrc(); _odsPrinter << ' '; _odsPrinter << "{"; _odsPrinter.printStrippedAttrOrType(getSrcEtypeAttr()); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getDstEtypeAttr()); _odsPrinter << "}"; ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("src_etype"); elidedAttrs.push_back("dst_etype"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::ExtfOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::ExtfOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::GridDimXOp definitions //===----------------------------------------------------------------------===// namespace detail { GridDimXOpGenericAdaptorBase::GridDimXOpGenericAdaptorBase(GridDimXOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimXOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail GridDimXOpAdaptor::GridDimXOpAdaptor(GridDimXOp op) : GridDimXOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult GridDimXOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_count.x' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult GridDimXOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute GridDimXOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code GridDimXOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional GridDimXOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void GridDimXOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void GridDimXOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult GridDimXOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult GridDimXOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void GridDimXOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimXOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void GridDimXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } GridDimXOp GridDimXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimXOp GridDimXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void GridDimXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } GridDimXOp GridDimXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimXOp GridDimXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void GridDimXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } GridDimXOp GridDimXOp::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__; } GridDimXOp GridDimXOp::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 GridDimXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } GridDimXOp GridDimXOp::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__; } GridDimXOp GridDimXOp::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 GridDimXOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult GridDimXOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult GridDimXOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void GridDimXOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::GridDimXOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::GridDimXOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::GridDimYOp definitions //===----------------------------------------------------------------------===// namespace detail { GridDimYOpGenericAdaptorBase::GridDimYOpGenericAdaptorBase(GridDimYOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimYOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail GridDimYOpAdaptor::GridDimYOpAdaptor(GridDimYOp op) : GridDimYOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult GridDimYOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_count.y' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult GridDimYOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute GridDimYOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code GridDimYOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional GridDimYOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void GridDimYOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void GridDimYOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult GridDimYOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult GridDimYOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void GridDimYOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimYOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void GridDimYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } GridDimYOp GridDimYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimYOp GridDimYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void GridDimYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } GridDimYOp GridDimYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimYOp GridDimYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void GridDimYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } GridDimYOp GridDimYOp::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__; } GridDimYOp GridDimYOp::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 GridDimYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } GridDimYOp GridDimYOp::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__; } GridDimYOp GridDimYOp::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 GridDimYOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult GridDimYOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult GridDimYOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void GridDimYOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::GridDimYOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::GridDimYOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::GridDimZOp definitions //===----------------------------------------------------------------------===// namespace detail { GridDimZOpGenericAdaptorBase::GridDimZOpGenericAdaptorBase(GridDimZOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimZOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail GridDimZOpAdaptor::GridDimZOpAdaptor(GridDimZOp op) : GridDimZOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult GridDimZOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_count.z' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult GridDimZOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute GridDimZOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code GridDimZOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional GridDimZOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void GridDimZOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void GridDimZOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult GridDimZOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult GridDimZOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void GridDimZOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> GridDimZOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void GridDimZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } GridDimZOp GridDimZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimZOp GridDimZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void GridDimZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } GridDimZOp GridDimZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } GridDimZOp GridDimZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void GridDimZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } GridDimZOp GridDimZOp::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__; } GridDimZOp GridDimZOp::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 GridDimZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } GridDimZOp GridDimZOp::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__; } GridDimZOp GridDimZOp::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 GridDimZOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult GridDimZOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult GridDimZOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void GridDimZOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::GridDimZOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::GridDimZOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::LaneIdOp definitions //===----------------------------------------------------------------------===// namespace detail { LaneIdOpGenericAdaptorBase::LaneIdOpGenericAdaptorBase(LaneIdOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> LaneIdOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail LaneIdOpAdaptor::LaneIdOpAdaptor(LaneIdOp op) : LaneIdOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult LaneIdOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.lane_id' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult LaneIdOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute LaneIdOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code LaneIdOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional LaneIdOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void LaneIdOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void LaneIdOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult LaneIdOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult LaneIdOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void LaneIdOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> LaneIdOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void LaneIdOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } LaneIdOp LaneIdOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } LaneIdOp LaneIdOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void LaneIdOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } LaneIdOp LaneIdOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } LaneIdOp LaneIdOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void LaneIdOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } LaneIdOp LaneIdOp::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__; } LaneIdOp LaneIdOp::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 LaneIdOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } LaneIdOp LaneIdOp::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__; } LaneIdOp LaneIdOp::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 LaneIdOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult LaneIdOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult LaneIdOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void LaneIdOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::LaneIdOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::LaneIdOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::MMAMxOp definitions //===----------------------------------------------------------------------===// namespace detail { MMAMxOpGenericAdaptorBase::MMAMxOpGenericAdaptorBase(MMAMxOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair MMAMxOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) { bool isVariadic[] = {false, false, 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 - 4) / 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::xevm::MMAShapeAttr MMAMxOpGenericAdaptorBase::getShape() { auto attr = getShapeAttr(); return ::llvm::cast<::mlir::xevm::MMAShapeAttr>(attr); } ::mlir::xevm::MMATypesAttr MMAMxOpGenericAdaptorBase::getTypes() { auto attr = getTypesAttr(); return ::llvm::cast<::mlir::xevm::MMATypesAttr>(attr); } } // namespace detail MMAMxOpAdaptor::MMAMxOpAdaptor(MMAMxOp op) : MMAMxOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult MMAMxOpAdaptor::verify(::mlir::Location loc) { auto tblgen_shape = getProperties().shape; (void)tblgen_shape; if (!tblgen_shape) return emitError(loc, "'xevm.mma_mx' op requires attribute 'shape'"); auto tblgen_types = getProperties().types; (void)tblgen_types; if (!tblgen_types) return emitError(loc, "'xevm.mma_mx' op requires attribute 'types'"); if (tblgen_shape && !((::llvm::isa<::mlir::xevm::MMAShapeAttr>(tblgen_shape)))) return emitError(loc, "'xevm.mma_mx' op attribute 'shape' failed to satisfy constraint: "); if (tblgen_types && !((::llvm::isa<::mlir::xevm::MMATypesAttr>(tblgen_types)))) return emitError(loc, "'xevm.mma_mx' op attribute 'types' failed to satisfy constraint: "); return ::mlir::success(); } std::pair MMAMxOp::getODSOperandIndexAndLength(unsigned index) { bool isVariadic[] = {false, false, 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() - 4) / 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 MMAMxOp::getCMutable() { auto range = getODSOperandIndexAndLength(4); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult MMAMxOp::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.shape; auto attr = dict.get("shape"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `shape` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.types; auto attr = dict.get("types"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `types` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute MMAMxOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.shape; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("shape", propStorage)); } { const auto &propStorage = prop.types; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("types", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code MMAMxOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.shape.getAsOpaquePointer()), llvm::hash_value(prop.types.getAsOpaquePointer())); } std::optional MMAMxOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "shape") return prop.shape; if (name == "types") return prop.types; return std::nullopt; } void MMAMxOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "shape") { prop.shape = ::llvm::dyn_cast_or_null>(value); return; } if (name == "types") { prop.types = ::llvm::dyn_cast_or_null>(value); return; } } void MMAMxOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.shape) attrs.append("shape", prop.shape); if (prop.types) attrs.append("types", prop.types); } ::llvm::LogicalResult MMAMxOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getShapeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps8(attr, "shape", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTypesAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps9(attr, "types", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult MMAMxOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.shape))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.types))) return ::mlir::failure(); return ::mlir::success(); } void MMAMxOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.shape); writer.writeAttribute(prop.types); } ::mlir::xevm::MMAShapeAttr MMAMxOp::getShape() { auto attr = getShapeAttr(); return ::llvm::cast<::mlir::xevm::MMAShapeAttr>(attr); } ::mlir::xevm::MMATypesAttr MMAMxOp::getTypes() { auto attr = getTypesAttr(); return ::llvm::cast<::mlir::xevm::MMATypesAttr>(attr); } void MMAMxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { odsState.addOperands(a); odsState.addOperands(b); odsState.addOperands(scale_a); odsState.addOperands(scale_b); if (c) odsState.addOperands(c); odsState.getOrAddProperties().shape = shape; odsState.getOrAddProperties().types = types; odsState.addTypes(d); } MMAMxOp MMAMxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(d), std::forward(a), std::forward(b), std::forward(scale_a), std::forward(scale_b), std::forward(c), std::forward(shape), std::forward(types)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MMAMxOp MMAMxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { return create(builder, builder.getLoc(), std::forward(d), std::forward(a), std::forward(b), std::forward(scale_a), std::forward(scale_b), std::forward(c), std::forward(shape), std::forward(types)); } void MMAMxOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { odsState.addOperands(a); odsState.addOperands(b); odsState.addOperands(scale_a); odsState.addOperands(scale_b); if (c) odsState.addOperands(c); odsState.getOrAddProperties().shape = shape; odsState.getOrAddProperties().types = types; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } MMAMxOp MMAMxOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(a), std::forward(b), std::forward(scale_a), std::forward(scale_b), std::forward(c), std::forward(shape), std::forward(types)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MMAMxOp MMAMxOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, ::mlir::Value scale_a, ::mlir::Value scale_b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(a), std::forward(b), std::forward(scale_a), std::forward(scale_b), std::forward(c), std::forward(shape), std::forward(types)); } void MMAMxOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() >= 4u && "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."); } } MMAMxOp MMAMxOp::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__; } MMAMxOp MMAMxOp::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 MMAMxOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() >= 4u && "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); } MMAMxOp MMAMxOp::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__; } MMAMxOp MMAMxOp::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 MMAMxOp::verifyInvariantsImpl() { auto tblgen_shape = getProperties().shape; (void)tblgen_shape; if (!tblgen_shape) return emitOpError("requires attribute 'shape'"); auto tblgen_types = getProperties().types; (void)tblgen_types; if (!tblgen_types) return emitOpError("requires attribute 'types'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps8(*this, tblgen_shape, "shape"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps9(*this, tblgen_types, "types"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps8(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup3 = getODSOperands(3); for (auto v : valueGroup3) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps8(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup4 = getODSOperands(4); if (valueGroup4.size() > 1) { return emitOpError("operand group starting at #") << index << " requires 0 or 1 element, but found " << valueGroup4.size(); } for (auto v : valueGroup4) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*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_XeVMOps3(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult MMAMxOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult MMAMxOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::OpAsmParser::UnresolvedOperand aRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> aOperands(&aRawOperand, 1); ::llvm::SMLoc aOperandsLoc; (void)aOperandsLoc; ::mlir::OpAsmParser::UnresolvedOperand bRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> bOperands(&bRawOperand, 1); ::llvm::SMLoc bOperandsLoc; (void)bOperandsLoc; ::mlir::OpAsmParser::UnresolvedOperand scale_aRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> scale_aOperands(&scale_aRawOperand, 1); ::llvm::SMLoc scale_aOperandsLoc; (void)scale_aOperandsLoc; ::mlir::OpAsmParser::UnresolvedOperand scale_bRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> scale_bOperands(&scale_bRawOperand, 1); ::llvm::SMLoc scale_bOperandsLoc; (void)scale_bOperandsLoc; ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> cOperands; ::llvm::SMLoc cOperandsLoc; (void)cOperandsLoc; ::mlir::xevm::MMAShapeAttr shapeAttr; ::mlir::xevm::MMATypesAttr typesAttr; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; aOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(aRawOperand)) return ::mlir::failure(); if (parser.parseComma()) return ::mlir::failure(); bOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(bRawOperand)) return ::mlir::failure(); if (parser.parseComma()) return ::mlir::failure(); scale_aOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(scale_aRawOperand)) return ::mlir::failure(); if (parser.parseComma()) return ::mlir::failure(); scale_bOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(scale_bRawOperand)) return ::mlir::failure(); if (::mlir::succeeded(parser.parseOptionalComma())) { { cOperandsLoc = parser.getCurrentLocation(); ::mlir::OpAsmParser::UnresolvedOperand operand; ::mlir::OptionalParseResult parseResult = parser.parseOptionalOperand(operand); if (parseResult.has_value()) { if (failed(*parseResult)) return ::mlir::failure(); cOperands.push_back(operand); } } } if (parser.parseLBrace()) return ::mlir::failure(); if (parser.parseKeyword("shape")) return ::mlir::failure(); if (parser.parseEqual()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(shapeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (shapeAttr) result.getOrAddProperties().shape = shapeAttr; if (parser.parseComma()) return ::mlir::failure(); if (parser.parseKeyword("types")) return ::mlir::failure(); if (parser.parseEqual()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(typesAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (typesAttr) result.getOrAddProperties().types = typesAttr; if (parser.parseRBrace()) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(::llvm::concat(aOperands, bOperands, scale_aOperands, scale_bOperands, cOperands), allOperandTypes, parser.getNameLoc(), result.operands)) return ::mlir::failure(); return ::mlir::success(); } void MMAMxOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getA(); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter << getB(); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter << getScaleA(); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter << getScaleB(); if (getC()) { _odsPrinter << ","; _odsPrinter << ' '; if (::mlir::Value value = getC()) _odsPrinter << value; } _odsPrinter << ' '; _odsPrinter << "{"; _odsPrinter << "shape"; _odsPrinter << ' ' << "="; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getShapeAttr()); _odsPrinter << ","; _odsPrinter << ' ' << "types"; _odsPrinter << ' ' << "="; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getTypesAttr()); _odsPrinter << "}"; ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("shape"); elidedAttrs.push_back("types"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::MMAMxOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::MMAMxOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::MMAOp definitions //===----------------------------------------------------------------------===// namespace detail { MMAOpGenericAdaptorBase::MMAOpGenericAdaptorBase(MMAOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} std::pair MMAOpGenericAdaptorBase::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::xevm::MMAShapeAttr MMAOpGenericAdaptorBase::getShape() { auto attr = getShapeAttr(); return ::llvm::cast<::mlir::xevm::MMAShapeAttr>(attr); } ::mlir::xevm::MMATypesAttr MMAOpGenericAdaptorBase::getTypes() { auto attr = getTypesAttr(); return ::llvm::cast<::mlir::xevm::MMATypesAttr>(attr); } } // namespace detail MMAOpAdaptor::MMAOpAdaptor(MMAOp op) : MMAOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult MMAOpAdaptor::verify(::mlir::Location loc) { auto tblgen_shape = getProperties().shape; (void)tblgen_shape; if (!tblgen_shape) return emitError(loc, "'xevm.mma' op requires attribute 'shape'"); auto tblgen_types = getProperties().types; (void)tblgen_types; if (!tblgen_types) return emitError(loc, "'xevm.mma' op requires attribute 'types'"); if (tblgen_shape && !((::llvm::isa<::mlir::xevm::MMAShapeAttr>(tblgen_shape)))) return emitError(loc, "'xevm.mma' op attribute 'shape' failed to satisfy constraint: "); if (tblgen_types && !((::llvm::isa<::mlir::xevm::MMATypesAttr>(tblgen_types)))) return emitError(loc, "'xevm.mma' op attribute 'types' failed to satisfy constraint: "); return ::mlir::success(); } std::pair MMAOp::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 MMAOp::getCMutable() { auto range = getODSOperandIndexAndLength(2); auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second); return mutableRange; } ::llvm::LogicalResult MMAOp::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.shape; auto attr = dict.get("shape"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `shape` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.types; auto attr = dict.get("types"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `types` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute MMAOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.shape; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("shape", propStorage)); } { const auto &propStorage = prop.types; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("types", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code MMAOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.shape.getAsOpaquePointer()), llvm::hash_value(prop.types.getAsOpaquePointer())); } std::optional MMAOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "shape") return prop.shape; if (name == "types") return prop.types; return std::nullopt; } void MMAOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "shape") { prop.shape = ::llvm::dyn_cast_or_null>(value); return; } if (name == "types") { prop.types = ::llvm::dyn_cast_or_null>(value); return; } } void MMAOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.shape) attrs.append("shape", prop.shape); if (prop.types) attrs.append("types", prop.types); } ::llvm::LogicalResult MMAOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getShapeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps8(attr, "shape", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getTypesAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps9(attr, "types", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult MMAOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.shape))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.types))) return ::mlir::failure(); return ::mlir::success(); } void MMAOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.shape); writer.writeAttribute(prop.types); } ::mlir::xevm::MMAShapeAttr MMAOp::getShape() { auto attr = getShapeAttr(); return ::llvm::cast<::mlir::xevm::MMAShapeAttr>(attr); } ::mlir::xevm::MMATypesAttr MMAOp::getTypes() { auto attr = getTypesAttr(); return ::llvm::cast<::mlir::xevm::MMATypesAttr>(attr); } void MMAOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { odsState.addOperands(a); odsState.addOperands(b); if (c) odsState.addOperands(c); odsState.getOrAddProperties().shape = shape; odsState.getOrAddProperties().types = types; odsState.addTypes(d); } MMAOp MMAOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(d), std::forward(a), std::forward(b), std::forward(c), std::forward(shape), std::forward(types)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MMAOp MMAOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type d, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { return create(builder, builder.getLoc(), std::forward(d), std::forward(a), std::forward(b), std::forward(c), std::forward(shape), std::forward(types)); } void MMAOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { odsState.addOperands(a); odsState.addOperands(b); if (c) odsState.addOperands(c); odsState.getOrAddProperties().shape = shape; odsState.getOrAddProperties().types = types; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } MMAOp MMAOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(a), std::forward(b), std::forward(c), std::forward(shape), std::forward(types)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MMAOp MMAOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value a, ::mlir::Value b, /*optional*/::mlir::Value c, ::mlir::xevm::MMAShapeAttr shape, ::mlir::xevm::MMATypesAttr types) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(a), std::forward(b), std::forward(c), std::forward(shape), std::forward(types)); } void MMAOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() >= 2u && "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."); } } MMAOp MMAOp::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__; } MMAOp MMAOp::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 MMAOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() >= 2u && "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); } MMAOp MMAOp::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__; } MMAOp MMAOp::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 MMAOp::verifyInvariantsImpl() { auto tblgen_shape = getProperties().shape; (void)tblgen_shape; if (!tblgen_shape) return emitOpError("requires attribute 'shape'"); auto tblgen_types = getProperties().types; (void)tblgen_types; if (!tblgen_types) return emitOpError("requires attribute 'types'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps8(*this, tblgen_shape, "shape"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps9(*this, tblgen_types, "types"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup1 = getODSOperands(1); for (auto v : valueGroup1) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } auto valueGroup2 = getODSOperands(2); if (valueGroup2.size() > 1) { return emitOpError("operand group starting at #") << index << " requires 0 or 1 element, but found " << valueGroup2.size(); } for (auto v : valueGroup2) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps3(*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_XeVMOps3(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult MMAOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult MMAOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::OpAsmParser::UnresolvedOperand aRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> aOperands(&aRawOperand, 1); ::llvm::SMLoc aOperandsLoc; (void)aOperandsLoc; ::mlir::OpAsmParser::UnresolvedOperand bRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> bOperands(&bRawOperand, 1); ::llvm::SMLoc bOperandsLoc; (void)bOperandsLoc; ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> cOperands; ::llvm::SMLoc cOperandsLoc; (void)cOperandsLoc; ::mlir::xevm::MMAShapeAttr shapeAttr; ::mlir::xevm::MMATypesAttr typesAttr; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; aOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(aRawOperand)) return ::mlir::failure(); if (parser.parseComma()) return ::mlir::failure(); bOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(bRawOperand)) return ::mlir::failure(); if (::mlir::succeeded(parser.parseOptionalComma())) { { cOperandsLoc = parser.getCurrentLocation(); ::mlir::OpAsmParser::UnresolvedOperand operand; ::mlir::OptionalParseResult parseResult = parser.parseOptionalOperand(operand); if (parseResult.has_value()) { if (failed(*parseResult)) return ::mlir::failure(); cOperands.push_back(operand); } } } if (parser.parseLBrace()) return ::mlir::failure(); if (parser.parseKeyword("shape")) return ::mlir::failure(); if (parser.parseEqual()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(shapeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (shapeAttr) result.getOrAddProperties().shape = shapeAttr; if (parser.parseComma()) return ::mlir::failure(); if (parser.parseKeyword("types")) return ::mlir::failure(); if (parser.parseEqual()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(typesAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (typesAttr) result.getOrAddProperties().types = typesAttr; if (parser.parseRBrace()) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(::llvm::concat(aOperands, bOperands, cOperands), allOperandTypes, parser.getNameLoc(), result.operands)) return ::mlir::failure(); return ::mlir::success(); } void MMAOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getA(); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter << getB(); if (getC()) { _odsPrinter << ","; _odsPrinter << ' '; if (::mlir::Value value = getC()) _odsPrinter << value; } _odsPrinter << ' '; _odsPrinter << "{"; _odsPrinter << "shape"; _odsPrinter << ' ' << "="; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getShapeAttr()); _odsPrinter << ","; _odsPrinter << ' ' << "types"; _odsPrinter << ' ' << "="; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getTypesAttr()); _odsPrinter << "}"; ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("shape"); elidedAttrs.push_back("types"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::MMAOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::MMAOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::MemfenceOp definitions //===----------------------------------------------------------------------===// namespace detail { MemfenceOpGenericAdaptorBase::MemfenceOpGenericAdaptorBase(MemfenceOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::mlir::xevm::MemScope MemfenceOpGenericAdaptorBase::getScope() { auto attr = getScopeAttr(); return attr.getValue(); } ::mlir::xevm::AddrSpaceAttr MemfenceOpGenericAdaptorBase::getAddrspaceAttr() { auto attr = ::llvm::dyn_cast_or_null<::mlir::xevm::AddrSpaceAttr>(getProperties().addrspace); return attr; } mlir::xevm::AddrSpace MemfenceOpGenericAdaptorBase::getAddrspace() { auto attr = getAddrspaceAttr(); return attr.getValue(); } } // namespace detail MemfenceOpAdaptor::MemfenceOpAdaptor(MemfenceOp op) : MemfenceOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult MemfenceOpAdaptor::verify(::mlir::Location loc) { auto tblgen_addrspace = getProperties().addrspace; (void)tblgen_addrspace; auto tblgen_scope = getProperties().scope; (void)tblgen_scope; if (!tblgen_scope) return emitError(loc, "'xevm.memfence' op requires attribute 'scope'"); if (tblgen_scope && !((::llvm::isa<::mlir::xevm::MemScopeAttr>(tblgen_scope)))) return emitError(loc, "'xevm.memfence' op attribute 'scope' failed to satisfy constraint: Describe memory scopes"); if (tblgen_addrspace && !((::llvm::isa<::mlir::xevm::AddrSpaceAttr>(tblgen_addrspace)))) return emitError(loc, "'xevm.memfence' op attribute 'addrspace' failed to satisfy constraint: Describe address spaces"); return ::mlir::success(); } ::llvm::LogicalResult MemfenceOp::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.addrspace; auto attr = dict.get("addrspace"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `addrspace` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.scope; auto attr = dict.get("scope"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `scope` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute MemfenceOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.addrspace; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("addrspace", propStorage)); } { const auto &propStorage = prop.scope; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("scope", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code MemfenceOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.addrspace.getAsOpaquePointer()), llvm::hash_value(prop.scope.getAsOpaquePointer())); } std::optional MemfenceOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "addrspace") return prop.addrspace; if (name == "scope") return prop.scope; return std::nullopt; } void MemfenceOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "addrspace") { prop.addrspace = ::llvm::dyn_cast_or_null>(value); return; } if (name == "scope") { prop.scope = ::llvm::dyn_cast_or_null>(value); return; } } void MemfenceOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.addrspace) attrs.append("addrspace", prop.addrspace); if (prop.scope) attrs.append("scope", prop.scope); } ::llvm::LogicalResult MemfenceOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getAddrspaceAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps11(attr, "addrspace", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getScopeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps10(attr, "scope", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult MemfenceOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.addrspace))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.scope))) return ::mlir::failure(); return ::mlir::success(); } void MemfenceOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.addrspace); writer.writeAttribute(prop.scope); } ::mlir::xevm::MemScope MemfenceOp::getScope() { auto attr = getScopeAttr(); return attr.getValue(); } mlir::xevm::AddrSpace MemfenceOp::getAddrspace() { auto attr = getAddrspaceAttr(); return attr.getValue(); } void MemfenceOp::setScope(::mlir::xevm::MemScope attrValue) { getProperties().scope = ::mlir::xevm::MemScopeAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue); } void MemfenceOp::setAddrspace(mlir::xevm::AddrSpace attrValue) { getProperties().addrspace = mlir::xevm::AddrSpaceAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue); } void MemfenceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { odsState.getOrAddProperties().scope = scope; if (addrspace) { odsState.getOrAddProperties().addrspace = addrspace; } } MemfenceOp MemfenceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(scope), std::forward(addrspace)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MemfenceOp MemfenceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { return create(builder, builder.getLoc(), std::forward(scope), std::forward(addrspace)); } void MemfenceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { odsState.getOrAddProperties().scope = scope; if (addrspace) { odsState.getOrAddProperties().addrspace = addrspace; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } MemfenceOp MemfenceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(scope), std::forward(addrspace)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MemfenceOp MemfenceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScopeAttr scope, ::mlir::xevm::AddrSpaceAttr addrspace) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(scope), std::forward(addrspace)); } void MemfenceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { odsState.getOrAddProperties().scope = ::mlir::xevm::MemScopeAttr::get(odsBuilder.getContext(), scope); odsState.getOrAddProperties().addrspace = mlir::xevm::AddrSpaceAttr::get(odsBuilder.getContext(), addrspace); } MemfenceOp MemfenceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(scope), std::forward(addrspace)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MemfenceOp MemfenceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { return create(builder, builder.getLoc(), std::forward(scope), std::forward(addrspace)); } void MemfenceOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { odsState.getOrAddProperties().scope = ::mlir::xevm::MemScopeAttr::get(odsBuilder.getContext(), scope); odsState.getOrAddProperties().addrspace = mlir::xevm::AddrSpaceAttr::get(odsBuilder.getContext(), addrspace); assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } MemfenceOp MemfenceOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(scope), std::forward(addrspace)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } MemfenceOp MemfenceOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::xevm::MemScope scope, mlir::xevm::AddrSpace addrspace) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(scope), std::forward(addrspace)); } void MemfenceOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } MemfenceOp MemfenceOp::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__; } MemfenceOp MemfenceOp::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 MemfenceOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } MemfenceOp MemfenceOp::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__; } MemfenceOp MemfenceOp::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 MemfenceOp::populateDefaultProperties(::mlir::OperationName opName, Properties &properties) { ::mlir::Builder odsBuilder(opName.getContext()); if (!properties.addrspace) properties.addrspace = mlir::xevm::AddrSpaceAttr::get(odsBuilder.getContext(), mlir::xevm::AddrSpace::GENERIC); } ::llvm::LogicalResult MemfenceOp::verifyInvariantsImpl() { auto tblgen_addrspace = getProperties().addrspace; (void)tblgen_addrspace; auto tblgen_scope = getProperties().scope; (void)tblgen_scope; if (!tblgen_scope) return emitOpError("requires attribute 'scope'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps10(*this, tblgen_scope, "scope"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps11(*this, tblgen_addrspace, "addrspace"))) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult MemfenceOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult MemfenceOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { if (parseProperties(parser, result)) return ::mlir::failure(); { 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(); } return ::mlir::success(); } ::llvm::LogicalResult MemfenceOp::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.scope; auto scopeAttrName = ::mlir::StringAttr::get(ctx, "scope"); auto attr = dict.get(scopeAttrName); usedKeys.insert(scopeAttrName); if (attr || /*isRequired=*/true) { if (!attr) { emitError() << "expected key entry for scope in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `scope` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.addrspace; auto addrspaceAttrName = ::mlir::StringAttr::get(ctx, "addrspace"); auto attr = dict.get(addrspaceAttrName); usedKeys.insert(addrspaceAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for addrspace in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `addrspace` 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 MemfenceOp::print(::mlir::OpAsmPrinter &_odsPrinter) { ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; { ::mlir::Builder odsBuilder(getContext()); ::mlir::Attribute attr = getAddrspaceAttr(); if(attr && (attr == mlir::xevm::AddrSpaceAttr::get(odsBuilder.getContext(), mlir::xevm::AddrSpace::GENERIC))) elidedProps.push_back("addrspace"); } _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; { ::mlir::Builder odsBuilder(getContext()); ::mlir::Attribute attr = getAddrspaceAttr(); if(attr && (attr == mlir::xevm::AddrSpaceAttr::get(odsBuilder.getContext(), mlir::xevm::AddrSpace::GENERIC))) elidedAttrs.push_back("addrspace"); } _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::MemfenceOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::MemfenceOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::PrefetchOp definitions //===----------------------------------------------------------------------===// namespace detail { PrefetchOpGenericAdaptorBase::PrefetchOpGenericAdaptorBase(PrefetchOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::xevm::LoadCacheControl> PrefetchOpGenericAdaptorBase::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } } // namespace detail PrefetchOpAdaptor::PrefetchOpAdaptor(PrefetchOp op) : PrefetchOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult PrefetchOpAdaptor::verify(::mlir::Location loc) { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (tblgen_cache_control && !((::llvm::isa<::mlir::xevm::LoadCacheControlAttr>(tblgen_cache_control)))) return emitError(loc, "'xevm.prefetch' op attribute 'cache_control' failed to satisfy constraint: Describe the cache settings for load operators"); return ::mlir::success(); } ::llvm::LogicalResult PrefetchOp::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.cache_control; auto attr = dict.get("cache_control"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute PrefetchOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.cache_control; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("cache_control", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code PrefetchOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.cache_control.getAsOpaquePointer())); } std::optional PrefetchOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "cache_control") return prop.cache_control; return std::nullopt; } void PrefetchOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "cache_control") { prop.cache_control = ::llvm::dyn_cast_or_null>(value); return; } } void PrefetchOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.cache_control) attrs.append("cache_control", prop.cache_control); } ::llvm::LogicalResult PrefetchOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getCacheControlAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(attr, "cache_control", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult PrefetchOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.cache_control))) return ::mlir::failure(); return ::mlir::success(); } void PrefetchOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.cache_control); } ::std::optional<::mlir::xevm::LoadCacheControl> PrefetchOp::getCacheControl() { auto attr = getCacheControlAttr(); return attr ? ::std::optional<::mlir::xevm::LoadCacheControl>(attr.getValue()) : (::std::nullopt); } void PrefetchOp::setCacheControl(::std::optional<::mlir::xevm::LoadCacheControl> attrValue) { auto &odsProp = getProperties().cache_control; if (attrValue) odsProp = ::mlir::xevm::LoadCacheControlAttr::get(::mlir::Builder((*this)->getContext()).getContext(), *attrValue); else odsProp = nullptr; } void PrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } } PrefetchOp PrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(ptr), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } PrefetchOp PrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(ptr), std::forward(cache_control)); } void PrefetchOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { odsState.addOperands(ptr); if (cache_control) { odsState.getOrAddProperties().cache_control = cache_control; } assert(resultTypes.size() == 0u && "mismatched number of results"); odsState.addTypes(resultTypes); } PrefetchOp PrefetchOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(ptr), std::forward(cache_control)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } PrefetchOp PrefetchOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value ptr, /*optional*/::mlir::xevm::LoadCacheControlAttr cache_control) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(ptr), std::forward(cache_control)); } void PrefetchOp::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."); } } PrefetchOp PrefetchOp::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__; } PrefetchOp PrefetchOp::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 PrefetchOp::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); } PrefetchOp PrefetchOp::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__; } PrefetchOp PrefetchOp::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 PrefetchOp::verifyInvariantsImpl() { auto tblgen_cache_control = getProperties().cache_control; (void)tblgen_cache_control; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps3(*this, tblgen_cache_control, "cache_control"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps9(*this, v.getType(), "operand", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult PrefetchOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult PrefetchOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> allOperands; ::llvm::SmallVector<::mlir::Type, 1> allOperandTypes; [[maybe_unused]] ::llvm::SMLoc allOperandLoc = parser.getCurrentLocation(); if (parser.parseOperandList(allOperands)) return ::mlir::failure(); if (parseProperties(parser, result)) return ::mlir::failure(); { 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.parseLParen()) return ::mlir::failure(); if (parser.parseTypeList(allOperandTypes)) return ::mlir::failure(); if (parser.parseRParen()) return ::mlir::failure(); if (parser.resolveOperands(allOperands, allOperandTypes, allOperandLoc, result.operands)) return ::mlir::failure(); return ::mlir::success(); } ::llvm::LogicalResult PrefetchOp::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.cache_control; auto cache_controlAttrName = ::mlir::StringAttr::get(ctx, "cache_control"); auto attr = dict.get(cache_controlAttrName); usedKeys.insert(cache_controlAttrName); if (attr || /*isRequired=*/false) { if (!attr) { emitError() << "expected key entry for cache_control in DictionaryAttr to set " "Properties."; return ::mlir::failure(); } auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `cache_control` 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 PrefetchOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getOperation()->getOperands(); ::llvm::SmallVector<::llvm::StringRef, 2> elidedProps; _odsPrinter << " "; printProperties(this->getContext(), _odsPrinter, getProperties(), elidedProps); ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; _odsPrinter.printOptionalAttrDict(llvm::to_vector((*this)->getDiscardableAttrs()), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' ' << "("; _odsPrinter << getOperation()->getOperandTypes(); _odsPrinter << ")"; } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::PrefetchOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::PrefetchOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::SubgroupIdOp definitions //===----------------------------------------------------------------------===// namespace detail { SubgroupIdOpGenericAdaptorBase::SubgroupIdOpGenericAdaptorBase(SubgroupIdOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> SubgroupIdOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail SubgroupIdOpAdaptor::SubgroupIdOpAdaptor(SubgroupIdOp op) : SubgroupIdOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult SubgroupIdOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.subgroup_id' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult SubgroupIdOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute SubgroupIdOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code SubgroupIdOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional SubgroupIdOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void SubgroupIdOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void SubgroupIdOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult SubgroupIdOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult SubgroupIdOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void SubgroupIdOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> SubgroupIdOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void SubgroupIdOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } SubgroupIdOp SubgroupIdOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } SubgroupIdOp SubgroupIdOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void SubgroupIdOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } SubgroupIdOp SubgroupIdOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } SubgroupIdOp SubgroupIdOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void SubgroupIdOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } SubgroupIdOp SubgroupIdOp::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__; } SubgroupIdOp SubgroupIdOp::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 SubgroupIdOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } SubgroupIdOp SubgroupIdOp::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__; } SubgroupIdOp SubgroupIdOp::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 SubgroupIdOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult SubgroupIdOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult SubgroupIdOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void SubgroupIdOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::SubgroupIdOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::SubgroupIdOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::SubgroupSizeOp definitions //===----------------------------------------------------------------------===// namespace detail { SubgroupSizeOpGenericAdaptorBase::SubgroupSizeOpGenericAdaptorBase(SubgroupSizeOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> SubgroupSizeOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail SubgroupSizeOpAdaptor::SubgroupSizeOpAdaptor(SubgroupSizeOp op) : SubgroupSizeOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult SubgroupSizeOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.subgroup_size' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult SubgroupSizeOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute SubgroupSizeOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code SubgroupSizeOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional SubgroupSizeOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void SubgroupSizeOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void SubgroupSizeOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult SubgroupSizeOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult SubgroupSizeOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void SubgroupSizeOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> SubgroupSizeOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void SubgroupSizeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } SubgroupSizeOp SubgroupSizeOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } SubgroupSizeOp SubgroupSizeOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void SubgroupSizeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } SubgroupSizeOp SubgroupSizeOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } SubgroupSizeOp SubgroupSizeOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void SubgroupSizeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } SubgroupSizeOp SubgroupSizeOp::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__; } SubgroupSizeOp SubgroupSizeOp::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 SubgroupSizeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } SubgroupSizeOp SubgroupSizeOp::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__; } SubgroupSizeOp SubgroupSizeOp::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 SubgroupSizeOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult SubgroupSizeOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult SubgroupSizeOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void SubgroupSizeOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::SubgroupSizeOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::SubgroupSizeOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::TruncfOp definitions //===----------------------------------------------------------------------===// namespace detail { TruncfOpGenericAdaptorBase::TruncfOpGenericAdaptorBase(TruncfOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::mlir::xevm::TruncfSrcElemTypeAttr TruncfOpGenericAdaptorBase::getSrcEtype() { auto attr = getSrcEtypeAttr(); return ::llvm::cast<::mlir::xevm::TruncfSrcElemTypeAttr>(attr); } ::mlir::xevm::TruncfDstElemTypeAttr TruncfOpGenericAdaptorBase::getDstEtype() { auto attr = getDstEtypeAttr(); return ::llvm::cast<::mlir::xevm::TruncfDstElemTypeAttr>(attr); } } // namespace detail TruncfOpAdaptor::TruncfOpAdaptor(TruncfOp op) : TruncfOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult TruncfOpAdaptor::verify(::mlir::Location loc) { auto tblgen_dst_etype = getProperties().dst_etype; (void)tblgen_dst_etype; if (!tblgen_dst_etype) return emitError(loc, "'xevm.truncf' op requires attribute 'dst_etype'"); auto tblgen_src_etype = getProperties().src_etype; (void)tblgen_src_etype; if (!tblgen_src_etype) return emitError(loc, "'xevm.truncf' op requires attribute 'src_etype'"); if (tblgen_src_etype && !((::llvm::isa<::mlir::xevm::TruncfSrcElemTypeAttr>(tblgen_src_etype)))) return emitError(loc, "'xevm.truncf' op attribute 'src_etype' failed to satisfy constraint: "); if (tblgen_dst_etype && !((::llvm::isa<::mlir::xevm::TruncfDstElemTypeAttr>(tblgen_dst_etype)))) return emitError(loc, "'xevm.truncf' op attribute 'dst_etype' failed to satisfy constraint: "); return ::mlir::success(); } ::llvm::LogicalResult TruncfOp::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_etype; auto attr = dict.get("dst_etype"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `dst_etype` in property conversion: " << attr; return ::mlir::failure(); } } } { auto &propStorage = prop.src_etype; auto attr = dict.get("src_etype"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `src_etype` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute TruncfOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.dst_etype; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("dst_etype", propStorage)); } { const auto &propStorage = prop.src_etype; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("src_etype", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code TruncfOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.dst_etype.getAsOpaquePointer()), llvm::hash_value(prop.src_etype.getAsOpaquePointer())); } std::optional TruncfOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "dst_etype") return prop.dst_etype; if (name == "src_etype") return prop.src_etype; return std::nullopt; } void TruncfOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "dst_etype") { prop.dst_etype = ::llvm::dyn_cast_or_null>(value); return; } if (name == "src_etype") { prop.src_etype = ::llvm::dyn_cast_or_null>(value); return; } } void TruncfOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.dst_etype) attrs.append("dst_etype", prop.dst_etype); if (prop.src_etype) attrs.append("src_etype", prop.src_etype); } ::llvm::LogicalResult TruncfOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getDstEtypeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps13(attr, "dst_etype", emitError))) return ::mlir::failure(); } { ::mlir::Attribute attr = attrs.get(getSrcEtypeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps12(attr, "src_etype", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult TruncfOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readAttribute(prop.dst_etype))) return ::mlir::failure(); if (::mlir::failed(reader.readAttribute(prop.src_etype))) return ::mlir::failure(); return ::mlir::success(); } void TruncfOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeAttribute(prop.dst_etype); writer.writeAttribute(prop.src_etype); } ::mlir::xevm::TruncfSrcElemTypeAttr TruncfOp::getSrcEtype() { auto attr = getSrcEtypeAttr(); return ::llvm::cast<::mlir::xevm::TruncfSrcElemTypeAttr>(attr); } ::mlir::xevm::TruncfDstElemTypeAttr TruncfOp::getDstEtype() { auto attr = getDstEtypeAttr(); return ::llvm::cast<::mlir::xevm::TruncfDstElemTypeAttr>(attr); } void TruncfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { odsState.addOperands(src); odsState.getOrAddProperties().src_etype = src_etype; odsState.getOrAddProperties().dst_etype = dst_etype; odsState.addTypes(dst); } TruncfOp TruncfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(dst), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } TruncfOp TruncfOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type dst, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { return create(builder, builder.getLoc(), std::forward(dst), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); } void TruncfOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { odsState.addOperands(src); odsState.getOrAddProperties().src_etype = src_etype; odsState.getOrAddProperties().dst_etype = dst_etype; assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } TruncfOp TruncfOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } TruncfOp TruncfOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, ::mlir::Value src, ::mlir::xevm::TruncfSrcElemTypeAttr src_etype, ::mlir::xevm::TruncfDstElemTypeAttr dst_etype) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(src), std::forward(src_etype), std::forward(dst_etype)); } void TruncfOp::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."); } } TruncfOp TruncfOp::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__; } TruncfOp TruncfOp::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 TruncfOp::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); } TruncfOp TruncfOp::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__; } TruncfOp TruncfOp::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 TruncfOp::verifyInvariantsImpl() { auto tblgen_dst_etype = getProperties().dst_etype; (void)tblgen_dst_etype; if (!tblgen_dst_etype) return emitOpError("requires attribute 'dst_etype'"); auto tblgen_src_etype = getProperties().src_etype; (void)tblgen_src_etype; if (!tblgen_src_etype) return emitOpError("requires attribute 'src_etype'"); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps12(*this, tblgen_src_etype, "src_etype"))) return ::mlir::failure(); if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps13(*this, tblgen_dst_etype, "dst_etype"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSOperands(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps6(*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_XeVMOps5(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult TruncfOp::verifyInvariants() { if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify())) return ::mlir::success(); return ::mlir::failure(); } ::mlir::ParseResult TruncfOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::OpAsmParser::UnresolvedOperand srcRawOperand{}; ::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> srcOperands(&srcRawOperand, 1); ::llvm::SMLoc srcOperandsLoc; (void)srcOperandsLoc; ::mlir::xevm::TruncfSrcElemTypeAttr src_etypeAttr; ::mlir::xevm::TruncfDstElemTypeAttr dst_etypeAttr; ::llvm::ArrayRef<::mlir::Type> allOperandTypes; ::llvm::ArrayRef<::mlir::Type> allResultTypes; srcOperandsLoc = parser.getCurrentLocation(); if (parser.parseOperand(srcRawOperand)) return ::mlir::failure(); if (parser.parseLBrace()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(src_etypeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (src_etypeAttr) result.getOrAddProperties().src_etype = src_etypeAttr; if (parser.parseComma()) return ::mlir::failure(); if (parser.parseCustomAttributeWithFallback(dst_etypeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (dst_etypeAttr) result.getOrAddProperties().dst_etype = dst_etypeAttr; if (parser.parseRBrace()) return ::mlir::failure(); { 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::FunctionType allOperand__allResult_functionType; if (parser.parseType(allOperand__allResult_functionType)) return ::mlir::failure(); allOperandTypes = allOperand__allResult_functionType.getInputs(); allResultTypes = allOperand__allResult_functionType.getResults(); result.addTypes(allResultTypes); if (parser.resolveOperands(srcOperands, allOperandTypes, parser.getNameLoc(), result.operands)) return ::mlir::failure(); return ::mlir::success(); } void TruncfOp::print(::mlir::OpAsmPrinter &_odsPrinter) { _odsPrinter << ' '; _odsPrinter << getSrc(); _odsPrinter << ' '; _odsPrinter << "{"; _odsPrinter.printStrippedAttrOrType(getSrcEtypeAttr()); _odsPrinter << ","; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getDstEtypeAttr()); _odsPrinter << "}"; ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("src_etype"); elidedAttrs.push_back("dst_etype"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; _odsPrinter.printFunctionalType(getOperation()->getOperandTypes(), getOperation()->getResultTypes()); } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::TruncfOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::TruncfOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupDimXOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupDimXOpGenericAdaptorBase::WorkgroupDimXOpGenericAdaptorBase(WorkgroupDimXOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimXOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupDimXOpAdaptor::WorkgroupDimXOpAdaptor(WorkgroupDimXOp op) : WorkgroupDimXOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupDimXOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_size.x' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimXOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupDimXOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupDimXOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupDimXOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupDimXOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupDimXOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupDimXOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimXOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupDimXOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimXOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupDimXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupDimXOp WorkgroupDimXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimXOp WorkgroupDimXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupDimXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupDimXOp WorkgroupDimXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimXOp WorkgroupDimXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupDimXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupDimXOp WorkgroupDimXOp::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__; } WorkgroupDimXOp WorkgroupDimXOp::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 WorkgroupDimXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupDimXOp WorkgroupDimXOp::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__; } WorkgroupDimXOp WorkgroupDimXOp::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 WorkgroupDimXOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimXOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupDimXOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupDimXOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupDimXOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupDimXOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupDimYOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupDimYOpGenericAdaptorBase::WorkgroupDimYOpGenericAdaptorBase(WorkgroupDimYOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimYOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupDimYOpAdaptor::WorkgroupDimYOpAdaptor(WorkgroupDimYOp op) : WorkgroupDimYOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupDimYOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_size.y' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimYOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupDimYOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupDimYOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupDimYOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupDimYOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupDimYOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupDimYOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimYOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupDimYOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimYOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupDimYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupDimYOp WorkgroupDimYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimYOp WorkgroupDimYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupDimYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupDimYOp WorkgroupDimYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimYOp WorkgroupDimYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupDimYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupDimYOp WorkgroupDimYOp::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__; } WorkgroupDimYOp WorkgroupDimYOp::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 WorkgroupDimYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupDimYOp WorkgroupDimYOp::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__; } WorkgroupDimYOp WorkgroupDimYOp::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 WorkgroupDimYOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimYOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupDimYOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupDimYOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupDimYOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupDimYOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupDimZOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupDimZOpGenericAdaptorBase::WorkgroupDimZOpGenericAdaptorBase(WorkgroupDimZOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimZOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupDimZOpAdaptor::WorkgroupDimZOpAdaptor(WorkgroupDimZOp op) : WorkgroupDimZOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupDimZOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_size.z' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimZOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupDimZOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupDimZOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupDimZOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupDimZOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupDimZOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupDimZOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimZOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupDimZOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupDimZOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupDimZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupDimZOp WorkgroupDimZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimZOp WorkgroupDimZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupDimZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupDimZOp WorkgroupDimZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupDimZOp WorkgroupDimZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupDimZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupDimZOp WorkgroupDimZOp::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__; } WorkgroupDimZOp WorkgroupDimZOp::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 WorkgroupDimZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupDimZOp WorkgroupDimZOp::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__; } WorkgroupDimZOp WorkgroupDimZOp::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 WorkgroupDimZOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupDimZOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupDimZOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupDimZOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupDimZOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupDimZOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupIdXOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupIdXOpGenericAdaptorBase::WorkgroupIdXOpGenericAdaptorBase(WorkgroupIdXOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdXOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupIdXOpAdaptor::WorkgroupIdXOpAdaptor(WorkgroupIdXOp op) : WorkgroupIdXOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupIdXOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_id.x' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdXOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupIdXOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupIdXOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupIdXOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupIdXOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupIdXOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupIdXOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdXOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupIdXOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdXOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupIdXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupIdXOp WorkgroupIdXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdXOp WorkgroupIdXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupIdXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupIdXOp WorkgroupIdXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdXOp WorkgroupIdXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupIdXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupIdXOp WorkgroupIdXOp::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__; } WorkgroupIdXOp WorkgroupIdXOp::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 WorkgroupIdXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupIdXOp WorkgroupIdXOp::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__; } WorkgroupIdXOp WorkgroupIdXOp::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 WorkgroupIdXOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdXOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupIdXOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupIdXOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupIdXOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupIdXOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupIdYOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupIdYOpGenericAdaptorBase::WorkgroupIdYOpGenericAdaptorBase(WorkgroupIdYOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdYOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupIdYOpAdaptor::WorkgroupIdYOpAdaptor(WorkgroupIdYOp op) : WorkgroupIdYOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupIdYOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_id.y' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdYOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupIdYOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupIdYOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupIdYOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupIdYOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupIdYOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupIdYOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdYOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupIdYOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdYOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupIdYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupIdYOp WorkgroupIdYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdYOp WorkgroupIdYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupIdYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupIdYOp WorkgroupIdYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdYOp WorkgroupIdYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupIdYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupIdYOp WorkgroupIdYOp::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__; } WorkgroupIdYOp WorkgroupIdYOp::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 WorkgroupIdYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupIdYOp WorkgroupIdYOp::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__; } WorkgroupIdYOp WorkgroupIdYOp::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 WorkgroupIdYOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdYOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupIdYOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupIdYOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupIdYOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupIdYOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkgroupIdZOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkgroupIdZOpGenericAdaptorBase::WorkgroupIdZOpGenericAdaptorBase(WorkgroupIdZOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdZOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkgroupIdZOpAdaptor::WorkgroupIdZOpAdaptor(WorkgroupIdZOp op) : WorkgroupIdZOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkgroupIdZOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.group_id.z' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdZOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkgroupIdZOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkgroupIdZOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkgroupIdZOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkgroupIdZOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkgroupIdZOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkgroupIdZOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdZOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkgroupIdZOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkgroupIdZOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkgroupIdZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkgroupIdZOp WorkgroupIdZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdZOp WorkgroupIdZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkgroupIdZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkgroupIdZOp WorkgroupIdZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkgroupIdZOp WorkgroupIdZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkgroupIdZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkgroupIdZOp WorkgroupIdZOp::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__; } WorkgroupIdZOp WorkgroupIdZOp::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 WorkgroupIdZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkgroupIdZOp WorkgroupIdZOp::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__; } WorkgroupIdZOp WorkgroupIdZOp::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 WorkgroupIdZOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkgroupIdZOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkgroupIdZOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkgroupIdZOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkgroupIdZOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkgroupIdZOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkitemIdXOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkitemIdXOpGenericAdaptorBase::WorkitemIdXOpGenericAdaptorBase(WorkitemIdXOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdXOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkitemIdXOpAdaptor::WorkitemIdXOpAdaptor(WorkitemIdXOp op) : WorkitemIdXOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkitemIdXOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_id.x' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdXOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkitemIdXOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkitemIdXOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkitemIdXOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkitemIdXOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkitemIdXOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkitemIdXOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdXOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkitemIdXOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdXOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkitemIdXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkitemIdXOp WorkitemIdXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdXOp WorkitemIdXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkitemIdXOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkitemIdXOp WorkitemIdXOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdXOp WorkitemIdXOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkitemIdXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkitemIdXOp WorkitemIdXOp::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__; } WorkitemIdXOp WorkitemIdXOp::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 WorkitemIdXOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkitemIdXOp WorkitemIdXOp::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__; } WorkitemIdXOp WorkitemIdXOp::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 WorkitemIdXOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdXOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkitemIdXOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkitemIdXOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkitemIdXOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkitemIdXOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkitemIdYOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkitemIdYOpGenericAdaptorBase::WorkitemIdYOpGenericAdaptorBase(WorkitemIdYOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdYOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkitemIdYOpAdaptor::WorkitemIdYOpAdaptor(WorkitemIdYOp op) : WorkitemIdYOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkitemIdYOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_id.y' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdYOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkitemIdYOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkitemIdYOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkitemIdYOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkitemIdYOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkitemIdYOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkitemIdYOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdYOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkitemIdYOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdYOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkitemIdYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkitemIdYOp WorkitemIdYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdYOp WorkitemIdYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkitemIdYOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkitemIdYOp WorkitemIdYOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdYOp WorkitemIdYOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkitemIdYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkitemIdYOp WorkitemIdYOp::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__; } WorkitemIdYOp WorkitemIdYOp::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 WorkitemIdYOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkitemIdYOp WorkitemIdYOp::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__; } WorkitemIdYOp WorkitemIdYOp::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 WorkitemIdYOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdYOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkitemIdYOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkitemIdYOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkitemIdYOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkitemIdYOpGenericAdaptorBase::Properties) namespace mlir::xevm { //===----------------------------------------------------------------------===// // ::mlir::xevm::WorkitemIdZOp definitions //===----------------------------------------------------------------------===// namespace detail { WorkitemIdZOpGenericAdaptorBase::WorkitemIdZOpGenericAdaptorBase(WorkitemIdZOp op) : odsAttrs(op->getRawDictionaryAttrs()), odsOpName(op->getName()), properties(op.getProperties()), odsRegions(op->getRegions()) {} ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdZOpGenericAdaptorBase::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } } // namespace detail WorkitemIdZOpAdaptor::WorkitemIdZOpAdaptor(WorkitemIdZOp op) : WorkitemIdZOpGenericAdaptor(op->getOperands(), op) {} ::llvm::LogicalResult WorkitemIdZOpAdaptor::verify(::mlir::Location loc) { auto tblgen_range = getProperties().range; (void)tblgen_range; if (tblgen_range && !((::llvm::isa<::mlir::LLVM::ConstantRangeAttr>(tblgen_range)))) return emitError(loc, "'xevm.local_id.z' op attribute 'range' failed to satisfy constraint: A range of two integers, corresponding to LLVM's ConstantRange"); return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdZOp::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.range; auto attr = dict.get("range"); if (attr) { auto convertedAttr = ::llvm::dyn_cast>(attr); if (convertedAttr) { propStorage = convertedAttr; } else { emitError() << "Invalid attribute `range` in property conversion: " << attr; return ::mlir::failure(); } } } return ::mlir::success(); } ::mlir::Attribute WorkitemIdZOp::getPropertiesAsAttr(::mlir::MLIRContext *ctx, const Properties &prop) { ::mlir::SmallVector<::mlir::NamedAttribute> attrs; ::mlir::Builder odsBuilder{ctx}; { const auto &propStorage = prop.range; if (propStorage) attrs.push_back(odsBuilder.getNamedAttr("range", propStorage)); } if (!attrs.empty()) return odsBuilder.getDictionaryAttr(attrs); return {}; } llvm::hash_code WorkitemIdZOp::computePropertiesHash(const Properties &prop) { using llvm::hash_value; return llvm::hash_combine( llvm::hash_value(prop.range.getAsOpaquePointer())); } std::optional WorkitemIdZOp::getInherentAttr(::mlir::MLIRContext *ctx, const Properties &prop, llvm::StringRef name) { if (name == "range") return prop.range; return std::nullopt; } void WorkitemIdZOp::setInherentAttr(Properties &prop, llvm::StringRef name, mlir::Attribute value) { if (name == "range") { prop.range = ::llvm::dyn_cast_or_null>(value); return; } } void WorkitemIdZOp::populateInherentAttrs(::mlir::MLIRContext *ctx, const Properties &prop, ::mlir::NamedAttrList &attrs) { if (prop.range) attrs.append("range", prop.range); } ::llvm::LogicalResult WorkitemIdZOp::verifyInherentAttrs(::mlir::OperationName opName, ::mlir::NamedAttrList &attrs, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) { { ::mlir::Attribute attr = attrs.get(getRangeAttrName(opName)); if (attr && ::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(attr, "range", emitError))) return ::mlir::failure(); } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdZOp::readProperties(::mlir::DialectBytecodeReader &reader, ::mlir::OperationState &state) { auto &prop = state.getOrAddProperties(); (void)prop; if (::mlir::failed(reader.readOptionalAttribute(prop.range))) return ::mlir::failure(); return ::mlir::success(); } void WorkitemIdZOp::writeProperties(::mlir::DialectBytecodeWriter &writer) { auto &prop = getProperties(); (void)prop; writer.writeOptionalAttribute(prop.range); } ::std::optional<::mlir::LLVM::ConstantRangeAttr> WorkitemIdZOp::getRange() { auto attr = getRangeAttr(); return attr ? ::std::optional<::mlir::LLVM::ConstantRangeAttr>(::llvm::cast<::mlir::LLVM::ConstantRangeAttr>(attr)) : (::std::nullopt); } void WorkitemIdZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } odsState.addTypes(res); } WorkitemIdZOp WorkitemIdZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(res), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdZOp WorkitemIdZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::Type res, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(res), std::forward(range)); } void WorkitemIdZOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { if (range) { odsState.getOrAddProperties().range = range; } assert(resultTypes.size() == 1u && "mismatched number of results"); odsState.addTypes(resultTypes); } WorkitemIdZOp WorkitemIdZOp::create(::mlir::OpBuilder &builder, ::mlir::Location location, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { ::mlir::OperationState __state__(location, getOperationName()); build(builder, __state__, std::forward(resultTypes), std::forward(range)); auto __res__ = ::llvm::dyn_cast(builder.create(__state__)); assert(__res__ && "builder didn't return the right type"); return __res__; } WorkitemIdZOp WorkitemIdZOp::create(::mlir::ImplicitLocOpBuilder &builder, ::mlir::TypeRange resultTypes, /*optional*/::mlir::LLVM::ConstantRangeAttr range) { return create(builder, builder.getLoc(), std::forward(resultTypes), std::forward(range)); } void WorkitemIdZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) { assert(operands.size() == 0u && "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."); } } WorkitemIdZOp WorkitemIdZOp::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__; } WorkitemIdZOp WorkitemIdZOp::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 WorkitemIdZOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, const Properties &properties, ::llvm::ArrayRef<::mlir::NamedAttribute> discardableAttributes) { assert(operands.size() == 0u && "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); } WorkitemIdZOp WorkitemIdZOp::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__; } WorkitemIdZOp WorkitemIdZOp::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 WorkitemIdZOp::verifyInvariantsImpl() { auto tblgen_range = getProperties().range; (void)tblgen_range; if (::mlir::failed(__mlir_ods_local_attr_constraint_XeVMOps7(*this, tblgen_range, "range"))) return ::mlir::failure(); { unsigned index = 0; (void)index; auto valueGroup0 = getODSResults(0); for (auto v : valueGroup0) { if (::mlir::failed(__mlir_ods_local_type_constraint_XeVMOps7(*this, v.getType(), "result", index++))) return ::mlir::failure(); } } return ::mlir::success(); } ::llvm::LogicalResult WorkitemIdZOp::verifyInvariants() { return verifyInvariantsImpl(); } ::mlir::ParseResult WorkitemIdZOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) { ::mlir::LLVM::ConstantRangeAttr rangeAttr; ::mlir::Type resRawType{}; ::llvm::ArrayRef<::mlir::Type> resTypes(&resRawType, 1); if (::mlir::succeeded(parser.parseOptionalKeyword("range"))) { if (parser.parseCustomAttributeWithFallback(rangeAttr, ::mlir::Type{})) { return ::mlir::failure(); } if (rangeAttr) result.getOrAddProperties().range = rangeAttr; } { 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(); resRawType = type; } result.addTypes(resTypes); return ::mlir::success(); } void WorkitemIdZOp::print(::mlir::OpAsmPrinter &_odsPrinter) { if (getRangeAttr()) { _odsPrinter << ' ' << "range"; _odsPrinter << ' '; _odsPrinter.printStrippedAttrOrType(getRangeAttr()); } ::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; elidedAttrs.push_back("range"); _odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs); _odsPrinter << ' ' << ":"; _odsPrinter << ' '; { auto type = getRes().getType(); if (auto validType = ::llvm::dyn_cast<::mlir::Type>(type)) _odsPrinter.printStrippedAttrOrType(validType); else _odsPrinter << type; } } } // namespace mlir::xevm MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::WorkitemIdZOp) MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::xevm::detail::WorkitemIdZOpGenericAdaptorBase::Properties) #endif // GET_OP_CLASSES