[Mlir-commits] [mlir] [mlir][xegpu] Fill split-group inner dims on shape_cast result layout (PR #227560)
Jianhui Li
llvmlistbot at llvm.org
Fri Oct 2 18:20:45 PDT 2026
================
@@ -2765,27 +2794,59 @@ xegpu::DistributeLayoutAttr xegpu::setupShapeCastResultLayout(
splitDimGroups))
return consumerLayout;
- SmallVector<int64_t> laneLayout = consumerLayout.getEffectiveLaneLayoutAsInt();
+ SmallVector<int64_t> laneLayout =
+ consumerLayout.getEffectiveLaneLayoutAsInt();
SmallVector<int64_t> instData = consumerLayout.getEffectiveInstDataAsInt();
if (laneLayout.empty())
return consumerLayout;
- xegpu::DistributeLayoutAttr resLayout = consumerLayout;
- for (const SmallVector<int64_t> &dimGroup : splitDimGroups) {
- size_t i = 0;
- while (i < dimGroup.size() && laneLayout[dimGroup[i]] == 1)
- ++i;
-
- for (++i; i < dimGroup.size(); ++i) {
- int64_t dim = dimGroup[i];
- int64_t dimSize = resShape[dim];
- int64_t lanes = laneLayout[dim];
- if (lanes <= 0 || dimSize % lanes != 0)
- return consumerLayout;
- resLayout = resLayout.setDimData(dim, /*sgData=*/-1,
- instData.empty() ? -1 : dimSize,
- dimSize / lanes);
+ xegpu::DistributeLayoutAttr resLayout = [&]() -> DistributeLayoutAttr {
+ DistributeLayoutAttr layout = consumerLayout;
+ for (const SmallVector<int64_t> &dimGroup : splitDimGroups) {
+ size_t i = 0;
+ while (i < dimGroup.size() && laneLayout[dimGroup[i]] == 1)
+ ++i;
+
+ for (++i; i < dimGroup.size(); ++i) {
+ int64_t dim = dimGroup[i];
+ int64_t dimSize = resShape[dim];
+ int64_t lanes = laneLayout[dim];
+ if (lanes <= 0 || dimSize % lanes != 0)
+ return consumerLayout;
+ layout =
+ layout.setDimData(dim, /*sgData=*/-1,
+ instData.empty() ? -1 : dimSize, dimSize / lanes);
+ }
}
+ return layout;
+ }();
+
+ // Stretching does not make every layout collapsible; reject the rest.
+ SmallVector<int64_t> resInstData = resLayout.getEffectiveInstDataAsInt();
+ SmallVector<int64_t> resLaneLayout = resLayout.getEffectiveLaneLayoutAsInt();
+ SmallVector<int64_t> resLaneData = resLayout.getEffectiveLaneDataAsInt();
+ if (resLaneLayout.empty() || resLaneData.empty())
+ return resLayout;
+
+ for (const SmallVector<int64_t> &dimGroup : splitDimGroups) {
+ // One lane's elements must be a single contiguous run of the collapsed dim.
+ if (!isContiguousTiling(dimGroup, resShape, resLaneData, /*tileShape=*/{},
----------------
Jianhui-Li wrote:
Yes. The order must be adjacent, and inferShapeCastSourceLayout does check that. It worths a new PR to refactor the code to move the order requirement here upfront.
https://github.com/llvm/llvm-project/pull/227560
More information about the Mlir-commits
mailing list