-
Notifications
You must be signed in to change notification settings - Fork 23
Open
Description
问题现象
使用当前仓库构建的 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 结果类型- 期望不再因推导
?与显式类型冲突而失败
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels