GCC 优化选项

4
最近,我使用GCC编译程序时,在使用-O1优化选项时出现错误;但是在使用-O0时没有问题。所以,我按照官方文档的说法,用-fauto-inc-dec-fcompare-elim-fcprop-registers等选项替换了-O1。然而,它能够正常运行,没有任何错误,但性能不是很好。
我想知道-O1是否等同于这些小的编译选项?

4
听起来你的程序实际上存在一个漏洞,可能是由于未定义的行为引起的,而在-O0下意外地运行。你应该修复这个漏洞。 - Greg Hewgill
谢谢您,先生。这是非常有可能的。然而,我对-O1和那些被-O1打开的优化标志的区别很感兴趣。为什么它们会产生不同的影响呢? - sosohu
2个回答

4
启用所有优化选项(-O1-O0),会以一种-f标志无法控制的方式改变代码生成。请注意gcc文档中的这句话:

并非所有优化都由标志直接控制。此部分仅列出具有标志的优化。

某些详细信息取决于非常特定的gcc版本号(例如gcc 4.2与gcc 4.5、4.9等)。


1

-O1 将会开启以下优化标志:

      -fauto-inc-dec 
      -fcompare-elim 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -fipa-pure-const 
      -fipa-profile 
      -fipa-reference 
      -fmerge-constants
      -fsplit-wide-types 
      -ftree-bit-ccp 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-forwprop 
      -ftree-fre 
      -ftree-phiprop 
      -ftree-slsr 
      -ftree-sra 
      -ftree-pta 
      -ftree-ter 
      -funit-at-a-time

我曾经使用它们来替换 -O1 但效果并不相同。添加顺序也很重要吗? - sosohu
是的,在一般情况下,传递的顺序确实很重要。 - shrm
谢谢,我想知道在哪里可以获取这个序列?GCC手册按字母顺序排序。 - sosohu
@user2655195 我不知道是否有一个标志可以打印出传递顺序,但我猜想可以从传递管理器代码中找到它。请查看http://gcc.gnu.org/onlinedocs/gccint/Pass-manager.html。 - shrm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接