首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC隐优化

GCC隐优化
EN

Stack Overflow用户
提问于 2022-02-07 04:31:43
回答 1查看 46关注 0票数 1

GCC 手册列出了为不同级别的优化应用的所有优化标志(-O1、-O2等)。但是,在编译和度量基准程序(例如cBench的automotive_bitcount)时,应用优化级别而不是手动打开所有列出的优化时有显着性差异。对于-O1和automotive_bitcount程序,我在用-O1编译时测量了大约100%的加速比,而不是手动应用所有列出的标志。这些“隐藏”的优化实际上似乎是GCC为-O1所做的优化工作的主要部分。当手动应用这些标志时,与没有优化相比,我只得到了10%的加速比。在应用来自gcc -c -Q -O3 --help=optimizers的所有已启用标志时,也可以观察到同样的情况。

在GCC手册中,我找到了解释这种行为的这一节:

并不是所有的优化都直接由一个标志控制。本节中只列出有标志的优化。大多数优化都是在-O0完全禁用的,或者在命令行中没有设置-O级别,即使指定了个别的优化标志。

因为我找不到关于这些优化的任何进一步的文档,所以我想知道是否有一种控制它们的方法,以及优化的细节是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 06:57:00

一些优化由-O标志直接关闭,例如完全展开辊

代码语言:javascript
复制
{
public:
  pass_complete_unrolli (gcc::context *ctxt)
    : gimple_opt_pass (pass_data_complete_unrolli, ctxt)
  {}

  /* opt_pass methods: */
  virtual bool gate (function *) { return optimize >= 2; }
  virtual unsigned int execute (function *);

}; // class pass_complete_unrolli

对于其他人来说,-O会影响他们的内部算法,例如在表达式优化

代码语言:javascript
复制
         /* If FROM is a SUBREG, put it into a register.  Do this
            so that we always generate the same set of insns for
            better cse'ing; if an intermediate assignment occurred,
            we won't be doing the operation directly on the SUBREG.  */
         if (optimize > 0 && GET_CODE (from) == SUBREG)
           from = force_reg (from_mode, from);

没有办法解决这个问题,您必须使用-O

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71013515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档