选择与-O 1等效的gcc优化标志

yshpjwxd  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(80)

我有一个小程序,当用-O1编译时,它的性能要好得多,而不是没有优化。我很想知道编译器做了什么优化导致了这种加速。
我想我会做的是获取-O1等效的优化标志列表(从手册页和gcc -Q -v中获得),然后选择列表来查看性能如何变化。
我所发现的是,即使包括整个优化列表仍然没有给予我一个程序,以及执行一个-o 1优化的一个。
换句话说

gcc -O0 -fcprop-registers -fdefer-pop -fforward-propagate -fguess-branch-probability \
    -fif-conversion -fif-conversion2 -finline -fipa-pure-const -fipa-reference \
    -fmerge-constants -fsplit-wide-types -ftoplevel-reorder -ftree-ccp -ftree-ch \
    -ftree-copy-prop -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse \
    -ftree-fre -ftree-sink -ftree-sra -ftree-ter myprogram.c

并不等同于

gcc -O1 myprogram.c

我用的是gcc 4.5.3版
-O1还有什么没有包含在手册中与-O1相关的优化标志列表中的吗?

ax6ht2ek

ax6ht2ek1#

如何使用-S选项来检查生成的汇编程序?
从使用“my_program.c”的两个实验来看,-O 0选项似乎禁用了所有优化,而不管建议算法的长列表。

jv4diomz

jv4diomz2#

这是预期的,而不是一个bug:https://gcc.gnu.org/wiki/FAQ#optimization-options

  • O 1还做了什么没有包括在手册中与-O 1相关的优化标志列表中的事情吗?
    是的,它开启了优化。单个-fxxx标志不会这样做。
    如果您不使用-O1-O2-O3-Ofast-Og优化选项之一(而不是-O0),则根本不会发生优化,因此调整 * 哪些 * 优化通道处于活动状态不会起任何作用。
    若要查找哪一个优化过程产生了差异,您可以打开-O1,然后禁用各个优化过程,直到找到产生差异的优化过程。
    即,而不是:
gcc -fxxx -fyyy -fzzz ...

用途:

gcc -O1 -fno-xxx -fno-yyy -fno-zzz ...

相关问题