Merged
[Backport] Align tight and hot loops without a max-skip limit #393
[Backport] Align tight and hot loops without a max-skip limit #393
Merged
haibaooAdd on Aug 17
haibaoo
haibaoo
Aug 17

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-m7 tune 开启该功能,其他 x86 tune(包括 generic)保持原有行为。

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

  1. 本 PR 回移以下 4 个 GCC 上游提交:

  2. 主要上游修改包括:

    • 识别能够放入一个 cache line 的 tight/hot loop。
    • 对符合条件的循环入口执行不受普通 max-skip 限制的对齐。
    • 将对齐逻辑从原位置拆分为独立的 x86 RTL Pass。
    • 将该 Pass 移到 ENDBR 和 patchable-area 插入之后。
    • 增加 target tune 开关。
    • 保留上游对 CORE_ATOM 不启用该优化的约束。
  3. 循环需要满足以下主要条件才会对齐:

    • 循环具有足够高的 profile count,或者不存在会实际执行 padding 的 fallthrough 路径。
    • 循环基本块在 CFG layout 中连续。
    • 循环指令的估算总大小不超过目标 cache line 大小。
    • 循环中不包含无法估算大小的 inline assembly 或 call。
    • 循环控制流满足 tight-loop 分支数量限制。
  4. 本 PR 包含一个 EulerGCC 适配提交:

    • 使用 GCC 12 的 profile_count scaling API。
    • 最终仅为 c86-4g-m7 开启 X86_TUNE_ALIGN_TIGHT_LOOPS。
    • 调整测试以适配 EulerGCC GCC 12 的 Pass 顺序及汇编输出。
  5. 新增两个测试:

    • pr116174.c 使用 -mtune=c86-4g-m7 -fcf-protection=branch,检查 endbr64 之后生成 .p2align 5。
    • align-tight-loop-generic.c 使用 -mtune=generic,检查不会生成 .p2align 5,验证该优化不会影响其他默认 x86 tune。
  6. 本 PR 修改 x86 后端,不影响 AArch64 后端。

  7. 相关上游问题:

    • PR target/116174

Checklist:
PR格式

功能验证

  • 修改涉及后端架构

  • baseline:

            === gcc/g++/gfortran aggregate Summary ===
    
    # of expected passes            474373
    # of unexpected failures        34
    # of unexpected successes       18
    # of expected failures          3769
    # of unresolved testcases       15
    # of unsupported tests          16355
    

    patched:

            === gcc/g++/gfortran aggregate Summary ===
    
    # of expected passes            474377
    # of unexpected failures        34
    # of unexpected successes       18
    # of expected failures          3769
    # of unresolved testcases       15
    # of unsupported tests          16355
    

    contrib/compare_tests 未发现新增 FAIL:

    • gcc.sum 新增 4 个预期 PASS。
    • g++.sum 和 gfortran.sum 没有变化。
    • pr116174.c 编译及 .p2align 5 扫描通过。
    • align-tight-loop-generic.c 编译及不生成 .p2align 5 的扫描通过。
    • 所有失败相关统计与 baseline 保持一致。
likedislike
Pull Request has been successfully merged by openeuler-ci-bot.
(Thank you for haibaoo's contribution.)
haibaoohaibaoo
Aug 17 Created pull request, commit b11629b2
atomgit-bot
atomgit-bot
Aug 17 Comments:

变更摘要

本 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 下不生成该对齐指令。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
Aug 17 Comments:

代码审查

✅ 未发现问题

likedislike
Incorrect?
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 17 Set alexanderbill,li-yancheng,cf-zhao,eastb233,wangqiang95,kuenking111_admin,SegFault,wd-gitcode,chenzheng1030 as approver
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 17 Added label: sig/Compiler
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 17 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 17 Added label: stat/needs-squash
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 17 Added label: openeuler-cla/yes
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 17 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 17 Added label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 17 Comments:

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

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 17 Removed label: ci_processing
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 17 Comments:
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
likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Aug 17 Added label: ci_failed
openeuler-ci-bot
openeuler-ci-botCollaborators
Aug 17 Comments:
likedislike
zhuzhibiao1
Sep 2 Comments:

通过 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_count API 和风格为准。

审阅结论

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
likedislike
wd-gitcodeCollaborators
Sep 7 Comments:

/lgtm
/approve

likedislike
openeuler-ci-botopeneuler-ci-botCollaborators
Sep 7 Added label: approvedlgtm
openeuler-ci-bot
openeuler-ci-botCollaborators
Sep 7 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 7 Merged pull request, merge node SHA: 2b4f9668a31ab5ffa50391c66aff595658b0437c