Pull Request已成功合入, 合并人@openeuler-ci-bot
(感谢 haibaoo 的贡献)变更摘要
本 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,以匹配默认开启成本比较后新增的候选模式分析输出。


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 .


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


| 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 | |


/ai_review


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


致命 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:
实际 effective-target 名称需根据项目已有 target-supports 宏适配。/* { dg-require-effective-target x86_c86_4g_m7 } */
- Reason: 该测试使用 EulerGCC 特定
-
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" } } */
- Reason: 该测试对 float 归约循环扫描
审阅结论
Severity: 通过
Conclusion: 建议通过
结论说明:
本次 diff 仅涉及 x86 向量化成本模型回移、参数定义、文档和对应测试,没有发现可证明的编译错误、运行时错误或数据一致性风险。变更逻辑与 PR 描述相符,新增测试与扫描次数调整有合理解释。完整上下文虽未覆盖到函数全部定义,但基于 diff 本身未发现必须修改的问题。
Review metadata:
- PR: #389
- Latest commit:
4ef66c4607957be6f00e15704fe25ee8d8392782 - Changed lines: 69
- Review mode: full
- Reviewed files: 7/7


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


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


| 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 | |


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


| 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 | |


/lgtm
/approve


PR功能描述 / 为什么需要这个合入:
本 PR 回移 GCC trunk 中以下三个 x86 向量化成本模型相关提交:
对应的上游修改分别为:
9b9d605d68c: Cost truth_value exprs in i386 vectorizer costs4b2db744302: Add --param ix86-vect-compare-costsa22b31304e0: Enable ix86-vect-compare-costs by default该修改使 x86 向量化器默认比较不同候选向量模式的估算成本,并根据目标机 cost model 选择估算成本最低的候选模式。
在原有实现中,x86 后端虽然可以向 vectorizer 提供多个候选向量模式,但不会要求 vectorizer 比较这些模式的成本。这可能导致编译器保留较宽但实际成本更高的向量化方案,产生额外的 load、shuffle 或 vector epilogue。
同时,本 PR 为 truth-value expression 增加显式成本计算,避免在比较候选向量模式时将比较表达式作为普通向量语句计费。
如需恢复原有行为,可以使用:
在 c86-4g-m7 平台进行的 SPEC CPU2017 base、ref、1-copy 测试中,默认开启该功能后观察到整体性能提升(其中分别提升525(18.83%),527(3.72%),549(4.08%))。
相关 GCC 上游问题:
希望检视人员了解的内容:
本 PR 是三个 GCC trunk 提交的组合回移,不包含额外功能扩展。
上游问题及新增测试:
costmodel-pr120398.c对应 PR120398。该问题中,x86vectorizer 为两个有序浮点 reduction 选择较宽向量后产生大量
shuffle,而对应的加法仍以标量形式执行。
开启 vector mode cost comparison 后,编译器选择 8-byte
vector,使两个 reduction 分别保存在两个浮点 lane 中,避免
循环内不必要的 shuffle。
costmodel-pr123603.c对应 PR123603。该问题表现为 SPECCPU2017
548.exchange2_r在 Zen4 上出现约 13% 的性能回退。对于 stride-9、每轮只处理两个相邻
int的短循环,原实现选择 16-byte vector,需要额外的 vector load、permute 和
epilogue。比较不同候选模式的成本后,8-byte vector 的估算
成本更低。
这两个测试均不显式指定:
因此同时验证了该参数默认开启后的向量模式选择。
3. GCC 12 分支测试适配:
costmodel-pr120398.c根据 GCC 12 的 vectorizer dump 格式,检查:
costmodel-pr123603.c使用:以稳定复现 EulerGCC 12 分支和 c86 cost model 下的 8-byte
vector 决策。
truth-value expression costing 按上游提交原样回移。对应上游
提交本身未增加独立测试。
Alignment peeling 测试调整:
vect-alignment-peeling-1.c和vect-alignment-peeling-2.c的 dump 扫描次数由 4 调整为 7。默认开启候选模式成本比较后,vectorizer 除 V4SF 外还会分析
8-byte 候选模式。其中三个循环在分析较小候选模式时额外输出
一次:
因此 dump 中的记录数为:
最终每个循环仍选择 V4SF。使用 baseline 和 patched 编译器
对比这两个测试生成的汇编,除编译器
.ident信息外,汇编指令完全一致。
因此该修改只调整候选模式分析产生的 dump 扫描次数,不代表
实际生成了更多 alignment peeling 循环,也不改变最终代码生成。
Bootstrap 验证:
测试源码:
主要配置:
构建命令:
验证结果:
构建退出状态为 0。
三阶段 bootstrap 完成。
stage_current=stage3。stage_final=stage3。stage2/stage3 对象比较通过。
最终编译器默认目标为:
DejaGNU 回归验证:
baseline:
patched:
两次构建除 prefix 和 pkgversion 外使用相同配置:
测试命令:
测试结果:
contrib/compare_tests结果:gcc.sum、g++.sum和gfortran.sum未发现新增回归。额外测试说明:
在 native/c86-4g-m7 配置下,部分检查精确汇编形态或向量宽度
的 scan 测试会因新的向量化决策发生变化。
本 PR 的社区默认验证结论基于相同源码配置下的
x86-64-v2/generic baseline 与 patched 对比,该配置未发现新增
FAIL。
Checklist:
PR格式
功能验证