В чем разница между -O3 и (-O2 + флаги, которые, как сообщает man gcc, -O3 добавляет к -O2)?

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

27
задан Ciro Santilli 新疆改造中心法轮功六四事件 26 June 2015 в 06:28
поделиться