23template <
typename OpTy>
25 GroupOperation operation =
28 OpTy::getGroupOperationAttrName(groupOp->
getName()))
30 if (operation == GroupOperation::ClusteredReduce &&
32 return groupOp->
emitOpError(
"cluster size operand must be provided for "
33 "'ClusteredReduce' group operation");
36 int32_t clusterSize = 0;
41 "cluster size operand must come from a constant op");
43 if (!llvm::isPowerOf2_32(clusterSize))
45 "cluster size operand must be a power of two");
54LogicalResult GroupBroadcastOp::verify() {
55 if (
auto localIdTy = dyn_cast<VectorType>(getLocalid().
getType()))
56 if (localIdTy.getNumElements() != 2 && localIdTy.getNumElements() != 3)
57 return emitOpError(
"localid is a vector and can be with only "
58 " 2 or 3 components, actual number is ")
59 << localIdTy.getNumElements();
68LogicalResult GroupNonUniformBroadcastOp::verify() {
72 if (
auto spirvModule = (*this)->getParentOfType<spirv::ModuleOp>())
75 if (targetEnv.getVersion() < spirv::Version::V_1_5) {
76 auto *idOp = getId().getDefiningOp();
77 if (!idOp || !isa<spirv::ConstantOp,
78 spirv::ReferenceOfOp>(idOp))
79 return emitOpError(
"id must be the result of a constant op");
89template <
typename OpTy>
91 if (op.getOperands().back().getType().isSignedInteger())
92 return op.emitOpError(
"second operand must be a singless/unsigned integer");
97LogicalResult GroupNonUniformShuffleOp::verify() {
100LogicalResult GroupNonUniformShuffleDownOp::verify() {
103LogicalResult GroupNonUniformShuffleUpOp::verify() {
106LogicalResult GroupNonUniformShuffleXorOp::verify() {
114LogicalResult GroupNonUniformFAddOp::verify() {
122LogicalResult GroupNonUniformFMaxOp::verify() {
130LogicalResult GroupNonUniformFMinOp::verify() {
138LogicalResult GroupNonUniformFMulOp::verify() {
146LogicalResult GroupNonUniformIAddOp::verify() {
154LogicalResult GroupNonUniformIMulOp::verify() {
162LogicalResult GroupNonUniformSMaxOp::verify() {
170LogicalResult GroupNonUniformSMinOp::verify() {
178LogicalResult GroupNonUniformUMaxOp::verify() {
186LogicalResult GroupNonUniformUMinOp::verify() {
194LogicalResult GroupNonUniformBitwiseAndOp::verify() {
202LogicalResult GroupNonUniformBitwiseOrOp::verify() {
210LogicalResult GroupNonUniformBitwiseXorOp::verify() {
218LogicalResult GroupNonUniformLogicalAndOp::verify() {
226LogicalResult GroupNonUniformLogicalOrOp::verify() {
234LogicalResult GroupNonUniformLogicalXorOp::verify() {
242LogicalResult GroupNonUniformRotateKHROp::verify() {
243 if (Value clusterSizeVal = getClusterSize()) {
244 mlir::Operation *defOp = clusterSizeVal.getDefiningOp();
245 int32_t clusterSize = 0;
248 return emitOpError(
"cluster size operand must come from a constant op");
250 if (!llvm::isPowerOf2_32(clusterSize))
251 return emitOpError(
"cluster size operand must be a power of two");
p<< " : "<< getMemRefType()<< ", "<< getType();}static LogicalResult verifyVectorMemoryOp(Operation *op, MemRefType memrefType, VectorType vectorType) { if(memrefType.getElementType() !=vectorType.getElementType()) return op-> emitOpError("requires memref and vector types of the same elemental type")
Given a list of lists of parsed operands, populates uniqueOperands with unique operands.
Operation is the basic unit of execution within MLIR.
Value getOperand(unsigned idx)
AttrClass getAttrOfType(StringAttr name)
unsigned getNumOperands()
OperationName getName()
The name of an operation is the key identifier for it.
InFlightDiagnostic emitOpError(const Twine &message={})
Emit an error with the op name prefixed, like "'dim' op " which is convenient for verifiers.
Operation * getDefiningOp() const
If this value is the result of an operation, return the operation that defines it.
static LogicalResult verifyGroupNonUniformArithmeticOp(Operation *groupOp)
TargetEnvAttr lookupTargetEnvOrDefault(Operation *op)
Queries the target environment recursively from enclosing symbol table ops containing the given op or...
static LogicalResult verifyGroupNonUniformShuffleOp(OpTy op)
LogicalResult extractValueFromConstOp(Operation *op, int32_t &value)
TargetEnvAttr getDefaultTargetEnv(MLIRContext *context)
Returns the default target environment: SPIR-V 1.0 with Shader capability and no extra extensions.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.