[Mlir-commits] [mlir] [MLIR][XeGPU] Refactor layout propagation utilities (PR #179016)
Igor Zamyatin
llvmlistbot at llvm.org
Tue Feb 3 13:48:32 PST 2026
================
@@ -1072,163 +1072,117 @@ void LayoutInfoPropagation::visitVectorBitcastOp(
vector::BitCastOp bitcast, ArrayRef<LayoutInfoLattice *> operands,
ArrayRef<const LayoutInfoLattice *> results) {
// Need the layout of bitcast result to propagate to the operands.
- LayoutInfo resultLayout = results[0]->getValue();
- if (!resultLayout.isAssigned())
- return;
- int inElemTyBitWidth =
- bitcast.getSourceVectorType().getElementType().getIntOrFloatBitWidth();
- int outElemTyBitWidth =
- bitcast.getResultVectorType().getElementType().getIntOrFloatBitWidth();
- // If the element bit widths are the same, then the layout does not change.
- if (inElemTyBitWidth == outElemTyBitWidth) {
- propagateIfChanged(operands[0], operands[0]->meet(resultLayout));
- return;
- }
- // Check if the result layout is valid. i.e. result vector can be distributed.
- auto resultLaneLayout = resultLayout.getLaneLayout();
- auto resultLaneData = resultLayout.getLaneData();
- if (failed(xegpu::getDistributedVectorType(
- bitcast.getResultVectorType(),
- xegpu::LayoutAttr::get(bitcast->getContext(), resultLaneLayout,
- resultLaneData)))) {
- bitcast.emitWarning(
- "Result vector type can not be evenly distributed across lanes.");
+ LayoutInfo resLayoutInfo = results[0]->getValue();
+ if (!resLayoutInfo.isAssigned())
return;
- }
- int64_t rank = bitcast.getSourceVectorType().getRank();
- // Bitcast is a `narrowing` if the input element type bit width larger than
- // the output element type bit width. eg. f32 -> f16 is a narrowing bitcast.
- bool isNarrowing = inElemTyBitWidth > outElemTyBitWidth;
- int bitCastRatio = isNarrowing ? inElemTyBitWidth / outElemTyBitWidth
- : outElemTyBitWidth / inElemTyBitWidth;
- SmallVector<int> sourceLaneLayout =
- resultLayout.getLaneLayout(); // Lane layout does not change for bitcast.
- SmallVector<int> outData = resultLayout.getLaneData();
-
- // TODO: Currently we assume that bitcasts does not require cross lane
- // communication. So each lane must own the required number of elements to
- // perform the bitcast locally without cross-lane communication.
- int outInnerBitsPerLane = outData[rank - 1] * outElemTyBitWidth;
- if (outInnerBitsPerLane < inElemTyBitWidth) {
- bitcast.emitWarning(
- "Narrowing bitcast with cross lane communication is not supported.");
- return;
- }
- // Check if each lane owns a single element in all dimensions except the
- // innermost dimension.
- SmallVector<int> sourceLaneData(outData.begin(), outData.end() - 1);
- if (llvm::any_of(sourceLaneData, [](int64_t d) { return d != 1; })) {
- bitcast.emitWarning("Each lane must not own multiple elements in any "
- "dimension other than "
- "the innermost dimension.");
+
+ auto srcVecType = bitcast.getSourceVectorType();
+ auto resVecType = bitcast.getResultVectorType();
+
+ auto consumerLayoutAttr =
+ dyn_cast<xegpu::DistributeLayoutAttr>(resLayoutInfo.get());
+ auto uArch = getUArch(xegpu::getChipStr(bitcast).value_or(""));
+ auto requiredResLayoutAttr = setupBitCastResultLayout(
----------------
Garra1980 wrote:
Do we need to e.g. throw assert in the case of requiredResLayoutAttr!=consumerLayoutAttr (here and for ops. IIUC, it's for conflict resolving mechanism to handle such case)?
https://github.com/llvm/llvm-project/pull/179016
More information about the Mlir-commits
mailing list