【发布时间】:2011-06-23 13:02:25
【问题描述】:
我最近收到了一个关于使用 -O3 开关编译失败的程序的错误报告(请参阅https://github.com/cschwan/sage-on-gentoo/issues/66)。特别是,问题是编译在某个点挂起。通过使用 -O2 编译解决了这个问题(我很清楚使用 -O3 编译的程序可能会被破坏,但我不知道 -O3 可能会挂起编译器)。如果你想重现问题运行
wget http://perso.ens-lyon.fr/xavier.pujol/fplll/libfplll-3.0.12.tar.gz
tar -xf libfplll-3.0.12.tar.gz
cd libfplll-3.0.12
./configure CXXFLAGS="-O3"
make
我想知道为什么 -O3 会挂起编译器,所以我试图找出问题所在。首先,我试图找出-O2和-O3之间的区别。 Gcc 的手册页指出 -O3 启用了 -O2 和以下的开关(我们称它们为x):
-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload
-ftree-vectorize -fipa-cp-clone
我通过将调用时的 gcc 输出与-Q -O2 --help=optimizers 和-Q -O3 --help=optimizers 进行比较来验证这一点。然后我计划有选择地移除开关,以便找到导致问题的开关。但是,编译可以正常使用 -O2 和上面的附加开关,所以我得出结论
-O3 != -O2 x
现在我的问题:有人知道 -O2 和 -O3 之间是否有进一步的区别(未记录?),有没有人经历过类似的行为?这可能是编译器错误吗?
【问题讨论】:
-
我认为,您应该添加到问题 -O3 运行此类选项“-ftree-dump-all-all -frtl-dump-all-all”并找到最后一个挂起的阶段它。此外,检查 gcc 的堆栈,在
gdb --args下启动它并用 Ctrl-C 停止。 -
对于没有 C++/make 经验的谷歌用户,他们试图像我一样制作 libfplll,但没有指定任何标志,它在
enum/libfplll_la-enumerate_base.lo上“挂”了大约 30 分钟,然后继续。
标签: gcc