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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions