[Mlir-commits] [mlir] [mlir][xegpu] add support for structure control flow ops in workgroup to subgroup distribution (PR #142618)
Charitha Saumya
llvmlistbot at llvm.org
Tue Jun 10 10:19:16 PDT 2025
================
@@ -353,26 +467,51 @@ void XeGPUWgToSgDistributePass::runOnOperation() {
};
auto isLegal = [&](xegpu::LayoutAttr layout) -> bool {
- return !layout || layout.getSgLayout() == nullptr;
+ return !layout || !layout.isWgLayout();
};
target.addDynamicallyLegalOp<xegpu::CreateNdDescOp, xegpu::LoadNdOp,
xegpu::StoreNdOp, xegpu::UpdateNdOffsetOp,
xegpu::PrefetchNdOp>([=](Operation *op) -> bool {
auto tdescTy = getTensorDescType(op);
- auto layout = dyn_cast_or_null<xegpu::LayoutAttr>(tdescTy.getLayout());
+ auto layout = dyn_cast_if_present<xegpu::LayoutAttr>(tdescTy.getLayout());
return isLegal(layout);
});
target.addDynamicallyLegalOp<xegpu::DpasOp>([=](xegpu::DpasOp op) -> bool {
- auto layout = dyn_cast_or_null<xegpu::LayoutAttr>(op->getAttr("layout"));
+ auto layout = xegpu::getLayoutAttr(op.getResult());
return isLegal(layout);
});
+ target.addDynamicallyLegalOp<UnrealizedConversionCastOp>(
+ [=](UnrealizedConversionCastOp op) {
+ return llvm::is_contained(existingCastOps, op.getOperation());
+ });
+
target.markUnknownOpDynamicallyLegal([](Operation *) { return true; });
+ // Step 2: Perform workgroup to subgroup distribution for TensorDesc values,
+ // as well as XeGPU, Arith, and Vector operations.
+ scf::populateSCFStructuralTypeConversionsAndLegality(converter, patterns,
+ target);
xegpu::populateXeGPUWgToSgDistributePatterns(patterns);
if (failed(
applyPartialConversion(getOperation(), target, std::move(patterns))))
return signalPassFailure();
+
+ // Remove sg_layout and sg_data attributes from the Layout
+ // attribute for each VectorType result of the operation.
+ // For Structured Control Flow ops, the layout is simply removed,
+ // since in 1:N case, the layout for new results are missing.
+ // Layout propagation pass will activated.
+ getOperation()->walk([](Operation *op) {
+ for (OpResult result : op->getOpResults()) {
+ std::string name = xegpu::getLayoutName(result);
+ if (auto layout = op->getAttrOfType<xegpu::LayoutAttr>(name)) {
+ op->removeAttr(name);
+ if (!isa<scf::IfOp, scf::ForOp, scf::WhileOp, scf::ConditionOp>(op))
+ op->setAttr(name, layout.dropInstData());
----------------
charithaintc wrote:
why drop inst data?
https://github.com/llvm/llvm-project/pull/142618
More information about the Mlir-commits
mailing list