GCC 手册列出了为不同级别的优化应用的所有优化标志(-O1、-O2等)。但是,在编译和度量基准程序(例如cBench的automotive_bitcount)时,应用优化级别而不是手动打开所有列出的优化时有显着性差异。对于-O1和automotive_bitcount程序,我在用-O1编译时测量了大约100%的加速比,而不是手动应用所有列出的标志。这些“隐藏”的优化实际上似乎是GCC为-O1所做的优化工作的主要部分。当手动应用这些标志时,与没有优化相比,我只得到了10%的加速比。在应用来自gcc -c -Q -O3 --help=optimizers的所有已启用标志时,也可以观察到同样的情况。
在GCC手册中,我找到了解释这种行为的这一节:
并不是所有的优化都直接由一个标志控制。本节中只列出有标志的优化。大多数优化都是在-O0完全禁用的,或者在命令行中没有设置-O级别,即使指定了个别的优化标志。
因为我找不到关于这些优化的任何进一步的文档,所以我想知道是否有一种控制它们的方法,以及优化的细节是什么?
发布于 2022-02-07 06:57:00
一些优化由-O标志直接关闭,例如完全展开辊
{
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会影响他们的内部算法,例如在表达式优化中
/* 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。
https://stackoverflow.com/questions/71013515
复制相似问题