[Mlir-commits] [mlir] [MLIR][XeGPU] Add distribution pattern for xegpu.load & store for sg to wi pass (PR #181917)
Jianhui Li
llvmlistbot at llvm.org
Thu Feb 26 11:52:35 PST 2026
================
@@ -395,6 +395,71 @@ struct SgToWiPrefetchNd : public OpConversionPattern<xegpu::PrefetchNdOp> {
}
};
+/// Distributes a subgroup-level LoadGather (xegpu.load) op to workitem-level.
+struct SgToWiLoadGather : public OpConversionPattern<xegpu::LoadGatherOp> {
+ using OpConversionPattern<xegpu::LoadGatherOp>::OpConversionPattern;
+
+ LogicalResult
+ matchAndRewrite(xegpu::LoadGatherOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ xegpu::DistributeLayoutAttr layout = op.getAnchorLayout();
+ if (!layout)
+ return failure();
+
+ VectorType resultTy = op.getValueType();
+ if (!resultTy)
+ return failure();
+
+ // Check that leading dimensions are unit.
+ int chunkSize = op.getChunkSize().value_or(1);
+ int effectiveVecRank = (chunkSize == 1) ? 1 : 2;
+ ArrayRef<int64_t> shape = resultTy.getShape();
+ if (llvm::any_of(shape.take_front(resultTy.getRank() - effectiveVecRank),
+ [](int64_t d) { return d != 1; }))
+ return rewriter.notifyMatchFailure(
+ op, "Only unit dimensions allowed for the leading "
+ "dimensions of the load vector!");
+
+ auto expectedWiResultTyOrFailure =
+ xegpu::getDistVecTypeBasedOnLaneLayout(layout, resultTy);
+ if (failed(expectedWiResultTyOrFailure))
+ return rewriter.notifyMatchFailure(
+ op,
+ "unable to compute expected workitem vector type from lane layout");
+
+ VectorType expectedWiResultTy = expectedWiResultTyOrFailure.value();
+ VectorType supportedWiResultTy =
+ VectorType::get({expectedWiResultTy.getNumElements()},
+ expectedWiResultTy.getElementType());
+
+ // Flatten offsets and mask to 1D to match the 1D result type.
+ Value offsets = adaptor.getOffsets();
----------------
Jianhui-Li wrote:
Can we use "dist_" prefix for these value get from adaptor, and "orig_" prefix for those values from op?
The current coding require reviewer to look back to find out where it is from, so harder to maintain/read.
https://github.com/llvm/llvm-project/pull/181917
More information about the Mlir-commits
mailing list