已合并
[Backport] i386: Enable vector cost comparison by default #389
[Backport] i386: Enable vector cost comparison by default #389
已合并
haibaoo创建于 8月13日
haibaoo
haibaoo
8月13日

PR功能描述 / 为什么需要这个合入:
本 PR 回移 GCC trunk 中以下三个 x86 向量化成本模型相关提交:

对应的上游修改分别为:

  • 9b9d605d68c: Cost truth_value exprs in i386 vectorizer costs
  • 4b2db744302: Add --param ix86-vect-compare-costs
  • a22b31304e0: Enable ix86-vect-compare-costs by default

该修改使 x86 向量化器默认比较不同候选向量模式的估算成本,并根据目标机 cost model 选择估算成本最低的候选模式。

在原有实现中,x86 后端虽然可以向 vectorizer 提供多个候选向量模式,但不会要求 vectorizer 比较这些模式的成本。这可能导致编译器保留较宽但实际成本更高的向量化方案,产生额外的 load、shuffle 或 vector epilogue。

同时,本 PR 为 truth-value expression 增加显式成本计算,避免在比较候选向量模式时将比较表达式作为普通向量语句计费。

如需恢复原有行为,可以使用:

  --param ix86-vect-compare-costs=0

在 c86-4g-m7 平台进行的 SPEC CPU2017 base、ref、1-copy 测试中,默认开启该功能后观察到整体性能提升(其中分别提升525(18.83%),527(3.72%),549(4.08%))。

相关 GCC 上游问题:

  • PR tree-optimization/120398
  • PR target/123603

希望检视人员了解的内容:

  1. 本 PR 是三个 GCC trunk 提交的组合回移,不包含额外功能扩展。

  2. 上游问题及新增测试:

    • costmodel-pr120398.c 对应 PR120398。该问题中,x86
      vectorizer 为两个有序浮点 reduction 选择较宽向量后产生大量
      shuffle,而对应的加法仍以标量形式执行。

      开启 vector mode cost comparison 后,编译器选择 8-byte
      vector,使两个 reduction 分别保存在两个浮点 lane 中,避免
      循环内不必要的 shuffle。

    • costmodel-pr123603.c 对应 PR123603。该问题表现为 SPEC
      CPU2017 548.exchange2_r 在 Zen4 上出现约 13% 的性能回退。

      对于 stride-9、每轮只处理两个相邻 int 的短循环,原实现
      选择 16-byte vector,需要额外的 vector load、permute 和
      epilogue。比较不同候选模式的成本后,8-byte vector 的估算
      成本更低。

    这两个测试均不显式指定:

    --param ix86-vect-compare-costs=1
    

    因此同时验证了该参数默认开启后的向量模式选择。
    3. GCC 12 分支测试适配:

    • costmodel-pr120398.c 根据 GCC 12 的 vectorizer dump 格式,
      检查:

      Choosing vector mode V8QI
      
    • costmodel-pr123603.c 使用:

      -mtune=c86-4g-m7
      

      以稳定复现 EulerGCC 12 分支和 c86 cost model 下的 8-byte
      vector 决策。

    • truth-value expression costing 按上游提交原样回移。对应上游
      提交本身未增加独立测试。

  3. Alignment peeling 测试调整:

    vect-alignment-peeling-1.c 和
    vect-alignment-peeling-2.c 的 dump 扫描次数由 4 调整为 7。

    默认开启候选模式成本比较后,vectorizer 除 V4SF 外还会分析
    8-byte 候选模式。其中三个循环在分析较小候选模式时额外输出
    一次:

    Alignment of access forced using peeling
    

    因此 dump 中的记录数为:

    原有 V4SF peeling 记录:4
    新增 8-byte 候选记录:3
    总数:                 7
    

    最终每个循环仍选择 V4SF。使用 baseline 和 patched 编译器
    对比这两个测试生成的汇编,除编译器 .ident 信息外,汇编
    指令完全一致。

    因此该修改只调整候选模式分析产生的 dump 扫描次数,不代表
    实际生成了更多 alignment peeling 循环,也不改变最终代码生成。

  4. Bootstrap 验证:

    测试源码:

    a1e85212064612612873b2a7c99456d956ca4af8
    

    主要配置:

    --enable-bootstrap
    --enable-checking=release
    --with-arch_64=x86-64-v2
    --with-tune=generic
    --disable-multilib
    --enable-languages=c,c++,fortran,lto
    

    构建命令:

    make -j32 bootstrap
    

    验证结果:

    • 构建退出状态为 0。

    • 三阶段 bootstrap 完成。

    • stage_current=stage3。

    • stage_final=stage3。

    • stage2/stage3 对象比较通过。

    • 最终编译器默认目标为:

      -march=x86-64-v2
      -mtune=generic
      
  5. DejaGNU 回归验证:

    baseline:

    1448cecd0d080d0084746440ba14d9d189e2f0da
    

    patched:

    a1e85212064612612873b2a7c99456d956ca4af8
    

    两次构建除 prefix 和 pkgversion 外使用相同配置:

    --enable-werror
    --enable-checking=release
    --with-arch_64=x86-64-v2
    --with-tune=generic
    --disable-bootstrap
    --disable-multilib
    --enable-languages=c,c++,fortran,lto
    

    测试命令:

    make -j32 check-gcc
    

    测试结果:

    baseline g++.sum:
      PASS=229301 FAIL=9 XPASS=0 XFAIL=2065
      UNRESOLVED=1 UNSUPPORTED=10219
    
    patched g++.sum:
      PASS=229301 FAIL=9 XPASS=0 XFAIL=2065
      UNRESOLVED=1 UNSUPPORTED=10219
    
    baseline gcc.sum:
      PASS=178556 FAIL=25 XPASS=18 XFAIL=1432
      UNRESOLVED=14 UNSUPPORTED=6055
    
    patched gcc.sum:
      PASS=178562 FAIL=25 XPASS=18 XFAIL=1432
      UNRESOLVED=14 UNSUPPORTED=6055
    
    baseline gfortran.sum:
      PASS=66516 FAIL=0 XPASS=0 XFAIL=272
      UNRESOLVED=0 UNSUPPORTED=81
    
    patched gfortran.sum:
      PASS=66516 FAIL=0 XPASS=0 XFAIL=272
      UNRESOLVED=0 UNSUPPORTED=81
    

    contrib/compare_tests 结果:

    • 退出状态为 0。
    • gcc.sum、g++.sum 和 gfortran.sum 未发现新增回归。
    • patched-only unique FAIL:0。
    • baseline-only unique FAIL:0。
    • 新增测试产生 6 个预期 PASS。
    • alignment-peeling 的新扫描预期均通过。
  6. 额外测试说明:

    在 native/c86-4g-m7 配置下,部分检查精确汇编形态或向量宽度
    的 scan 测试会因新的向量化决策发生变化。

    本 PR 的社区默认验证结论基于相同源码配置下的
    x86-64-v2/generic baseline 与 patched 对比,该配置未发现新增
    FAIL。

Checklist:
PR格式

功能验证

  • 修改涉及后端架构
likedislike
Pull Request已成功合入, 合并人@openeuler-ci-bot
(感谢 haibaoo 的贡献)
haibaoohaibaoo
8月13日 创建了 pull request,commit 043cd317
atomgit-bot
atomgit-bot
8月13日 评论:

变更摘要

本 PR 将 GCC trunk 中三个 x86 向量化成本模型相关提交回移到当前分支,核心目的是让 x86 向量化器默认比较不同候选向量模式的估算成本,并据此选择成本最低的候选模式;同时为 truth-value expression 补充显式成本计算,避免在候选模式比较时把比较表达式当作普通向量语句计费。此外新增了 ix86-vect-compare-costs 参数用于开关该行为,并相应调整/新增了测试用例。

主要改动

  • 默认启用向量模式成本比较: 在 ix86_autovectorize_vector_modes 中,当 ix86_vect_compare_costs 为真时返回 VECT_COMPARE_COSTS,使 x86 后端默认要求 vectorizer 比较不同候选向量模式的估算成本。
  • 增加 truth-value expression 成本计算: 在 ix86_vector_costs::add_stmt_cost 的 default 分支中,针对 truth_value_p 的语句按 mode 分别估算成本(如 SSE 浮点模式用 sse_op、向量模式用 ix86_vec_cost),避免将比较表达式按普通向量语句计费。
  • 新增 ix86-vect-compare-costs 参数: 在 gcc/config/i386/i386.opt 中新增 -param=ix86-vect-compare-costs=(默认值为 1),并在 gcc/doc/invoke.texi 中补充该参数的文档说明。
  • 新增向量化成本模型测试: 新增 costmodel-pr120398.c(检查选择 V8QI 向量模式)和 costmodel-pr123603.c(检查使用 8-byte vector 向量化)两个测试,验证参数默认开启后的候选模式选择。
  • 调整 alignment peeling 测试扫描次数: 将 vect-alignment-peeling-1.c 和 vect-alignment-peeling-2.c 中 Alignment of access forced using peeling 的扫描次数从 4 调整为 7,以匹配默认开启成本比较后新增的候选模式分析输出。
likedislike
不准确?
atomgit-bot
atomgit-bot
8月13日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
openeuler-ci-botopeneuler-ci-bot成员
8月13日 将alexanderbill,li-yancheng,cf-zhao,eastb233,wangqiang95,kuenking111_admin,SegFault,wd-gitcode,chenzheng1030设为审查人
openeuler-ci-botopeneuler-ci-bot成员
8月13日 添加了label:sig/Compiler
openeuler-ci-bot
openeuler-ci-bot成员
8月13日 评论:

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-bot成员
8月13日 添加了label:openeuler-cla/yes
openeuler-ci-botopeneuler-ci-bot成员
8月13日 添加了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月13日 评论:

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

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月13日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月13日 评论:
Check Name Build Result 详情 Build Details
check_code ❌FAILED • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_d82d19f164a740419bd5263fa5922d92/880f472fd6eadafdc1e822c7665e194b?projectId=300024&codeHostingPlatformFlag=gitcode #96
check_package_license ✅SUCCESS
x86_64 check_build ✅SUCCESS #104
aarch64 check_build ✅SUCCESS #96
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月13日 添加了label:ci_failed
openeuler-ci-bot
openeuler-ci-bot成员
8月13日 评论:
likedislike
haibaoo
haibaoo
8月13日 评论:

/ai_review

likedislike
haibaoo
haibaoo
8月13日 评论:

另外ci_failed中都是语法风格和gcc-trunk的冲突,作为backport的PR,我认为此处不需要修改.

likedislike
zhuzhibiao1
8月17日 评论:

致命 Fatal

AI 代码审阅

优点

  • 回移目标明确,将上游三个相关提交合并为一个功能开关,默认开启,同时保留 --param ix86-vect-compare-costs=0 恢复旧行为,兼容性考虑较好。
  • 新增 truth_value_p 成本计算覆盖了 SSE 浮点、x87、向量和标量比较表达式,避免候选向量模式比较时比较表达式被错误计费,逻辑上比较完整。
  • 新增两个回归测试分别对应 PR120398 和 PR123603,且测试不显式设置 ix86-vect-compare-costs=1,能验证默认开启行为。
  • vect-alignment-peeling-1.c 与 vect-alignment-peeling-2.c 的扫描次数调整有详细解释,并说明最终汇编除 .ident 外一致,降低了对测试改动的顾虑。
  • 文档 invoke.texi 与 i386.opt 参数定义一致,用户可见行为描述清晰。

变更文件覆盖检查

文件 审查结果
gcc/config/i386/i386.cc 已审阅,未发现必须修改问题。
gcc/config/i386/i386.opt 已审阅,未发现必须修改问题;该文件涉及编译器参数解析与默认优化行为。
gcc/doc/invoke.texi 已审阅,未发现必须修改问题;文档与新增参数定义一致。
gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr120398.c 已审阅,未发现必须修改问题。
gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123603.c 已审阅,未发现必须修改问题。
gcc/testsuite/gcc.target/i386/vect-alignment-peeling-1.c 已审阅,未发现必须修改问题。
gcc/testsuite/gcc.target/i386/vect-alignment-peeling-2.c 已审阅,未发现必须修改问题。

说明:完整文件上下文对 i386.cc 相关函数仅提供了截断内容,未能核对 ix86_vector_costs::add_stmt_cost 的完整局部变量声明;以下结论以 diff 中可见变更为主。

需要修改的问题

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

可优化建议

  • Suggestion: 为 costmodel-pr123603.c 增加针对 c86-4g-m7 的 effective-target 或 skip 保护。

    • Reason: 该测试使用 EulerGCC 特定 -mtune=c86-4g-m7,如果测试环境中的 i386 后端未识别该 CPU,测试可能在编译阶段直接失败。增加保护可提高测试在不同 x86_64 配置下的可移植性。
    • Example:
      /* { dg-require-effective-target x86_c86_4g_m7 } */
      
      实际 effective-target 名称需根据项目已有 target-supports 宏适配。
  • Suggestion: 在 costmodel-pr120398.c 中为 V8QI 的 dump 扫描增加简短注释。

    • Reason: 该测试对 float 归约循环扫描 "Choosing vector mode V8QI",从源码直观看容易与实际的浮点向量模式混淆。注释可帮助后续维护者理解 GCC 12 的 dump 格式。
    • Example:
      /* GCC 12 的 vect dump 将选中的 8-byte 候选模式显示为 V8QI,
         不要与 float 向量元素模式 V2SF 混淆。  */
      /* { dg-final { scan-tree-dump "Choosing vector mode V8QI" "vect" } } */
      

审阅结论

Severity: 通过

Conclusion: 建议通过

结论说明:
本次 diff 仅涉及 x86 向量化成本模型回移、参数定义、文档和对应测试,没有发现可证明的编译错误、运行时错误或数据一致性风险。变更逻辑与 PR 描述相符,新增测试与扫描次数调整有合理解释。完整上下文虽未覆盖到函数全部定义,但基于 diff 本身未发现必须修改的问题。


Review metadata:

  • PR: #389
  • Latest commit: 4ef66c4607957be6f00e15704fe25ee8d8392782
  • Changed lines: 69
  • Review mode: full
  • Reviewed files: 7/7
likedislike
haibaoohaibaoo
8月17日 预合并成功(commit_id: 57e03a37537f15b870b7e664f67b6731d42f800c)
此处折叠了6条事件消息 查看更多
openeuler-ci-botopeneuler-ci-bot成员
8月17日 添加了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:

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

likedislike
haibaoohaibaoo
8月17日 预合并成功(commit_id: 4cc70b1e7dc81f9e3702b1282c2ba73b94ae335f)
haibaoohaibaoo
8月17日 强制推送  1 个提交:4ef66c46-[Backport] i386: Enable vector cost comparison by default
haibaoohaibaoo
8月17日 预合并成功(commit_id: 1d5171572bedf257506033f1fc7578d13f27957f)
openeuler-ci-botopeneuler-ci-bot成员
8月17日 删除了label:openeuler-cla/yes
openeuler-ci-botopeneuler-ci-bot成员
8月17日 删除了label:stat/needs-squash
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): stat/needs-squash.

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月17日 添加了label:openeuler-cla/yes
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:

CLA Signature Pass

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

likedislike
haibaoo
haibaoo
8月17日 评论:

已接受AIreview的意见:1.并在costmodel-pr123603.c中加入了补充说明2.在invoke.texi中补充参数使用说明

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月17日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:
Check Name Build Result 详情 Build Details
check_code ❌FAILED • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_02c52ea120d7470cb513719be1a82218/1504653f787cbd7b4fe3a3bd56bc0c87?projectId=300024&codeHostingPlatformFlag=gitcode #97
check_package_license ✅SUCCESS
x86_64 check_build ✅SUCCESS #105
aarch64 check_build ✅SUCCESS #97
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月17日 添加了label:ci_failed
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:
likedislike
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:

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

likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月17日 删除了label:ci_failed
openeuler-ci-botopeneuler-ci-bot成员
8月17日 添加了label:ci_processing
openeuler-ci-botopeneuler-ci-bot成员
8月17日 删除了label:ci_processing
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:
Check Name Build Result 详情 Build Details
check_code ❌FAILED • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_842ce9da3a464da29fa0262df80eb6d4/e7612edcaeed87c440c16cc95c084e1e?projectId=300024&codeHostingPlatformFlag=gitcode #98
check_package_license ✅SUCCESS
x86_64 check_build ✅SUCCESS #106
aarch64 check_build ✅SUCCESS #98
likedislike
openeuler-ci-botopeneuler-ci-bot成员
8月17日 添加了label:ci_failed
openeuler-ci-bot
openeuler-ci-bot成员
8月17日 评论:
likedislike
wd-gitcode成员
9月2日 评论:

/lgtm
/approve

likedislike
openeuler-ci-botopeneuler-ci-bot成员
9月2日 添加了label:approvedlgtm
openeuler-ci-bot
openeuler-ci-bot成员
9月2日 评论:

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-bot成员
9月2日 合入了pull request,合并节点 SHA:2a74671a3627ce0f43aad59602ca499373ed425c