GCC 多个优化标志

发布于 2024-10-30 21:25:17 字数 395 浏览 0 评论 0原文

我有一些使用 -02 和 -03 集进行编译的遗留代码。从 GCC man 文件我得到保证:

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

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

I have some legacy code that compiles with both -02 and -03 set. From the GCC man file I get the guarantee that:

-O3 turns on all optimizations specified by -O2 and also turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize
options.

So, at first glance it would seem likely that turning both of these flags on would be the same as just -O3. However, that got me thinking is that the right thing to do in that case as -O2 is probably the "safer" option. Obviously, it is a simple matter compile some code with all of the permutations and see what happens in each case, but I was wondering if anyone knows if there is a specific policy that GCC has in regard to specifying multiple optimizations levels and if so what is the reasoning behind it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

深居我梦 2024-11-06 21:25:17

手册页

如果您使用多个 -O 选项,无论有或没有级别编号,最后一个此类选项都是有效的。

From the man page:

If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.

各自安好 2024-11-06 21:25:17

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

$ 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   

For over-concerned users like my self, here is a code begging for optimization:

$ 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
}

And Here are four compilation scenarios:

$ 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

Once I look for the constant 0xface, I see it exists in the non optimized versions:

$ 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

and optimized out in the optimized versions:

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

The whole foo call is gone:

$ 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   
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文