[Mlir-commits] [mlir] [MLIR][XeGPU] Add blocking and subgroup to lane distribution support for ConvertLayout operation (PR #183837)
Jianhui Li
llvmlistbot at llvm.org
Tue Mar 3 14:05:59 PST 2026
================
@@ -1032,15 +1032,59 @@ struct UnrollStoreMatrixOp : public UnrollPattern<xegpu::StoreMatrixOp> {
}
};
+struct UnrollConvertLayoutOp : public UnrollPattern<xegpu::ConvertLayoutOp> {
+ using UnrollPattern<xegpu::ConvertLayoutOp>::UnrollPattern;
+ LogicalResult matchAndRewrite(xegpu::ConvertLayoutOp op,
+ PatternRewriter &rewriter) const override {
+ Location loc = op.getLoc();
+ VectorType valueTy = llvm::dyn_cast<VectorType>(op.getType());
+ assert(valueTy && "the value type must be vector type!");
+
+ std::optional<SmallVector<int64_t>> targetShape = getTargetShape(op);
+ if (!targetShape || targetShape->size() != (size_t)valueTy.getRank())
+ return failure();
+
+ xegpu::DistributeLayoutAttr inputLayout = op.getInputLayoutAttr();
+ xegpu::DistributeLayoutAttr targetLayout = op.getTargetLayoutAttr();
+ if (!inputLayout || !targetLayout)
+ return rewriter.notifyMatchFailure(op, "missing layout attributes.");
+
+ if (inputLayout.getEffectiveInstDataAsInt().empty() ||
+ targetLayout.getEffectiveInstDataAsInt().empty())
+ return rewriter.notifyMatchFailure(op, "Not a target ConvertLayoutOp.");
+
+ inputLayout = inputLayout.dropInstData();
+ targetLayout = targetLayout.dropInstData();
+
+ Value newSource = op.getSource();
+ SmallVector<Value> newOps;
+ if (inputLayout && targetLayout) {
+ SmallVector<Type> convertedValTypes =
+ getUnrolledTypes(valueTy, *targetShape);
+ SmallVector<Value> convertedValues =
+ pack(op.getOperand(), convertedValTypes, *targetShape, loc, rewriter);
+ for (auto [v, t] : llvm::zip(convertedValues, convertedValTypes)) {
+ auto newOp = xegpu::ConvertLayoutOp::create(rewriter, op.getLoc(), t, v,
+ inputLayout, targetLayout);
+ newOps.push_back(newOp);
+ }
+ newSource = unpack(newOps, op.getType(), *targetShape, loc, rewriter);
+ }
+
+ rewriter.replaceOp(op, newSource);
+ return success();
+ }
+};
+
} // namespace
void mlir::xegpu::populateXeGPUUnrollPatterns(
RewritePatternSet &patterns, const xegpu::UnrollOptions &options) {
- patterns
- .add<UnrollCreateNdOp, UnrollUpdateNdOffsetOp, UnrollPrefetchNdOp,
- UnrollLoadNdOp, UnrollStoreNdOp, UnrollDpasOp, UnrollCreateDescOp,
- UnrollLoadGatherOp, UnrollStoreScatterOp, UnrollPrefetchOp,
- UnrollUpdateOffsetOp, UnrollLoadMatrixOp, UnrollStoreMatrixOp,
- UnrollLoadGatherOpWithOffset, UnrollStoreScatterOpWithOffsets>(
- patterns.getContext(), options);
+ patterns.add<UnrollCreateNdOp, UnrollUpdateNdOffsetOp, UnrollPrefetchNdOp,
+ UnrollLoadNdOp, UnrollStoreNdOp, UnrollDpasOp,
+ UnrollCreateDescOp, UnrollLoadGatherOp, UnrollStoreScatterOp,
+ UnrollPrefetchOp, UnrollUpdateOffsetOp, UnrollLoadMatrixOp,
+ UnrollStoreMatrixOp, UnrollLoadGatherOpWithOffset,
+ UnrollStoreScatterOpWithOffsets, UnrollConvertLayoutOp>(
----------------
Jianhui-Li wrote:
ConvertLayoutOpPattern() is removed and replaced by UnrollConvertLayoutOp.
ConvertLayoutOpPattern() needs to be applied before the unrolling process and only remove convert layout if the layout is compatible thus can turn to no-op. It worked like a temporary workaround and doesn't really unroll convert layout.
https://github.com/llvm/llvm-project/pull/183837
More information about the Mlir-commits
mailing list