gpt4 book ai didi

c - gcc 循环构造对汇编代码的更改

转载 作者:行者123 更新时间:2023-12-02 07:37:22 24 4
gpt4 key购买 nike

为什么 gcc 编译器在创建汇编代码时将 while 循环转换为 do-while 结构?我知道任何 while 循环都可以重写为 do-while,例如在 c 中

while (test) {
...
}

可以重写为

if ( !test ) goto skip;
do {
. . .
} while ( test );
skip:

最佳答案

基于anatolyg的答案,您可能想知道为什么 do-while 构造更有效,特别是考虑到如图所示,测试已被重复(因此生成的代码更大)。答案是,通常可以证明测试表达式在循环入口处始终为真,因此

    if ( !test ) goto skip;
loop:
. . . // loop body
if ( test ) goto loop;
skip:
. . . // continue the program

可以简化为

loop:
. . . // loop body
if ( test ) goto loop;
. . . // continue program

现在,如果编译器无法证明循环至少会循环一次,为什么不与原始转换同时执行此操作,并避免原始转换呢?因为证明循环至少会循环一次的算法实际上是一个通用的 if 条件优化器。通常的优化顺序是这样的:

  1. 将所有循环转换为“规范”形式(或多或少如上面第一个代码块所示)
  2. 进行大量优化,期望循环采用规范形式,例如所示的 if 语句消除。
  3. 完成所有与循环相关的事情后,尝试对可以消除冗余的地方进行去规范化。

另一件事是,有时会故意保留重复的测试,因为编译器希望这会产生更好的运行时行为。例如,如果编译器有理由相信循环通常循环多次,但无法证明它总是至少循环一次,则条件分支指令循环上方的条件分支几乎总是会失败,而循环下方的条件分支几乎总是会跳转。在这种情况下,将它们分开可能会使 CPU 的分支预测器更加准确。作为现代乱序 CPU 速度的限制因素,分支预测准确性仅次于缓存友好性。

关于c - gcc 循环构造对汇编代码的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7731076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com