【问题标题】:How to get gcc -O1 optimization without specifying -O1如何在不指定 -O1 的情况下获得 gcc -O1 优化
【发布时间】:2010-12-19 05:12:28
【问题描述】:

我知道 -O1 会自动打开某些标志。这些标志可以手动打开。如果我不指定 -O1,应该仍然可以通过指定 -O1 打开的所有标志来获得 -O1 优化。

我试过了

-fthread-jumps -fcprop-registers -fguess-branch-probability

但它仍然不做 -O1 优化。我可以知道我何时使用 gprof,因为性能不太好。

我应该打开哪些标志来获得 -O1 优化?

【问题讨论】:

  • 我应该打开哪些标志来获得 -O1 优化?你打开-O1。手动打开每个标志是浪费您的时间并且容易出错。只需使用 GCC 家伙给你的捷径,而不是硬着头皮做事!!!

标签: c optimization gcc compiler-construction


【解决方案1】:

一种查找方法:

gcc -O1 -c -Q -v dummy.c

(其中 dummy.c 是您的文件名。)这会导致 gcc 将用于命令行的标志喷出。

编辑:请参阅kastauyra's answer。看来您无法仅使用 -f 标志来模拟完整的 -O1 优化。

【讨论】:

    【解决方案2】:

    很遗憾,这是不可能的。 -O1 打开了很多单独的优化标志,是的,但是 GCC 中的很多代码检查全局优化标志值并执行任何 -f.. 选项未指定的优化。

    【讨论】:

    • 嗯,这对我来说是个新闻……可以引用文档吗?
    • 文档没有这么说(可能会接受一个补丁来改变它)。但这可以从源代码中看出(检查位置数量 if (optimize > 0) ... 不检查单个标志),这也在 GCC 邮件列表中被问到:gcc.gnu.org/ml/gcc-help/2008-02/msg00389.html
    • "并非所有优化都直接由标志控制。本节仅列出具有标志的优化。大多数优化仅在命令行上设置 -O 级别时启用。否则它们被禁用,即使指定了单独的优化标志。“来自:gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
    【解决方案3】:

    来自手册:

    -O
    -O1
    Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. 
    
    With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. 
    
    -O turns on the following optimization flags: 
              -fauto-inc-dec 
              -fcprop-registers 
              -fdce 
              -fdefer-pop 
              -fdelayed-branch 
              -fdse 
              -fguess-branch-probability 
              -fif-conversion2 
              -fif-conversion 
              -fipa-pure-const 
              -fipa-reference 
              -fmerge-constants
              -fsplit-wide-types 
              -ftree-builtin-call-dce 
              -ftree-ccp 
              -ftree-ch 
              -ftree-copyrename 
              -ftree-dce 
              -ftree-dominator-opts 
              -ftree-dse 
              -ftree-forwprop 
              -ftree-fre 
              -ftree-phiprop 
              -ftree-sra 
              -ftree-pta 
              -ftree-ter 
              -funit-at-a-time
    

    【讨论】:

    • 还有其他内部标志无法“打开”以模拟完整的-O1
    【解决方案4】:

    您也可以尝试使用此编译指示(它需要 GCC >= 4.4):

    #pragma GCC optimize opt_list
    void f()
    

    此编译指示允许您打开和关闭给定函数的特定优化。 opt_list 是没有 -f 的 -f* 选项列表。

    还有改变优化级别的函数属性:

    int f() __attribute__((optimize(1)));
    

    您还可以更改全局优化级别(应用于所有后续功能):

    #pragma GCC optimize 1
    #pragma GCC optimize 0
    

    您也可以使用(适用于所有后续功能):

    #pragma GCC optimization_level n
    

    对于英特尔 C 编译器(doc;仅适用于下一个函数)

    #pragma intel optimization_level n
    

    【讨论】:

      【解决方案5】:

      这取决于您的 gcc 版本。请参阅gcc manpage

      在我的机器上,-O(即-O1)开启了以下优化:

         -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch
         -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion
         -finline-small-functions -fipa-pure-const -fipa-reference
         -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce
         -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce
         -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter
         -funit-at-a-time
      
         -O also turns on -fomit-frame-pointer on machines where doing so
         does not interfere with debugging.
      

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 2020-08-05
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 2021-09-06
        • 2019-04-10
        相关资源
        最近更新 更多