Недавно я получил сообщение об ошибке в программе, которая не может быть скомпилирована с ключом -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 (недокументировано?), Испытывал ли кто-нибудь подобное поведение? Может быть, это ошибка компилятора?