27#include "llvm/ADT/TypeSwitch.h"
32#include "mlir/Dialect/LLVMIR/ROCDLOpsDialect.cpp.inc"
41ParseResult RawBufferLoadOp::parse(
OpAsmParser &parser,
51 auto i32x4Ty = VectorType::get({4}, int32Ty);
52 return parser.
resolveOperands(ops, {i32x4Ty, int32Ty, int32Ty, int32Ty},
57 p <<
" " << getOperands() <<
" : " << getRes().getType();
63ParseResult RawBufferStoreOp::parse(
OpAsmParser &parser,
72 auto i32x4Ty = VectorType::get({4}, int32Ty);
74 if (parser.
resolveOperands(ops, {type, i32x4Ty, int32Ty, int32Ty, int32Ty},
81 p <<
" " << getOperands() <<
" : " << getVdata().getType();
87ParseResult RawBufferAtomicFAddOp::parse(
OpAsmParser &parser,
96 auto i32x4Ty = VectorType::get({4}, int32Ty);
98 if (parser.
resolveOperands(ops, {type, i32x4Ty, int32Ty, int32Ty, int32Ty},
105 p <<
" " << getOperands() <<
" : " << getVdata().getType();
111ParseResult RawBufferAtomicFMaxOp::parse(
OpAsmParser &parser,
120 auto i32x4Ty = VectorType::get({4}, int32Ty);
122 if (parser.
resolveOperands(ops, {type, i32x4Ty, int32Ty, int32Ty, int32Ty},
129 p <<
" " << getOperands() <<
" : " << getVdata().getType();
135ParseResult RawBufferAtomicSMaxOp::parse(
OpAsmParser &parser,
144 auto i32x4Ty = VectorType::get({4}, int32Ty);
146 if (parser.
resolveOperands(ops, {type, i32x4Ty, int32Ty, int32Ty, int32Ty},
153 p <<
" " << getOperands() <<
" : " << getVdata().getType();
159ParseResult RawBufferAtomicUMinOp::parse(
OpAsmParser &parser,
168 auto i32x4Ty = VectorType::get({4}, int32Ty);
170 if (parser.
resolveOperands(ops, {type, i32x4Ty, int32Ty, int32Ty, int32Ty},
177 p <<
" " << getOperands() <<
" : " << getVdata().getType();
187 bool isLegalToInline(Operation *, Region *,
bool, IRMapping &)
const final {
194void ROCDLDialect::initialize() {
197#include "mlir/Dialect/LLVMIR/ROCDLOps.cpp.inc"
201#define GET_ATTRDEF_LIST
202#include "mlir/Dialect/LLVMIR/ROCDLOpsAttributes.cpp.inc"
206 allowUnknownOperations();
207 addInterfaces<ROCDLInlinerInterface>();
208 declarePromisedInterface<gpu::TargetAttrInterface, ROCDLTargetAttr>();
211LogicalResult ROCDLDialect::verifyOperationAttribute(
Operation *op,
214 if (kernelAttrName.getName() == attr.
getName()) {
215 if (!isa<LLVM::LLVMFuncOp>(op)) {
216 return op->
emitError() <<
"'" << kernelAttrName.getName()
217 <<
"' attribute attached to unexpected op";
228 int optLevel, StringRef triple, StringRef chip,
229 StringRef features, StringRef abiVersion,
231 if (optLevel < 0 || optLevel > 3) {
232 emitError() <<
"The optimization level must be a number between 0 and 3.";
235 if (triple.empty()) {
236 emitError() <<
"The target triple cannot be empty.";
240 emitError() <<
"The target chip cannot be empty.";
243 if (abiVersion !=
"400" && abiVersion !=
"500" && abiVersion !=
"600") {
244 emitError() <<
"Invalid ABI version, it must be `400`, `500` or '600'.";
247 if (files && !llvm::all_of(files, [](::mlir::Attribute attr) {
248 return attr && mlir::isa<StringAttr>(attr);
250 emitError() <<
"All the elements in the `link` array must be strings.";
256#define GET_OP_CLASSES
257#include "mlir/Dialect/LLVMIR/ROCDLOps.cpp.inc"
259#define GET_ATTRDEF_CLASSES
260#include "mlir/Dialect/LLVMIR/ROCDLOpsAttributes.cpp.inc"
static bool isLegalToInline(InlinerInterface &interface, Region *src, Region *insertRegion, bool shouldCloneInlinedRegion, IRMapping &valueMapping)
Utility to check that all of the operations within 'src' can be inlined.
virtual Builder & getBuilder() const =0
Return a builder which provides useful access to MLIRContext, global objects like types and attribute...
ParseResult addTypeToList(Type type, SmallVectorImpl< Type > &result)
Add the specified type to the end of the specified type list and return success.
virtual ParseResult parseColonType(Type &result)=0
Parse a colon followed by a type.
virtual SMLoc getNameLoc() const =0
Return the location of the original name token.
This is the interface that must be implemented by the dialects of operations to be inlined.
DialectInlinerInterface(Dialect *dialect)
This class represents a diagnostic that is inflight and set to be reported.
NamedAttribute represents a combination of a name and an Attribute value.
StringAttr getName() const
Return the name of the attribute.
The OpAsmParser has methods for interacting with the asm parser: parsing things from it,...
ParseResult resolveOperands(Operands &&operands, Type type, SmallVectorImpl< Value > &result)
Resolve a list of operands to SSA values, emitting an error on failure, or appending the results to t...
virtual ParseResult parseOperandList(SmallVectorImpl< UnresolvedOperand > &result, Delimiter delimiter=Delimiter::None, bool allowResultNumber=true, int requiredOperandCount=-1)=0
Parse zero or more SSA comma-separated operand references with a specified surrounding delimiter,...
This is a pure-virtual base class that exposes the asmprinter hooks necessary to implement a custom p...
Operation is the basic unit of execution within MLIR.
InFlightDiagnostic emitError(const Twine &message={})
Emit an error about fatal conditions with this operation, reporting up to any diagnostic handlers tha...
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
llvm::function_ref< Fn > function_ref
This represents an operation in an abstracted form, suitable for use with the builder APIs.