Skip to content

pto.subset dynamic offset causes inferred v_col=? vs declared static valid mismatch #249

@mouliangyu

Description

@mouliangyu

问题现象

使用当前仓库构建的 ptoas 编译某些包含动态 pto.subset offset 的 IR 会失败:

error: 'pto.subset' op inferred type(s) ... v_col=? ... are incompatible with return type(s) ... v_col=64 ...
error: 'pto.subset' op failed to infer returned types
Error: Failed to parse MLIR.

最小复现用例(可直接运行)

将以下内容保存为 subset_dynamic_mismatch.pto

module {
  func.func @subset_nonebox_dynamic_mismatch(%arg0: index) {
    %c0 = arith.constant 0 : index
    %c64 = arith.constant 64 : index
    %off = arith.muli %arg0, %c64 : index

    %t0 = "pto.alloc_tile"() <{operandSegmentSizes = array<i32: 0, 0, 0>}> : () -> !pto.tile_buf<loc=vec, dtype=f32, rows=8, cols=64, v_row=8, v_col=64, blayout=row_major, slayout=none_box, fractal=512, pad=0>

    %sub = "pto.subset"(%t0, %c0, %off) <{sizes = [1, 64]}> : (!pto.tile_buf<loc=vec, dtype=f32, rows=8, cols=64, v_row=8, v_col=64, blayout=row_major, slayout=none_box, fractal=512, pad=0>, index, index) -> !pto.tile_buf<loc=vec, dtype=f32, rows=1, cols=64, v_row=1, v_col=64, blayout=row_major, slayout=none_box, fractal=512, pad=0>

    func.return
  }
}

运行:

ptoas subset_dynamic_mismatch.pto

预期触发 v_col=?(inferred)与 v_col=64(declared)冲突。


根因分析

SubsetOp::inferReturnTypes 当前会把 offset(尤其动态 offset)直接影响到 valid 维推导。
这会导致 valid 维被推导成 ?,从而和显式声明的静态 valid 维冲突。


修改建议(已验证可行)

文件:lib/PTO/IR/PTO.cpp
函数:SubsetOp::inferReturnTypes

将 valid shape 推导改为仅基于 sizes 与 parent valid shape,不再使用 offset 参与计算:

  • parent valid 为动态:vdim = kDynamic
  • parent valid 为静态:vdim = min(sizeDim, parentValidDim)

即删除当前 offset 相关推导分支(包括对常量/非常量 offset 的特殊处理),统一为上述规则。

伪代码:

if (parentValidDim < 0) {
  vdim = kDynamic;
} else {
  vdim = std::min(sizeDim, parentValidDim);
}

回归建议

新增一条测试,覆盖:

  • pto.subset + 动态 offset + 显式静态 valid 结果类型
  • 期望不再因推导 ? 与显式类型冲突而失败

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    In Progress

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions