diff options
Diffstat (limited to 'mlir/lib/Dialect/GPU/IR/GPUDialect.cpp')
| -rw-r--r-- | mlir/lib/Dialect/GPU/IR/GPUDialect.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp index eeffe829446c..a59952228ef6 100644 --- a/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp +++ b/mlir/lib/Dialect/GPU/IR/GPUDialect.cpp @@ -620,10 +620,22 @@ LogicalResult gpu::SubgroupReduceOp::verify() { << "` reduction operation is not compatible with type " << getType(); } + + if (auto clusterSize = getClusterSize()) { + uint32_t size = *clusterSize; + if (!llvm::isPowerOf2_32(size)) { + return emitOpError() << "cluster size " << size + << " is not a power of two"; + } + } + return success(); } OpFoldResult gpu::SubgroupReduceOp::fold(FoldAdaptor /*adaptor*/) { + if (getClusterSize() == 1) + return getValue(); + if (!getUniform() && canMakeGroupOpUniform(*this)) { setUniform(true); return getResult(); |
