gcc优化的说明

aus*_*len 9 c optimization performance gcc

出于黑客的好奇心,我想知道如何gcc能够巧妙地优化这个功能?

int c() {
        int i, j = 0;
        for (i = 0; i < 10; i++) {
                j += i;
        }
        return j;
}
Run Code Online (Sandbox Code Playgroud)

$objdump -D c.o 下面是针对arm但x86在逻辑上没有区别.

00000000 <c>:
   0:   202d        movs    r0, #45 ; 0x2d
   2:   4770        bx  lr
Run Code Online (Sandbox Code Playgroud)

我大多想知道这是否是一系列优化或类似模板匹配的结果?有没有关于此类优化的文档?

amd*_*mdn 12

优化器在阶段/传递中执行此操作...当您指定-O2时,会启用许多优化.这里发挥的主要优化是

  1. 循环展开
  2. 不断传播
  3. 不断折叠
  4. 死码消除

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

所以这段代码

int i, j = 0;
for (i = 0; i < 10; i++) {
    j += i;
}
return j;
Run Code Online (Sandbox Code Playgroud)

循环展开后变为

int i, j = 0;
i=0; j += i;
i=1; j += i;
i=2; j += i;
i=3; j += i;
i=4; j += i;
i=5; j += i;
i=6; j += i;
i=7; j += i;
i=8; j += i;
i=9; j += i;
return j;
Run Code Online (Sandbox Code Playgroud)

在不断传播之后

int i, j = 0;
i=0; j += 0;
i=1; j += 1;
i=2; j += 2;
i=3; j += 3;
i=4; j += 4;
i=5; j += 5;
i=6; j += 6;
i=7; j += 7;
i=8; j += 8;
i=9; j += 9;
return j;
Run Code Online (Sandbox Code Playgroud)

在死码消除之后

j = 0;
j += 0;
j += 1;
j += 2;
j += 3;
j += 4;
j += 5;
j += 6;
j += 7;
j += 8;
j += 9;
return j;
Run Code Online (Sandbox Code Playgroud)

常量合并

j = 45;
return j;
Run Code Online (Sandbox Code Playgroud)

最后,

return 45;
Run Code Online (Sandbox Code Playgroud)