[Mlir-commits] [mlir] [MLIR][XeGPU] Use context-aware type converter in WgToSgDistribute and Blocking pass (PR #194685)
Igor Zamyatin
llvmlistbot at llvm.org
Thu Apr 30 06:59:37 PDT 2026
================
@@ -1550,67 +1542,8 @@ void XeGPUSgToWiDistributeExperimentalPass::runOnOperation() {
target.addLegalOp<UnrealizedConversionCastOp>();
(void)applyPartialConversion(root, target, std::move(patterns));
}
- // Structural type conversion can generate some redundant
- // UnrealizedConversionCastOps to materialize the SG type from type converted
- // WI type. These are redundant at this point and can be eliminated by
- // inserting shape casts instead.
- // Example:
- // %1 = UnrealizedConversionCastOp %0 : vector<16x1xf32> to vector<16x16xf32>
- // %2 = UnrealizedConversionCastOp %1 : vector<16x16xf32> to vector<16xf32>
- // This can be replaced with:
- // %2 = vector.shape_cast %0 : vector<16x1xf32> to vector<16xf32>
- OpBuilder builder(root);
- root->walk([&](UnrealizedConversionCastOp op) {
- // If this op existed before, nothing to do.
- if (existingCasts.contains(op))
- return;
- // number of inputs and outputs must be 1.
- if (op.getNumOperands() != 1 || op.getNumResults() != 1)
- return;
- // Both input and output types must be vector types.
- auto singleInput = op.getInputs()[0];
- auto inputTy = dyn_cast<VectorType>(singleInput.getType());
- auto outputTy = dyn_cast<VectorType>(op.getResult(0).getType());
- if (!inputTy || !outputTy)
- return;
-
- // Check if the defining op of the input is also an
- // UnrealizedConversionCastOp and it has a single user (which is this
- // op).
- auto definingOp = singleInput.getDefiningOp<UnrealizedConversionCastOp>();
- if (!definingOp || !definingOp->hasOneUse())
- return;
- auto inputOfDefiningOp = definingOp.getInputs()[0];
- // If the input of the defining op and output type are both vector types
- // have same number of elements, insert a shape cast.
- auto inputOfDefiningOpTy =
- dyn_cast<VectorType>(inputOfDefiningOp.getType());
- if (inputOfDefiningOpTy &&
- inputOfDefiningOpTy.getNumElements() == outputTy.getNumElements()) {
- builder.setInsertionPoint(op);
- auto shapeCast = vector::ShapeCastOp::create(builder, op.getLoc(),
- outputTy, inputOfDefiningOp);
- op.replaceAllUsesWith(ValueRange{shapeCast.getResult()});
- return;
- }
- });
- // At this point, we will have some dead UnrealizedConversionCastOps. Just
- // erase them.
- bool changed = true;
- while (changed) {
- changed = false;
- root->walk([&](UnrealizedConversionCastOp op) {
- // Skip existing casts.
- if (existingCasts.contains(op))
- return;
- if (op.use_empty()) {
- op.erase();
- changed = true;
- }
- });
- }
-
- xegpu::removeTemporaryLayoutAttrs(getOperation());
----------------
Garra1980 wrote:
this one is also not needed anymore?
https://github.com/llvm/llvm-project/pull/194685
More information about the Mlir-commits
mailing list