Merged
[Backport] ira: Consider save/restore costs of callee-save registers #397
[Backport] ira: Consider save/restore costs of callee-save registers #397
Merged
haibaooAdd on Aug 23
haibaoo
haibaoo
Aug 23

PR功能描述 / 为什么需要这个合入:
本 PR 回移 GCC 上游 IRA callee-save 成本模型相关修复,包括PR110071、PR111673、PR117477 和 PR118497,并补充回移 PR122827,修复 PR117477 暴露的 AArch64 SVE callee-save 正确性问题。

原有 IRA 寄存器分配成本模型在选择 callee-saved 寄存器时,不能完整反映最终生成代码中的实际成本,主要包括:

  1. improve_allocation 阶段没有计算新增 callee-saved 寄存器所需的 save/restore 成本;
  2. save/restore 成本没有按照函数入口和出口基本块频率缩放;
  3. 无法区分首次创建栈帧与已经存在 spill/栈帧的情况;
  4. 无法识别已经被函数真实引用、因而本来就需要保存的硬寄存器;
  5. 无法表达 x86 push/pop、AArch64 STP/LDP 等架构相关的边际成本。

上述问题可能导致 IRA 错误选择新的 callee-saved 寄存器,引入额外的
prologue/epilogue,或者使 shrink-wrapping 无法生效。该问题是在分析
SPEC CPU2017 511.povray_r 的性能差距时发现的。

PR117477 降低了 IRA 选择 callee-saved 寄存器的成本,使 AArch64 后端

原有的 SVE partial mode call-clobber 判断问题更容易被触发。对于
VNx2SF 等 SVE partial mode,GET_MODE_SIZE 只反映有效数据大小,
但相关 SVE 指令实际使用完整 Z 寄存器。如果把 V8-V15 误认为在普通
AAPCS64 调用间完整保留,可能造成寄存器上半部分被调用过程破坏并产生
错误代码。PR122827 修复了这一问题。

本 PR 主要完成以下修改:

  • 回移 PR110071,在 improve_allocation 中计算 callee-save 的保存和恢复成本;
  • 回移 PR111673,按照函数入口频率缩放 callee-save 成本;
  • 回移 PR117477,新增 TARGET_CALLEE_SAVE_COST 和
    TARGET_FRAME_ALLOCATION_COST target hook;
  • 记录已经发生的 spill 和已经选择的 callee-saved 寄存器,使 IRA
    计算真实的边际成本;
  • 为 x86 建模紧凑的 push/pop 保存和恢复成本;
  • 为 AArch64 建模 STP/LDP 成对保存、frame link 和栈帧分配折叠;
  • 回移 PR118497,统计硬寄存器的真实 use/def,避免对已经需要保存的
    callee-saved 寄存器重复收费;
  • 回移 PR122827,对 SVE mode 使用 BYTES_PER_SVE_VECTOR 判断
    callee-save 范围,避免把 V8-V15 错误视为完整保留;
  • 增加和适配 x86、AArch64、PowerPC testsuite 用例。
  • 同步加入 PR122827 上游 SVE 用例,并增加确定性的 AArch64 RTL
    回归用例。

上游提交参考:

希望检视人员了解的内容:
本 PR 共包含 9 个 commit。其中编译器功能修改均来自 GCC 上游,
EulerGCC 本地修改仅涉及 GCC 12 testsuite 期望适配、x86 回归测试以及
用于稳定复现 PR122827 的 AArch64 RTL 回归用例,没有引入私有的 IRA
优化算法。

GCC 12 与上游新版本存在以下差异:

  1. GCC 12 没有 TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE hook,
    因此不需要执行上游补丁中的旧 hook 删除操作;
  2. PR118497 上游包含的 vartrack-1.c 正则调整在 GCC 12 上不需要,
    原测试继续通过;
  3. GCC 12 对 AArch64 入参和浮点寄存器的分配顺序不同,因此
    callee_save_2.c 和 callee_save_3.c 仅调整了汇编期望,
    被验证的优化语义保持不变;
  4. PR111673 可能把合法的间接跳转生成为 GOT memory-indirect 形式,
    因此同步回移了 force-indirect-call-2.c 的上游测试修复;
  5. GCC 12 没有 aarch64-early-ra.cc,因此 PR122827 中对应的
    early-RA 修改不适用于本分支,只回移 aarch64.cc 中的修复;
  6. GCC 12 使用数值形式表示 AArch64 autovec preference,因此把上游
    PR122827 用例中的 sve-only 适配为数值 2。由于 GCC 12
    vectorizer 无法稳定使该源文件触发错误分配,额外增加了直接构造
    VNx2SF 跨调用存活场景的 RTL 回归用例。

Checklist:
PR格式

  • [x ] PR title是否和commit message title一致
  • [ x] commit message是否使用模板,请配置git config commit.template .gitee/commit_message

功能验证

  • 修改涉及后端架构

    • [ x] AArch64
    • [ x] X86_64
  • [ x] GCC自举构建是否通过,参考[Wiki](https://gitee.com/openeuler/gcc/wikis/如何贡献 openEuler GCC 社区)

  • [ x] GCC deja测试是否通过,并附上测试结果

                           baseline       patched       new FAIL
    

    gcc.sum:
    expected passes 178390 178394
    unexpected failures 212 212 0
    unexpected successes 60 60
    expected failures 1347 1347
    unresolved 14 14
    unsupported 6051 6052

    g++.sum:
    expected passes 229343 229343
    unexpected failures 83 83 0
    expected failures 1921 1921
    unresolved 1 1
    unsupported 10215 10215

    gfortran.sum:
    expected passes 66515 66515
    unexpected failures 1 1 0
    expected failures 272 272
    unsupported 81 81

    AArch64 PR122827 定向验证:

    • 修复前 rtl.exp=pr122827.c:1 PASS,1 FAIL;
    • 修复后 rtl.exp=pr122827.c:2 PASS;
    • 修复后 rtl.exp=pr122827.c 和 aarch64.exp=callee_save_*.c
      合计:13 PASS;
    • SVE 用例普通编译和 LTO 代码生成:PASS;
likedislike
Pull Request has been successfully merged by openeuler-ci-bot.
(Thank you for haibaoo's contribution.)
haibaoohaibaoo
Aug 23 Created pull request, commit 4a3af3a0
atomgit-bot
atomgit-bot
Aug 23 Comments:

变更摘要

本 PR 将 GCC 上游 IRA callee-save 成本模型相关修复(PR110071、PR111673、PR117477、PR118497)回移到 GCC 12,使寄存器分配器在选择 callee-saved 寄存器时能更准确地反映最终代码中的保存/恢复成本:在 improve_allocation 阶段计算 callee-save 成本、按函数入口/出口基本块频率缩放、区分首次创建栈帧与已有 spill 的情况、识别已被函数真实引用的硬寄存器,并支持 x86 push/pop、AArch64 STP/LDP 等架构相关的边际成本建模。该修复解决了 IRA 可能错误选择新的 callee-saved 寄存器、引入额外 prologue/epilogue 或导致 shrink-wrapping 失效的问题(最初在分析 SPEC CPU2017 511.povray_r 性能差距时发现)。

主要改动

  • 新增两个 target hook:在 target.def 中新增 TARGET_CALLEE_SAVE_COST 和 TARGET_FRAME_ALLOCATION_COST,在 target.h 中新增 spill_cost_type(SAVE/RESTORE)与 frame_cost_type(ALLOCATION/DEALLOCATION)枚举,在 targhooks.cc/h 中提供默认实现 default_callee_save_cost(无既有 spill 时叠加 TARGET_FRAME_ALLOCATION_COST)与 default_frame_allocation_cost(默认返回 0),并同步更新 gcc/doc/tm.texi 与 tm.texi.in 文档。

  • 重构 ira-color.cc 成本计算:assign_hard_reg 与 improve_allocation 改用 targetm.callee_save_cost 计算 save/restore 成本并按 REG_FREQ_FROM_BB 的入口/出口频率缩放,在平局时倾向 callee-save;新增 allocated_memory_p、allocated_callee_save_regs 及 record_allocation 跟踪已发生的 spill 与已选 callee-saved 寄存器,用 existing_spills_p 区分首次创建栈帧与已有 spill 的场景;calculate_saved_nregs 增加 ira_hard_regno_nrefs[...] == 0 判断,避免对已真实使用的 callee-saved 寄存器重复收费。

  • 统计硬寄存器真实 use/def:在 ira.cc 中新增 setup_hard_regno_nrefs,通过 DF 链统计硬寄存器真实引用次数(排除 artificial ref 与 debug insn),结果存入 ira-int.h 的 target_ira_int 新增字段 ira_hard_regno_nrefs,并精简了 setup_hard_regno_aclass。

  • 架构相关边际成本建模:gcc/config/i386/i386.cc 实现 ix86_callee_save_cost,建模 push/pop 的紧凑保存恢复成本(mem_cost - 2,size 优化时返回 1);gcc/config/aarch64/aarch64.cc 实现 aarch64_callee_save_cost(GPR/FP 成对 STP/LDP 边际成本、frame link 寄存器计数)与 aarch64_frame_allocation_cost(栈帧分配折叠成本),并通过 TARGET_CALLEE_SAVE_COST/TARGET_FRAME_ALLOCATION_COST 宏注册;同时在 hard-reg-set.h 中新增 hard_reg_set_popcount 辅助函数。

  • 测试用例:新增 x86 pr110071.c、pr111673.c、pr118497.c,PowerPC pr110071.c、pr111673.c,以及 AArch64 callee_save_1.c/callee_save_2.c/callee_save_3.c(验证 STP/LDP 与 shrink-wrapping);适配现有用例 pr103350-1.c(追加 -fno-caller-saves)与 force-indirect-call-2.c(放宽汇编期望以兼容 GOT memory-indirect 间接跳转)。

likedislike
Incorrect?
atomgit-bot
atomgit-bot
Aug 23 Comments:

代码审查

✅ 未发现问题

likedislike
Incorrect?
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Set alexanderbill,li-yancheng,cf-zhao,eastb233,wangqiang95,kuenking111_admin,SegFault,wd-gitcode,chenzheng1030 as approver
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Added label: sig/Compiler
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 23 Comments:

Welcome To openEuler Community

Hey @qq_56722097 , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: Compiler ,
and any of the maintainers: @SegFault, @alexanderbill, @cf-zhao, @chenzheng1030, @eastb233, @kuenking111_admin, @li-yancheng, @wangqiang95, @wd-gitcode ,
and any of the committers: @huang-xiaoquan, @huzife, @lin-4682, @xiongzhou4 .

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Added label: stat/needs-squash
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Added label: openeuler-cla/yes
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Added label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 23 Comments:

门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/gcc/108/console

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Removed label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 23 Comments:
Check Name Build Result 详情 Build Details
check_code ❌FAILED • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_4db573efa5794f57b7a30b91d719e952/0fa4e1fe09231ee3b9d43a4948ca98b5?projectId=300024&codeHostingPlatformFlag=gitcode #108
check_package_license ✅SUCCESS
x86_64 check_build ✅SUCCESS #116
aarch64 check_build ✅SUCCESS #108
likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 23 Added label: ci_failed
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 23 Comments:
likedislike
zhuzhibiao1
Aug 26 Comments:

一般 Minor

AI 代码审阅

优点

  • 回移目标明确且可追溯:PR 中列出了 GCC 上游对应提交,功能修改有明确来源,便于后续维护。
  • 新增的 TARGET_CALLEE_SAVE_COST / TARGET_FRAME_ALLOCATION_COST target hook 设计清晰,默认实现与文档同步更新,后端覆盖了 AArch64 和 x86。
  • ira-color.cc 中将 save/restore 成本与入口/出口基本块频率结合,比原实现更接近实际生成的 prologue/epilogue 成本。
  • 引入 ira_hard_regno_nrefs 统计硬寄存器真实引用,避免对已经需要保存的 callee-saved 寄存器重复计费,方向合理。
  • 测试覆盖了 x86、AArch64、PowerPC,并针对 GCC 12 的差异对期望汇编做了本地适配,且测试结果中未新增 FAIL。

变更文件覆盖检查

部分核心文件未提供完整 full file context,本次审查以 diff 为主要依据。gcc/hard-reg-set.h 的 full file context 与 diff 不一致,已单独标注。

文件 审查结果
gcc/config/aarch64/aarch64.cc 未见可证明问题
gcc/config/i386/i386.cc 未见可证明问题
gcc/doc/tm.texi 未见可证明问题;文档变更,不影响构建/依赖/运行时
gcc/doc/tm.texi.in 未见可证明问题;hook 文档入口与 target.def 同步
gcc/hard-reg-set.h input conflict:提供的 full context 未包含新增 hard_reg_set_popcount,以 diff 为准;diff 未发现可证明问题
gcc/ira-color.cc 未见可证明问题;主要 IRA 成本逻辑变更,full context 未提供完整情况下仍以 diff 为准
gcc/ira-int.h 未见可证明问题;新增 ira_hard_regno_nrefs 字段及宏
gcc/ira.cc 未见可证明问题;新增硬寄存器引用计数初始化
gcc/target.def 未见可证明问题;DEFHOOK 语法和默认实现声明一致
gcc/target.h 未见可证明问题;新增 scoped enum 类型
gcc/targhooks.cc 未见可证明问题;默认 hook 实现语义与文档一致
gcc/targhooks.h 未见可证明问题;默认 hook 声明完整
gcc/testsuite/gcc.target/aarch64/callee_save_1.c 未见可证明问题
gcc/testsuite/gcc.target/aarch64/callee_save_2.c 未见可证明问题
gcc/testsuite/gcc.target/aarch64/callee_save_3.c 未见可证明问题
gcc/testsuite/gcc.target/aarch64/pr103350-1.c 未见可证明问题
gcc/testsuite/gcc.target/i386/force-indirect-call-2.c 未见可证明问题
gcc/testsuite/gcc.target/i386/pr110071.c 未见可证明问题
gcc/testsuite/gcc.target/i386/pr111673.c 未见可证明问题
gcc/testsuite/gcc.target/i386/pr118497.c 未见可证明问题
gcc/testsuite/gcc.target/powerpc/pr110071.c 未见可证明问题
gcc/testsuite/gcc.target/powerpc/pr111673.c 未见可证明问题

需要修改的问题

未发现明确必须修改的问题。


可优化建议

  • Suggestion: 建议在 gcc/ira-color.cc 的 improve_allocation 附近增加注释,说明该阶段仍使用 legacy 成本公式,而未复用 TARGET_CALLEE_SAVE_COST / TARGET_FRAME_ALLOCATION_COST 的原因。

  • Reason: 当前 assign_hard_reg 已使用新 target hook,并区分 save/restore 的 entry/exit 频率;而 improve_allocation 仍直接使用 ira_memory_move_cost 之和,并仅按 entry 频率缩放。若这是上游阶段行为,后续维护者容易误认为此处遗漏了 hook 接入。

  • Example:

    /* improve_allocation 仍使用 PR110071/PR111673 引入的 legacy 成本,
       新 target hook 在 assign_hard_reg 中处理,避免局部优化阶段重复计算。  */
    
  • Suggestion: 建议在 gcc/testsuite/gcc.target/aarch64/pr103350-1.c 中为新增的 -fno-caller-saves 添加简短注释。

  • Reason: 该选项是为适配本 PR 的 callee-save 成本变化而加入的,但没有说明原因;后续回移或调整 IRA 成本模型时,维护者可能误删该选项,导致测试回归。

  • Example:

    /* The IRA callee-save cost changes alter caller-saved register usage;
        -fno-caller-saves preserves the original REE test intent.  */
    /* { dg-additional-options "... -fno-caller-saves" } */
    

审阅结论

Severity: 通过

Conclusion: 建议通过

结论说明:

该 PR 是对 GCC 上游 IRA callee-save 成本模型修复的回移,代码路径清晰,默认 hook、后端实现和测试适配基本一致。未发现会直接导致编译失败、运行崩溃、数据不一致或安全问题的明确证据。部分 full file context 缺失或不一致,但基于 diff 中的变更未发现必须阻断合入的问题。


Review metadata:

  • PR: #397
  • Latest commit: 7d4184009876557caf0cf5c41d9f302186464297
  • Changed lines: 641
  • Review mode: full
  • Reviewed files: 22/22
likedislike
Leyou-Fan
Aug 31 Comments:

[P1] 请同步回移 PR122827 的 AArch64 SVE 修复

定位:gcc/config/aarch64/aarch64.cc:17825(本 PR 新增 aarch64_callee_save_cost);相关既有代码位于 aarch64_hard_regno_call_part_clobbered(约 5356–5368 行)。

上游后续提交 5cb0842b(PR target/122827) 明确将 SPEC CPU2017 526.blender_r 的静默错算二分定位到本系列包含的 b191e8bdecf(PR117477):新的 callee-save 成本会让 IRA 把 VNx2SF 值放到 V8–V15 并跨普通 AAPCS64 调用存活,而本分支的 aarch64_hard_regno_call_part_clobbered 仍按 GET_MODE_SIZE (mode) 判断。VNx2SF 在 128-bit SVE 下报告 8 字节,因此被误判为完整保存;但 AAPCS64 只保证保存 D8–D15 的低 64 位,SVE 指令却使用完整 Z 寄存器,被调用方可合法破坏高半部分,随后产生错误浮点结果。

该问题可在本树直接触发:aarch64_sve_mode_p、BYTES_PER_SVE_VECTOR、VNx2SF、Neoverse V2 和相关 SVE 选项均已存在。请在合入前回移 5cb0842b 的 aarch64.cc 部分:SVE mode 使用 BYTES_PER_SVE_VECTOR 计算 per_register_size,非 SVE mode 保持原逻辑;同时回移 gcc.target/aarch64/sve/pr122827.c。本 GCC 12 树没有 aarch64-early-ra.cc,因此上游提交的 early-RA 部分不适用;测试选项需把新版本的 sve-only 适配为本树的 --param=aarch64-autovec-preference=2。

建议在 SVE128 AArch64 上验证:PR 当前 head 应能复现用例失败,补齐修复后用例应通过。等价触发选项为 -Ofast -flto=auto -mcpu=neoverse-v2 -msve-vector-bits=128 --param=aarch64-autovec-preference=2。

likedislike
haibaoohaibaoo
Aug 31 Pre merge succeeded (commit_id: 2cfc49d235e2db0cea56b6e9dc3813e9cff95a56)
haibaoohaibaoo
Aug 31 Pushed 1 commits:2e7d2527-[Backport] aarch64: Treat SVE modes as full-Z for callee-save accounting [PR122827]
haibaoohaibaoo
Aug 31 Pre merge succeeded (commit_id: d003c4571b787c3755706ad4b36ba7995349c4dc)
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Removed label: openeuler-cla/yes
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Added label: openeuler-cla/yes
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 31 Comments:

CLA Signature Pass

qq_56722097, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Removed label: ci_failed
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Added label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 31 Comments:

门禁正在运行, 您可以通过以下链接查看实时门禁检查结果.
若您对门禁结果含义不清晰或者遇到问题不知如何解决,可参考门禁指导手册
门禁入口及编码规范检查: multiarch/openeuler/trigger/gcc/118/console

likedislike
haibaoohaibaoo
Aug 31 Modify description of pull request
haibaoo
haibaoo
Aug 31 Comments:

[P1] 请同步回移 PR122827 的 AArch64 SVE 修复

定位:gcc/config/aarch64/aarch64.cc:17825(本 PR 新增 aarch64_callee_save_cost);相关既有代码位于 aarch64_hard_regno_call_part_clobbered(约 5356–5368 行)。

上游后续提交 5cb0842b(PR target/122827) 明确将 SPEC CPU2017 526.blender_r 的静默错算二分定位到本系列包含的 b191e8bdecf(PR117477):新的 callee-save 成本会让 IRA 把 VNx2SF 值放到 V8–V15 并跨普通 AAPCS64 调用存活,而本分支的 aarch64_hard_regno_call_part_clobbered 仍按 GET_MODE_SIZE (mode) 判断。VNx2SF 在 128-bit SVE 下报告 8 字节,因此被误判为完整保存;但 AAPCS64 只保证保存 D8–D15 的低 64 位,SVE 指令却使用完整 Z 寄存器,被调用方可合法破坏高半部分,随后产生错误浮点结果。

该问题可在本树直接触发:aarch64_sve_mode_p、BYTES_PER_SVE_VECTOR、VNx2SF、Neoverse V2 和相关 SVE 选项均已存在。请在合入前回移 5cb0842b 的 aarch64.cc 部分:SVE mode 使用 BYTES_PER_SVE_VECTOR 计算 per_register_size,非 SVE mode 保持原逻辑;同时回移 gcc.target/aarch64/sve/pr122827.c。本 GCC 12 树没有 aarch64-early-ra.cc,因此上游提交的 early-RA 部分不适用;测试选项需把新版本的 sve-only 适配为本树的 --param=aarch64-autovec-preference=2。

建议在 SVE128 AArch64 上验证:PR 当前 head 应能复现用例失败,补齐修复后用例应通过。等价触发选项为 -Ofast -flto=auto -mcpu=neoverse-v2 -msve-vector-bits=128 --param=aarch64-autovec-preference=2。

@Leyou-Fan

感谢检视,已按建议同步回移 PR target/122827,对应提交为 2e7d2527e。

已回移 aarch64.cc 中的修复,并同步加入上游gcc.target/aarch64/sve/pr122827.c;测试参数已适配为 GCC 12 使用的--param=aarch64-autovec-preference=2。本分支没有 aarch64-early-ra.cc,因此该部分不适用。

由于 GCC 12 的 vectorizer 无法稳定通过上游源用例触发错误分配,另外增加了确定性的 RTL 回归用例。该用例修复前为 1 PASS、1 FAIL,修复后为 2 PASS;与现有 AArch64 callee-save 用例合计 13 PASS。

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Removed label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 31 Comments:
Check Name Build Result 详情 Build Details
check_code ❌FAILED • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_e63a3204342b4a0c8f961c8cf1b35aff/58a731dc2dddd3a418e9e483b70ca630?projectId=300024&codeHostingPlatformFlag=gitcode #118
check_package_license ✅SUCCESS
x86_64 check_build ✅SUCCESS #126
aarch64 check_build ✅SUCCESS #118
likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 31 Added label: ci_failed
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 31 Comments:
likedislike
wd-gitcodeCollaborators
Sep 2 Comments:

/lgtm
/approve

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Sep 2 Added label: approvedlgtm
openeuler-ci-bot
openeuler-ci-botCollaborators
Sep 2 Comments:

Review Code Feedback

  • The label lgtm, approved was added to this pull request. It means that wd-gitcode reviewed the code changes. 👋
Tips
  • If this pull request is not merged while all conditions are met, comment /check-pr to try again. 😄
likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Sep 2 Merged pull request, merge node SHA: fc168108df064502951dac2b5709c703f122de03