在GCC -O0和-O1之间的差异(Differences between -O0 and -O1

2019-08-02 03:52发布

在编写一些代码,我注意到,在-O0和-O1之间产生汇编很大的差异。 我想通过启用/禁用的优化运行,直到我发现了什么导致在汇编了一定的变化。

如果我使用-fverbose-ASM准确找出哪些标志O1是使比较O0,然后手动禁用它们,为什么是汇编器生成还是这么大规模有什么不同? 即使我运行gcc与O0和手动添加所有fverbose-ASM所说的用O1启用的标志,我不明白,我只想用O1也得到了相同的汇编。

有什么除了“-f ...”和“-m ......”这是可以改变的?

或者仅仅是“01”有一些魔术不能关闭“O0”相比。


很抱歉的crypticness -这是有关与GCC + ARM递归过程中降低堆栈的使用 ,不过提到这是使这个问题有点难以理解。

Answer 1:

如果你想要的是看它在传递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


Answer 2:

不,这会有所帮助,除了提供你对怀疑一些其他证据-O1魔法不能被关闭:

  • 从http://gcc.gnu.org/ml/gcc-help/2007-11/msg00214.html :

    通过启用-O1警告,并不是所有的优化有一个命令行切换标志禁用它们。

  • 从哈根的“权威指南GCC,第二版”:

    注:并非所有GCC的优化可以使用标志来控制。 GCC自动执行一些优化和,短修改源代码,当你使用-O请求优化不能禁用这些优化

不幸的是,我还没有发现有关这些硬编码优化可以是任何明确的说法。 希望有人谁是knowlegable关于GCC的内部可能会发布有关的一些信息的应答。



文章来源: Differences between -O0 and -O1 in GCC
标签: c gcc embedded arm