【问题标题】:GCC multiple optimization flagsGCC 多个优化标志
【发布时间】:2011-07-30 06:13:59
【问题描述】:

我有一些旧代码可以同时编译 -02 和 -03 集。从 GCC 手册文件中,我得到以下保证:

-O3 打开 -O2 指定的所有优化,同时打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload 和 -ftree-vectorize 选项。

因此,乍一看,打开这两个标志似乎与仅 -O3 相同。但是,这让我想到,在这种情况下正确的做法是 -O2 可能是“更安全”的选项。显然,用所有排列编译一些代码并查看每种情况下会发生什么是一件简单的事情,但我想知道是否有人知道 GCC 是否有关于指定多个优化级别的特定策略,如果有的话是什么背后的原因是什么?

【问题讨论】:

    标签: optimization gcc


    【解决方案1】:

    来自man page:

    如果您使用多个 -O 选项,无论有无级别编号,最后一个这样的选项是有效的。

    【讨论】:

      【解决方案2】:

      对于像我这样过度关注的用户,这里有一个代码乞求优化:

      $ cat dominant_flag.c
      #include <stdio.h>
      int foo(int i)
      {
          return 3*i+122;
      }
      int main(int argc, char **argv)
      {
          return foo(0xface); // meant to be optimized out
      }
      

      这里有四种编译场景:

      $ gcc -g -O0     dominant_flag.c -o flag0
      $ gcc -g -O3     dominant_flag.c -o flag3
      $ gcc -g -O0 -O3 dominant_flag.c -o flag03
      $ gcc -g -O3 -O0 dominant_flag.c -o flag30
      

      一旦我查找常量0xface,我发现它存在于非优化版本中:

      $ objdump -S -D flag0  | grep -w "\$0xface" # 61e: bf ce fa 00 00 mov $0xface,%edi
      $ objdump -S -D flag30 | grep -w "\$0xface" # 61e: bf ce fa 00 00 mov $0xface,%edi
      

      并在优化版本中进行了优化:

      $ objdump -S -D flag3  | grep -w "\$0xface"
      $ objdump -S -D flag03 | grep -w "\$0xface"
      

      整个 foo 调用消失了:

      $ objdump -S -D flag03 | sed -n "297,298p;299q"
       4f0:   b8 e4 f0 02 00          mov    $0x2f0e4,%eax # <--- hex(3*0xface+122)=0x2f0e4
       4f5:   c3                      retq   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2010-10-30
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多