Pull Request has been successfully merged by openeuler-ci-bot.
(Thank you for haibaoo's contribution.)变更摘要
本 PR 回移 GCC trunk 中 x86 tight/hot loop 对齐的实现,新增一个独立的 x86 late RTL Pass,用于对能完整放入单个 cache line 的热点循环入口执行不受普通 max-skip 限制的对齐,从而减少循环跨越 cache line 带来的取指开销。该 Pass 被安排在 pass_insert_endbr_and_patchable_area 之后、pass_shorten_branches 之前,使循环大小估算和对齐位置包含已插入的 endbr64 等指令。功能通过新增的 X86_TUNE_ALIGN_TIGHT_LOOPS tune 开关控制,最终仅在 c86-4g-m7 上启用,其他 x86 tune 保持原有行为;同时新增两个测试验证启用与禁用场景。
主要改动
- 新增 tight/hot loop 对齐 Pass: 在
gcc/config/i386/i386-features.cc中新增ix86_align_loops()、pass_align_tight_loops类及make_pass_align_tight_loops,实现识别能放入单个 cache line 的热循环并对循环入口执行不受 max-skip 限制的对齐。 - 调整 Pass 顺序: 在
gcc/config/i386/i386-passes.def中将pass_align_tight_loops插在pass_insert_endbr_and_patchable_area之后、pass_shorten_branches之前,确保循环大小估算与最终对齐位置包含已插入的endbr64等指令。 - 新增 tune 开关并限定启用范围: 在
gcc/config/i386/x86-tune.def中新增X86_TUNE_ALIGN_TIGHT_LOOPS,并在gcc/config/i386/i386.h中定义TARGET_ALIGN_TIGHT_LOOPS宏,仅对m_C86_4G_M7开启该优化。 - 改写 jump mispredict padding 的生成方式: 在
gcc/config/i386/i386.cc的ix86_avoid_jump_mispredicts中,将gen_pad替换为gen_max_skip_align (GEN_INT (4), GEN_INT (padsize)),使 padding 以 max-skip 对齐方式生成。 - 新增回归测试: 新增
gcc/testsuite/gcc.target/i386/pr116174.c与align-tight-loop-generic.c,分别验证-mtune=c86-4g-m7下endbr64后生成.p2align 5、-mtune=generic下不生成该对齐指令。


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/102/console


| Check Name | Build Result | 详情 | Build Details | |
|---|---|---|---|---|
| check_code | ❌FAILED | • CodeCheck检查发现代码缺陷,请查看报告: https://www.openlibing.com/apps/entryCheckDashCode/MR_54a93504fd784b1e867cc53dbb305883/6f18edb180323c7d98c289c0b17e9948?projectId=300024&codeHostingPlatformFlag=gitcode | #102 | |
| check_package_license | ✅SUCCESS | |||
| x86_64 | check_build | ✅SUCCESS | #110 | |
| aarch64 | check_build | ✅SUCCESS | #102 | |


通过 Pass
AI 代码审阅
优点
- 将 tight/hot loop 对齐拆分为独立的 x86 late RTL Pass,并明确放在 ENDBR/patchable-area 插入之后、branch shortening 之前,修复了 PR116174 关注到的 Pass 顺序问题。
- 通过
X86_TUNE_ALIGN_TIGHT_LOOPS精确控制功能开启范围,仅对c86-4g-m7生效,generic 等其他 x86 tune 保持原行为,兼容性控制清晰。 pad重命名为max_skip_align并扩展为两个操作数,使原有跳转 pad 和新的 tight loop 对齐复用同一输出逻辑,结构合理。- 新增测试同时覆盖正向用例(
pr116174.c)和反向用例(align-tight-loop-generic.c),能基本验证功能开关和 Pass 顺序。 - PR 描述给出的回归测试结果与 baseline 保持一致,新增 expected PASS 数量与新增测试规模相符。
变更文件覆盖检查
gcc/config/i386/i386-features.cc:按 diff 审查,未发现必须修改的问题;有可优化建议,见下方建议 1。gcc/config/i386/i386-passes.def:输入上下文冲突:辅助 full file context 未包含新增的INSERT_PASS_BEFORE行;按 diff 审查,未发现必须修改的问题。gcc/config/i386/i386-protos.h:输入上下文冲突:辅助 full file context 未包含新增make_pass_align_tight_loops声明;按 diff 审查,未发现必须修改的问题。gcc/config/i386/i386.cc:按 diff 审查,gen_pad到gen_max_skip_align的调用同步更新,未发现必须修改的问题。gcc/config/i386/i386.h:输入上下文冲突:辅助上下文截断处未显示新增TARGET_ALIGN_TIGHT_LOOPS宏;按 diff 审查,未发现必须修改的问题。gcc/config/i386/i386.md:按 diff 审查,改名为max_skip_align后操作数语义与调用方一致,未发现必须修改的问题。gcc/config/i386/x86-tune.def:按 diff 审查,新增 tune 开关与门控逻辑对应,未发现必须修改的问题。gcc/testsuite/gcc.target/i386/align-tight-loop-generic.c:按 diff 审查,测试预期与 generic tune 禁用行为一致,未发现必须修改的问题。gcc/testsuite/gcc.target/i386/pr116174.c:按 diff 审查,测试预期与 Pass 顺序和汇编输出一致,未发现必须修改的问题。
需要修改的问题
未发现明确必须修改的问题。
可优化建议
- Suggestion: 在
ix86_align_loops的 no-fallthrough 分支中,除了已检查 edge count 的initialized_p(),也建议对bb->count、bb->prev_bb->count以及ENTRY_BLOCK_PTR_FOR_FN (cfun)->count做initialized_p()防护后再参与比较和缩放。 - Reason: 当前代码已经对
fallthru_count和branch_count做了初始化检查,但同分支中的 block count 没有同样防护。虽然目前大部分 RTL 阶段 block count 通常已初始化,但增加显式检查可以与相邻逻辑保持一致,并避免 profile 数据缺失或特殊 CFG 路径下潜在的profile_count检查断言/未定义比较。 - Example:
注意:以上仅为防御性写法,具体应以项目现有: (branch_count > count_threshold || (bb->count.initialized_p () && bb->prev_bb->count.initialized_p () && ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.initialized_p () && bb->count > bb->prev_bb->count.apply_scale (10, 1) && (bb->prev_bb->count <= ENTRY_BLOCK_PTR_FOR_FN (cfun) ->count.apply_scale (1, 2))))profile_countAPI 和风格为准。
审阅结论
Severity: 通过
Conclusion: 建议通过
结论说明:
本次 PR 是 GCC trunk x86 tight/hot loop alignment 的回移和 EulerGCC 适配。从 diff 看,核心 Pass 逻辑、Pass 注册顺序、tune 开关、汇编输出 pattern 以及新增测试之间相互匹配,未发现由 diff 直接证明的编译错误、运行时崩溃或明确行为错误。仅有一项关于 profile_count 初始化防护的可选健壮性建议,不阻断合入。
Review metadata:
- PR: #393
- Latest commit:
2b2e1efd85ad070698033a3b3d0d784e37ea9d1f - Changed lines: 242
- Review mode: full
- Reviewed files: 9/9


/lgtm
/approve


PR功能描述 / 为什么需要这个合入:
回移 GCC trunk 中 x86 tight/hot loop alignment 的实现及相关后续调整,并适配到 EulerGCC GCC 12 和
c86-4g-m7。当一个热点循环的指令能够完整放入一个 instruction cache line 时,本 PR 在不受普通 max-skip 限制的情况下对循环入口进行对齐,避免循环跨越
cache line,改善指令预取和 decoded instruction cache 的利用,并减少因循环布局不理想产生的取指开销。
该功能作为独立的 x86 late RTL Pass 执行。Pass 位于 ENDBR 和 patchable-area 指令插入之后、branch shortening 之前,使循环大小估算及最终对齐
位置包含已经插入的 ENDBR,修复 PR116174 所涉及的 Pass 顺序问题。
最终仅为
c86-4g-m7tune 开启该功能,其他 x86 tune(包括 generic)保持原有行为。希望检视人员了解的内容:
本 PR 回移以下 4 个 GCC 上游提交:
主要上游修改包括:
循环需要满足以下主要条件才会对齐:
本 PR 包含一个 EulerGCC 适配提交:
profile_countscaling API。c86-4g-m7开启X86_TUNE_ALIGN_TIGHT_LOOPS。新增两个测试:
pr116174.c使用-mtune=c86-4g-m7 -fcf-protection=branch,检查endbr64之后生成.p2align 5。align-tight-loop-generic.c使用-mtune=generic,检查不会生成.p2align 5,验证该优化不会影响其他默认 x86 tune。本 PR 修改 x86 后端,不影响 AArch64 后端。
相关上游问题:
Checklist:
PR格式
功能验证
修改涉及后端架构
baseline:
patched:
contrib/compare_tests未发现新增 FAIL:gcc.sum新增 4 个预期 PASS。g++.sum和gfortran.sum没有变化。pr116174.c编译及.p2align 5扫描通过。align-tight-loop-generic.c编译及不生成.p2align 5的扫描通过。