Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhangxiangjie 的贡献)变更摘要
该 PR 修复了 MergeViewAssemble 优化 pass 在链式融合(chain fusion)过程中丢失 assemble 扇出(fanout)的问题:当中间 tensor 除了主链下游消费者外,还存在其他侧向消费者(如 VIEW 消费者或 token 依赖消费者)时,原先的融合会把中间生产者错误删除,导致数据边(data edge)丢失。改动引入 hasTokenDependencies_ 状态标记,仅在存在 token 依赖的情况下才启用 hasAssembleChainStopper 的链终止/删除语义,并保留侧向消费者所需的中间写操作,同时补充了对应的单元测试。
主要改动
-
新增
hasTokenDependencies_状态标记(merge_view_assemble_utils.h与BuildConsumerCache):在merge_view_assemble_utils.h中新增成员hasTokenDependencies_,并在BuildConsumerCache开头重置、在遍历操作时通过operation.tokens_与operation.result_token_置位,用于记录函数内是否存在 token 依赖。 -
按 token 依赖门控链终止语义:
BuildProducerGroupFusion、MergeAssembleChain、ProcessAssembleConsumers中原本直接以consumers.hasAssembleChainStopper判断链是否终止/是否可融合,改为仅在hasTokenDependencies_为真时才生效,避免无 token 场景下因 stopper 误判而阻断融合。 -
保留侧向消费者所需的生产者:
AppendProducerGroupFusions中仅当生产者消费者的hasAssembleChainStopper为假时才SetAsDeleted;ProcessAssembleChainEnd中新增hasSideConsumer判断,当链中存在被链终止者消费的中间操作时,保留这些中间写操作(仅删除链尾),确保VIEW等侧向消费者的数据边不被破坏。 -
新增/完善单元测试(
test_merge_view_assemble.cpp):新增ProducerGroupWithIntermediateViewConsumerKeepsDataEdge(覆盖带/不带 token 两种场景)与AssembleChainWithIntermediateTokenConsumerKeepsDataEdge,并强化AssembleChainWithIntermediateViewConsumerKeepsDataEdge断言,验证中间VIEW消费者保留、生产者不删除、token 依赖(GetVarDependency中HasProducer/HasConsumer)保持正确。


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| framework/src/passes | ✅ congqiannan, zhangyuebing (2/2) | ✅ zhangyuebing (1/1) |
| repo-cann/pypto | ✅ zhangyuebing, congqiannan (2/2) | ✅ zhangyuebing (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
zhangxiangjie, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


/compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


/compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


/approve


✅ 已将本 PR 下你提交的未解决检视意见标记为已解决(无未解决的检视意见)。


/lgtm


问题描述
新 IR 适配后,
MergeViewAssemble在中间张量存在 View/Slice 等旁路消费者时停止 Assemble 链合并。该限制也作用于无 token 依赖的函数,导致历史上可以消除的中间链保留到后续 Pass:修改方案
在保留旁路数据依赖的前提下,恢复无 token 函数中的分支合并能力:
补充 Pass 单测,覆盖旁路数据边、生产者输入与偏移映射、token 依赖保留;同步调整
TestIntermediateOutcast的算子数量预期,保留 outcast 数据依赖断言。