Pull Request已成功合入, 合并人@ascend-robot
(感谢 hujiajun 的贡献)变更摘要
此 PR 对 AutoVectorizeV2(AV2)的融合规划阶段进行了大规模重构:将原先仅覆盖 leaf 节点的 VectorizeContext 替换为面向全体融合成员的 PlanContext / FusedNode 架构。核心变更包括:(1) 新增 FusedNode 类统一管理 leaf 与 producer,其 consolidateToTail 基于 use-def 链拓扑排序取代旧的简单排序,并在排序后加入 IR 合法性验证;(2) conflictsWith / updateConflicts 的作用范围从 leaf 扩展到全体融合成员;(3) 补齐 bestFusedNode 路径中缺失的 consolidateToTail + updateConflicts 调用;(4) 删除 findBestFusedNodeForProducer 中已被 canAccept 覆盖的冗余冲突检查。
主要改动
-
删除
Context.h,新增PlanContext.h/RetriedOptions.h拆分数据结构:原VectorizeContext(含maxFusedOps、cloneFunc、canFitStack等)被移除,拆分为RetriedOptions(纯参数结构体)和PlanContext(持有FusableOpInfo映射、冲突列表、FusedNode实例集合,并负责initFusableOpInfoFrom初始化和computeTileSize)。 -
新增
FusedNode类及其核心方法consolidateToTail:FusedNode同时管理leaf和producers两个SetVector,consolidateToTail通过climbedForwardSlice使用支配信息构建前向切片,实现基于 use-def 链的拓扑排序来重组操作顺序,排序后调用verify+report_fatal_error兜底保证 IR 合法性。 -
canAccept与conflictsWith/updateConflicts扩展到全体融合成员:canAccept通过AcceptContext枚举区分 Sibling/Producer/FallbackLeaf 三种调用场景的行为差异;conflictsWith遍历ops()(leaf + producers)全体成员检查冲突;updateConflicts对全体成员的上游/下游可融合操作建立双向冲突关系。 -
新增
FusionUtils.h/cpp提取操作分类与图遍历工具:将isFusableOp、isNonVectorizableOp、isMemrefLinalgOp、hasRankReducingIndexingMap等分类判断,以及findDownstreamFusableOpOf/findUpstreamFusableOpOf图遍历逻辑从主 pass 文件中独立为工具模块。 -
AutoVectorizeV2.cpp大幅精简(净减少约 889 行):主 pass 文件经重构后移除了大量内联工具代码和冗余逻辑,包括bestFusedNode路径补齐consolidateToTail+updateConflicts调用,以及删除findBestFusedNodeForProducer中已被canAccept覆盖的重复冲突检查。


libing-pipeline创建中,请等待……


代码审查
审查总结
已逐一审查全部 9 个变更文件,结果如下:
| 文件 | 审查结论 |
|---|---|
bishengir/include/.../FusedNode.h |
无独立问题(配合 .cpp 分析) |
bishengir/include/.../FusionUtils.h |
无独立问题 |
bishengir/include/.../PlanContext.h |
无独立问题 |
bishengir/include/.../RetriedOptions.h |
P2:include guard / 注释与文件名不匹配 |
bishengir/lib/.../FusedNode.cpp |
P2:canAccept off-by-one;P3:isMemref() 解引用空 leaf、numLoops==0 越界 |
bishengir/lib/.../FusionUtils.cpp |
P1:isOpInBlock 对多 block 父 op 判定错误 |
bishengir/lib/.../PlanContext.cpp |
P3:typeWithLargestRank 默认构造时 shape 为空 |
bishengir/lib/.../AutoVectorizeV2.cpp |
无独立问题 |
bishengir/lib/.../CMakeLists.txt |
无问题(仅新增 3 个 .cpp 源文件) |
按优先级统计
- P1:1 个 —
isOpInBlock对scf::IfOp等多 block 父 op 的判定错误,影响冲突分析和图遍历的正确性 - P2:2 个 — RetriedOptions.h 的 include guard 错配、
canAccept容量检查 off-by-one(允许maxFusedOps+1) - P3:3 个 —
isMemref()无 leaf 空检查、numLoops==0时越界访问、registerAndAnalyzeOp无 ShapedType 时 shape 为空
整体风险评估:中等
最关键的 P1 问题(isOpInBlock 实现错误)在存在 scf::IfOp 结构的 IR 中会直接导致冲突列表计算错误,进而影响融合决策的正确性。考虑到该 PR 已引入 enableCrossIfFusion 特性,scf::IfOp 场景是实际会触发的路径。建议在合入前优先修复 P1 和 P2 的问题。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 2 |
⛔ 需要修改


描述 Description
两阶段改动:
(1) 将冲突存储按来源拆分为四类,引入引用计数和 pivot 消解机制,使冲突可以增量更新而非一次性写入;
(2) 补齐 producer→consumer 融合路径缺失的 op 重排和 group 冲突刷新。
冲突存储拆分(commit 1)
Producer 融合路径补齐(commit 2)
关联特性issue:https://gitcode.com/Ascend/AscendNPU-IR/issues/324
类型 Category
Checklist
feat:,fix:)I have correctly used type labels in the title (e.g., feat:, fix:)