Skip to content

Fix subset subview offset/layout and add upstream test#101

Open
TaoTao-real wants to merge 8 commits intozhangstevenunity:mainfrom
TaoTao-real:subset-gt-subview-fix
Open

Fix subset subview offset/layout and add upstream test#101
TaoTao-real wants to merge 8 commits intozhangstevenunity:mainfrom
TaoTao-real:subset-gt-subview-fix

Conversation

@TaoTao-real
Copy link
Contributor

@TaoTao-real TaoTao-real commented Feb 13, 2026

修复内容

  • subset 的 subview 现在直接基于 bind_tile 的底层 memref,而不是 Tile 本体,避免后续 EmitC 把 Tile
    当指针处理。
    • 位置:lib/PTO/Transforms/PTOViewToMemref.cpp
  • subset 的结果 memref 在 offset/stride/offsets 都是静态 时,会写入静态 offset,修复
    memref.subview 的 layout mismatch 验证失败。
    • 位置:lib/PTO/Transforms/PTOViewToMemref.cpp
  • subset 的 valid dims 推导:当 offsets 是动态时,保持 static valid = size(稳定类型),只在
    offset 为常量时做裁剪。
    • 位置:lib/PTO/IR/PTO.cpp
  • EmitC 里对 Tile-like 源值不再直接转指针,改为先取 tile.data()(通过 marker),避免 Tile →
    ubuf* 的非法强转。
    • 位置:lib/PTO/Transforms/PTOToEmitC.cpp
  • 新增上游用例 test/samples/Subset/subset_upstream.py,runop 能自动跑到。

之前错误原因

  1. Tile 被当成指针:
    • subset 降到 memref.subview 时,源是 bind_tile 的结果(Tile-like memref),EmitC 试图直接做指
      针运算,结果生成 (ubuf float*) tile 的非法 C++。
    • 修复方式:subview 基址换成 bind_tile 的底层 memref;同时 EmitC 发现 Tile-like 时用
      tile.data() 取地址。
  2. memref.subview 报 layout mismatch:
    • subset 的 result type 一直是动态 offset,但当 source 的 offset/stride 以及 subset offsets 全
      静态时,memref.subview 的 verifier 需要 静态 offset 匹配,否则报错。
    • 修复方式:推导出静态 offset 并写入 result memref 类型。
  3. valid dims 类型不稳定:
    • 动态 offset 时,把 valid 设成动态,导致类型不稳定(尤其在复用/流经多次 subset)。
    • 修复方式:动态 offset 时保持 valid = size,只在 offset 常量时裁剪。

修改前后对比

  1. 修改前:pto.subset 直接被降成 memref.subview,没有再绑定 tile 的 config/valid 信息,后续 pass
    只能把它当普通 memref/裸指针处理。
  2. 修改后:pto.subset 先生成 memref.subview,再用 pto.bind_tile 重新绑定 config + valid dims,保持
    tile 语义和元信息贯通。
  3. 这样避免了 “valid 变 0 / metadata 丢失 / 裸指针传递” 的问题,并保证 downstream lowering 稳定。

样例(IR 片段)

修改前:

%sub = pto.subset %src[%i, %j] sizes [32, 32] : !pto.tile_buf<...>
; 降成:
%subview = memref.subview %src_memref[%i, %j] [32, 32] [1, 1]

修改后:

%sub = pto.subset %src[%i, %j] sizes [32, 32] : !pto.tile_buf<...>
; 降成:
%subview = memref.subview %src_memref[%i, %j] [32, 32] [1, 1]
%subtile = pto.bind_tile %subview, %vrow, %vcol {config = ...} : memref<...> -> memref<...>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant