在编写一些代码,我注意到,在-O0和-O1之间产生汇编很大的差异。 我想通过启用/禁用的优化运行,直到我发现了什么导致在汇编了一定的变化。
如果我使用-fverbose-ASM准确找出哪些标志O1是使比较O0,然后手动禁用它们,为什么是汇编器生成还是这么大规模有什么不同? 即使我运行gcc与O0和手动添加所有fverbose-ASM所说的用O1启用的标志,我不明白,我只想用O1也得到了相同的汇编。
有什么除了“-f ...”和“-m ......”这是可以改变的?
或者仅仅是“01”有一些魔术不能关闭“O0”相比。
很抱歉的crypticness -这是有关与GCC + ARM递归过程中降低堆栈的使用 ,不过提到这是使这个问题有点难以理解。
如果你想要的是看它在传递O1未在O0使你可以运行类似启用:
gcc -O0 test.c -fdump-tree-all -da
ls > O0
rm -f test.c.*
gcc -O1 test.c -fdump-tree-all -da
ls > O1
diff O0 O1
类似的过程,使用一套你发现了标志,将让你看到什么额外的特殊通行证不受标志控制由GCC在O1进行。
编辑:
一个不太混乱的方式可能是比较-fdump通行证的输出,这将列出哪些是通过ON或OFF到标准错误。
因此,像:
gcc -O0 test.c -fdump-passes |& grep ON > O0
gcc -O1 test.c -fdump-passes |& grep ON > O1
diff O0 O1
不,这会有所帮助,除了提供你对怀疑一些其他证据-O1
魔法不能被关闭:
不幸的是,我还没有发现有关这些硬编码优化可以是任何明确的说法。 希望有人谁是knowlegable关于GCC的内部可能会发布有关的一些信息的应答。