Pull Request已成功合入, 合并人@CANN-robot
(感谢 Jett_Woo 的贡献)变更摘要
本 PR 修复 BroadcastBackwardPass 对 scalar-like 生产者(输出视图为空)的处理缺陷:浮点改写协议产出的 IndexExpr(int64, 空输出视图) → Broadcast → Cast(f32) 链会绕过原有只认 kScalarType 的 scalar 门控进入广播后移,进而在 ReorderBroadcasts 改写图边后触发 GetBroAxisesIndex 的前后视图轴数断言失败,使图停留在半改写状态且错误被 RunPasses 忽略。核心改动集中在 broadcast_backward_pass.cpp:新增 IsScalarLikeProducer 统一扩展门控判定,并在改写图边前增加轴数守卫(fail-closed)杜绝半改写状态;同时测试 builder 新增 IndexExpr 构造方法以还原真实前端空视图形态,配套新增 3 个 UT 用例。
主要改动
- 新增
IsScalarLikeProducer门控函数: 在broadcast_backward_pass.cpp中新增IsScalarLikeProducer(识别Scalar/ScalarData/IndexExpr,与 codegen 侧IsScalarNodeType白名单语义对齐),并将CollectBackwardStartNodes的门控判定与多消费路径BackwardMultiRefBroadcast的is_pre_scalar判定从仅认kScalarType统一扩展为该函数,使 scalar-like 生产者按 scalar 输入支持性被正确拒绝后移。 - 新增前广播视图轴数守卫: 在
ProcessOriginalBackwardLogic改写图边之前,比较前广播节点与广播输出节点的AscTensorAttr的repeats轴数,不一致时整体跳过(fail-closed),避免产生边已重排而属性/dtype 未同步的半改写状态。 - 测试 builder 新增
IndexExpr构造方法: 在asc_graph_builder.h/asc_graph_builder.cpp中新增AscGraphBuilder::IndexExpr(name, expr, dtype),与真实前端一致地保持 scalar-like 节点输出视图为空(不补 axis/repeats/strides),区别于Scalar/ScalarData自动补齐 repeats 的测试便利行为。 - 新增 3 个 UT 用例: 在
test_broadcast_backward_pass.cpp中新增SkipsIndexExprBroadcastSource、SkipsScalarDataBroadcastSource、SkipsBroadcastWithMismatchedPreViewAxes,分别覆盖 IndexExpr/ScalarData 的门控拒绝,以及非 scalar-like 生产者(Load)输出视图被置空后由轴数守卫兜底拒绝的场景,均断言图连接与 dtype 保持原状。


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 |
|---|---|---|
| repo-cann/graph-autofusion | ✅ wangxiaotian995, yangyongqiang0606, zhang_shengjie (3/2) | ✅ yangyongqiang0606 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
Jett_Woo, thanks for your pull request. All authors of the commits have signed the CLA. 👍


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


/lgtm


/lgtm


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


/lgtm


/lgtm


/approve


Pull Request
描述
修复 BroadcastBackwardPass 对 scalar-like 生产者的处理缺陷。
浮点改写协议产出的
IndexExpr(int64, 空输出视图) → Broadcast → Cast(f32)链(测试环境 2026-09-14 plog 首次触发)会使 pass 的 scalar 门控失效:CollectBackwardStartNodes的门控只认kScalarType,IndexExpr/ScalarData(scalar-like,输出视图为空)绕过门控进入后移;ReorderBroadcasts先改写图边后,GetBroAxisesIndex的前后视图轴数断言失败(0 轴 vs N 轴),图停留在半改写状态(边已重排、属性/dtype 未同步),且错误被RunPasses忽略后继续编译。修复内容(
broadcast_backward_pass.cpp,+22/-2):IsScalarLikeProducer(Scalar/ScalarData/IndexExpr),与 codegen 侧IsScalarNodeType白名单语义对齐;CollectBackwardStartNodes门控与多消费路径BackwardMultiRefBroadcast的is_pre_scalar判定统一扩展;ProcessOriginalBackwardLogic在改写图边前增加前广播视图与广播输出视图的轴数守卫,不一致整体跳过(fail-closed),杜绝半改写状态。配套测试:测试 builder 新增
IndexExpr构造方法(真实前端空视图形态,不自动补视图);新增 3 个 UT 覆盖 IndexExpr/ScalarData 门控拒绝与视图守卫兜底。变更类型
关联的Issue
#302(IndexExpr/Arange Autofusion 与 broadcast backward 合入交叉触发的缺陷,缺陷本体位于 broadcast backward pass)
如何测试
BroadcastBackwardPass.SkipsIndexExprBroadcastSource/SkipsScalarDataBroadcastSource/SkipsBroadcastWithMismatchedPreViewAxes三个用例——修复前在未修复代码上验证 RED(RunPass 返回 FAILED,错误链与测试环境 plog 逐行一致),修复后 GREEN;optimize_ut全量 759 用例(711 通过 + 48 既有跳过,0 失败);BroadcastBackwardPass 套件 76 用例(基线 33 通过 + 40 既有跳过 → 36 通过 + 40 跳过,仅新增 3 个通过,无既有行为变化);核对清单
其他信息
真机对照验证表明:IndexExpr/Arange RDV 回归中另有 11 个组合在原版 pass 下同样失败(multi_arange 断言崩溃;triu/remainder_cast/degenerate_arange_add_3d 因退化轴视图的语义改写错误导致 codegen 失败)——为本修复之外的 pass 独立适配项,本修复未改变其结果(零回归),后续另行跟进。