[Mlir-commits] [mlir] [MLIR][XeGPU] Add distribution pattern for convertLayoutOp (PR #184826)
Nishant Patel
llvmlistbot at llvm.org
Thu Mar 5 08:57:35 PST 2026
https://github.com/nbpatel created https://github.com/llvm/llvm-project/pull/184826
None
>From 35e257cce262647e823dc10e4e9cb90b7bfc2a9e Mon Sep 17 00:00:00 2001
From: nbpatel <nishant.b.patel at intel.com>
Date: Wed, 4 Mar 2026 19:36:48 +0000
Subject: [PATCH] Add pattern for convertLayoutOp
---
.../XeGPUSgToWiDistributeExperimental.cpp | 25 ++++++++++++++++++-
.../XeGPU/sg-to-wi-experimental-unit.mlir | 13 ++++++++++
2 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSgToWiDistributeExperimental.cpp b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSgToWiDistributeExperimental.cpp
index cffd80f8fcf92..4944b42e6ef25 100644
--- a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSgToWiDistributeExperimental.cpp
+++ b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSgToWiDistributeExperimental.cpp
@@ -696,6 +696,28 @@ struct SgToWiStoreScatter : public OpConversionPattern<xegpu::StoreScatterOp> {
}
};
+struct SgToWiConvertLayout
+ : public OpConversionPattern<xegpu::ConvertLayoutOp> {
+ using OpConversionPattern<xegpu::ConvertLayoutOp>::OpConversionPattern;
+
+ LogicalResult
+ matchAndRewrite(xegpu::ConvertLayoutOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ auto inputLayout = op.getInputLayoutAttr();
+ auto targetLayout = op.getTargetLayoutAttr();
+
+ if (!inputLayout || !targetLayout)
+ return rewriter.notifyMatchFailure(op, "missing layout attributes");
+
+ if (!inputLayout.isCompatibleWith(targetLayout, xegpu::LayoutKind::Lane)) {
+ return rewriter.notifyMatchFailure(
+ op, "lowering incompatible convert_layout not yet supported");
+ }
+ rewriter.replaceOp(op, adaptor.getSource());
+ return success();
+ }
+};
+
struct XeGPUSgToWiDistributeExperimentalPass
: public xegpu::impl::XeGPUSgToWiDistributeExperimentalBase<
XeGPUSgToWiDistributeExperimentalPass> {
@@ -901,5 +923,6 @@ void xegpu::populateXeGPUSgToWiDistributeTypeConversionAndLegality(
patterns.add<SgToWiCreateNdDesc, SgToWiLoadNd, SgToWiStoreNd, SgToWiDpas,
SgToWiElementWise, SgToWiArithConstant, SgToWiPrefetchNd,
SgToWiLoadGather, SgToWiStoreScatter, SgToWiVectorReduction,
- SgToWiMultiDimReduction>(typeConverter, patterns.getContext());
+ SgToWiMultiDimReduction, SgToWiConvertLayout>(
+ typeConverter, patterns.getContext());
}
diff --git a/mlir/test/Dialect/XeGPU/sg-to-wi-experimental-unit.mlir b/mlir/test/Dialect/XeGPU/sg-to-wi-experimental-unit.mlir
index bc36554f5c266..e861b25bb01b7 100644
--- a/mlir/test/Dialect/XeGPU/sg-to-wi-experimental-unit.mlir
+++ b/mlir/test/Dialect/XeGPU/sg-to-wi-experimental-unit.mlir
@@ -460,4 +460,17 @@ gpu.func @vector_multi_reduction_dim0_distributed_dim1_reduction(%laneid: index)
[1] : vector<16x12xf32> to vector<16xf32>
gpu.return
}
+
+// CHECK-LABEL: gpu.func @convert_layout_removed_when_compatible
+// CHECK-NOT: xegpu.convert_layout
+gpu.func @convert_layout_removed_when_compatible() {
+ %0 = "some_op"()
+ {layout_result_0 = #xegpu.layout<lane_layout = [16], lane_data = [1]>}
+ : () -> vector<16xf32>
+ %1 = xegpu.convert_layout %0
+ <{input_layout = #xegpu.layout<lane_layout = [16], lane_data = [1]>,
+ target_layout = #xegpu.slice<#xegpu.layout<lane_layout = [1, 16], lane_data = [1, 1]>, dims = [0]>}>
+ : vector<16xf32>
+ gpu.return
+}
}
More information about the Mlir-commits
mailing list