出于黑客的好奇心,我想知道如何gcc
能巧妙地优化下面的功能吗?
int c() {
int i, j = 0;
for (i = 0; i < 10; i++) {
j += i;
}
return j;
}
$objdump -D c.o
下面是针对arm的,但x86在逻辑上没有什么不同。
00000000 <c>:
0: 202d movs r0, #45 ; 0x2d
2: 4770 bx lr
我主要想知道这是否是一系列优化的结果或类似模板匹配的结果?有没有关于此类优化的文档?
优化器分阶段/遍地执行此操作...当您指定 -O2 时,会启用许多优化。这里发挥作用的主要优化是
- 循环展开 http://en.wikipedia.org/wiki/Loop_unwinding
- 不断传播 http://en.wikipedia.org/wiki/Constant_folding#Constant_propagation
- 不断折叠 http://en.wikipedia.org/wiki/Constant_folding#Constant_folding
- 死代码消除 http://en.wikipedia.org/wiki/Dead_code_elimination
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
所以这段代码
int i, j = 0;
for (i = 0; i < 10; i++) {
j += i;
}
return j;
循环展开后变成
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;
恒定传播经过后
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;
消除死代码后
j = 0;
j += 0;
j += 1;
j += 2;
j += 3;
j += 4;
j += 5;
j += 6;
j += 7;
j += 8;
j += 9;
return j;
after 不断折叠 http://en.wikipedia.org/wiki/Constant_folding#Constant_folding
j = 45;
return j;
最后,
return 45;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)