[Mlir-commits] [mlir] [MLIR][XeGPU] Distribute vector.step & vector.shape_cast op from wg to sg (PR #155443)
Nishant Patel
llvmlistbot at llvm.org
Thu Sep 4 10:13:47 PDT 2025
================
@@ -475,43 +476,28 @@ struct WgToSgVectorBroadcastOp
if (!layout || !layout.isForWorkgroup())
return failure();
- // TODO: Currently only supports cases where the source and result ranks
- // are the same.
- auto srcType =
- dyn_cast<VectorType>(adaptor.getOperands().front()[0].getType());
- if (!srcType || srcType.getRank() != resultType.getRank())
- return failure();
-
SmallVector<int64_t> sgShape = getSgShapeAndCount(wgShape, layout).first;
VectorType newResultType =
VectorType::get(sgShape, resultType.getElementType());
- // Check if the output layout is distributable
- SmallVector<int64_t> sgLayout = layout.getSgLayoutAsInt();
- if (sgLayout.empty())
- return failure();
-
if (!xegpu::XeGPUDialect::isEvenlyDistributable(wgShape, layout))
return failure();
- // Check if the srcShape has unit dim in dimensions being broadcasted,
- // and the other dimensions are the same as the destination type
- // TODO: Generalize it
- auto srcShape = srcType.getShape();
- for (size_t i = 0; i < srcShape.size(); ++i) {
- if (srcShape[i] != 1 && srcShape[i] != sgShape[i])
- return failure();
- }
-
SmallVector<Value> newBroadcastOps;
for (auto operand : adaptor.getOperands().front()) {
auto newBroadcast = vector::BroadcastOp::create(rewriter, op.getLoc(),
newResultType, operand);
- xegpu::setDistributeLayoutAttr(newBroadcast->getResult(0),
- layout.dropSgLayoutAndData());
+ if (auto sliceAttr = dyn_cast_if_present<xegpu::SliceAttr>(layout)) {
+ if (sliceAttr.isForSubgroup())
+ xegpu::setDistributeLayoutAttr(newBroadcast->getResult(0),
+ sliceAttr.dropSgLayoutAndData());
----------------
nbpatel wrote:
cleaned it up
https://github.com/llvm/llvm-project/pull/155443
More information about the Mlir-commits
mailing list