[Mlir-commits] [mlir] [MLIR][XeGPU] Add unroll patterns and blocking pass for XeGPU [2/N] (PR #140163)
Chao Chen
llvmlistbot at llvm.org
Tue May 27 08:57:03 PDT 2025
================
@@ -83,3 +100,275 @@ mlir::xegpu::getDistributedVectorType(VectorType originalType,
/*memory_space=*/xegpu::MemorySpace::Global, layout);
return xegpu::getDistributedVectorType(helperTdescTy);
}
+
+std::string xegpu::getLayoutName(OpOperand &opr) {
+ const StringRef prefix("layout_operand_");
+ return llvm::formatv("{0}{1}", prefix, opr.getOperandNumber()).str();
+}
+
+std::string xegpu::getLayoutName(OpResult res) {
+ const StringRef prefix = "layout_result_";
+ return llvm::formatv("{0}{1}", prefix, res.getResultNumber()).str();
+}
+
+xegpu::LayoutAttr xegpu::getLayoutAttr(Value value) {
+ if (!value)
+ return nullptr;
+
+ if (auto tdescTy =
+ dyn_cast_if_present<xegpu::TensorDescType>(value.getType()))
+ return tdescTy.getLayoutAttr();
+
+ if (auto result = dyn_cast<OpResult>(value)) {
+ Operation *defOp = result.getDefiningOp();
+ assert(defOp && "result must have a defining op");
+
+ // for LoadNdOp, the layout is stored in the tensor descriptor
+ if (auto loadNd = dyn_cast<xegpu::LoadNdOp>(defOp))
+ return getLayoutAttr(loadNd.getTensorDesc());
+
+ std::string layoutName = getLayoutName(result);
+ if (defOp->hasAttr(layoutName))
+ return defOp->getAttrOfType<xegpu::LayoutAttr>(layoutName);
+ }
+
+ if (auto arg = dyn_cast<BlockArgument>(value)) {
+ auto parentOp = arg.getOwner()->getParentOp();
+ if (auto loop = dyn_cast<LoopLikeOpInterface>(parentOp)) {
+ OpOperand *tiedInit = loop.getTiedLoopInit(arg);
+ return getLayoutAttr(tiedInit->get());
+ }
+ }
+
+ return nullptr;
+}
+
+xegpu::LayoutAttr xegpu::getLayoutAttr(OpOperand &opr) {
+ Operation *op = opr.getOwner();
+ std::string layoutName = xegpu::getLayoutName(opr);
+ if (op->hasAttr(layoutName))
+ return op->getAttrOfType<xegpu::LayoutAttr>(layoutName);
+ return getLayoutAttr(opr.get());
+}
+
+void xegpu::setLayoutAttr(OpOperand &opr, LayoutAttr layout) {
+ auto owner = opr.getOwner();
+ std::string name = xegpu::getLayoutName(opr);
+ if (layout && !owner->hasAttrOfType<LayoutAttr>(name))
+ owner->setAttr(name, layout);
+}
+
+void xegpu::setLayoutAttr(OpResult result, LayoutAttr layout) {
+ Operation *owner = result.getOwner();
+ std::string name = xegpu::getLayoutName(result);
+ if (layout && !owner->hasAttr(name))
+ owner->setAttr(name, layout);
+}
+
+void xegpu::setLayoutAttrs(Operation *mod,
+ function_ref<LayoutAttr(Value)> getLayoutImpl) {
----------------
chencha3 wrote:
Yeah, it majorly targets for the nested ops. But I thought the `walk` visits the owner, so the operands and results of the mod should be processed too? Am I right?
https://github.com/llvm/llvm-project/pull/140163
More information about the Mlir-commits
mailing list