gpt4 book ai didi

gcc - -O3 和 (-O2 + man gcc 说 -O3 添加到 -O2 的标志) 之间有什么区别?

转载 作者:行者123 更新时间:2023-12-03 10:16:21 25 4
gpt4 key购买 nike

我最近收到了关于一个程序的错误报告,该程序无法使用 -O3 开关编译(请参阅 https://github.com/cschwan/sage-on-gentoo/issues/66 )。特别是,问题是编译在某个点挂起。该问题通过使用 -O2 编译解决(我很清楚使用 -O3 编译的程序可能会被破坏,但我不知道 -O3 可能会挂断编译器)。如果你想重现问题运行

wget http://perso.ens-lyon.fr/xavier.pujol/fplll/libfplll-3.0.12.tar.gz
tar -xf libfplll-3.0.12.tar.gz
cd libfplll-3.0.12
./configure CXXFLAGS="-O3"
make

我想知道为什么 -O3 挂断了编译器,所以我试图追踪这个问题。首先,我试图找出 -O3 和 -O2 之间的区别。 Gcc 的手册页指出 -O3 启用了 -O2 和以下的开关(让我们称它们为 x ):
-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload
-ftree-vectorize -fipa-cp-clone

我通过比较 gcc 与 -Q -O2 --help=optimizers 调用时的输出来验证这一点。和 -Q -O3 --help=optimizers .然后我计划有选择地移除开关以找到导致问题的那个。但是,编译与 -O2 和上面的附加开关一起工作正常,所以我得出结论
-O3 != -O2 x

现在我的问题是:有没有人知道 -O2 和 -O3 之间是否有进一步的区别(未记录?),有没有人经历过类似的行为?这可能是编译器错误吗?

最佳答案

手册页可能已经过时,但您可以找到 O2 和 O3 的实际列表。

要获取 -f 的完整列表(几乎可以检查“更新”)实际使用的优化选项,建议你使用-fverbose-asm -save-temps (或 -fverbose-asm -S ) - 在 asm 文件 (*.s) 的顶部有一个完整列表。

对于 gcc-4.6.0,我得到 x(O2 和 O3 之间的差异)为:

 -fgcse-after-reload
-finline-functions
-fipa-cp-clone
-fpredictive-commoning
-ftree-loop-distribute-patterns
-ftree-vectorize
-funswitch-loops

您问题的另一个信息来源是 GCC 的来源(文件 gcc/opts.c 和可能的 gcc/common.opt)作为 gcc-4.6.0:
/* -O3 optimizations.  */
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
/* Inlining of functions reducing size is a good idea with -Os
regardless of them being declared inline. */
{ OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },

我也查过了,gcc 会查 -On在其他文件中(cscope 符号搜索 x_optimize)。
n的唯一附加用法来自选项 -On正在将其值保存到宏 __OPTIMIZE__ .因此,对于此宏的值等于 2 或 3,某些 header 的行为可能有所不同。

更新: There are questions about it in GCC WIKI :
  • “-O1(-O2、-O3 或 -Os)是否等同于单独的 -foptimization 选项?”

  • No. First, individual optimization options (-f*) do not enable optimization, an option -Os or -Ox with x > 0 is required. Second, the -Ox flags enable many optimizations that are not controlled by any individual -f* option. There are no plans to add individual options for controlling all these optimizations.


  • “-O1(-O2、-O3 或 -Os)启用了哪些特定标志?”

  • Varies by platform and GCC version. You can get GCC to tell you what flags it enables by doing this:


    touch empty.c
    gcc -O1 -S -fverbose-asm empty.c
    cat empty.s

    关于gcc - -O3 和 (-O2 + man gcc 说 -O3 添加到 -O2 的标志) 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6454415/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com