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