|
GCC 5 оптимизация, полная багов |
|
|
|
Oct 17 2016, 21:23
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
Хотел бы поинтересоваться у людей - использует ли кто-нибудь GCC 5 при полной оптимизации в проектах ? В gcc 5 (последний от launchpad) полно багов. Вот ссылка на баг-репорт. Есть ли смысл пробывать 4ю версию (или, может, другую 5ю ?). Переехал недавно с IAR - просто в шоке.
|
|
|
|
|
Oct 17 2016, 21:51
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Использую последнюю ланчпадовскую сборку и с -Os и c -Ofast, cortex M3, M7, A9 (с TDM7 давно тестировал). Везде проект ведёт себя предсказуемо... Цитата arm-none-eabi-gcc -c -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -Ofast -flto -gdwarf-2 -fomit-frame-pointer -Wall -Wstrict-prototypes - DNDEBUG=1 -DCPUSTYLE_STM32F7XX=1 -DSTM32F746xx=1 -MD -MP -MF ./dep/bandfilters.o.d -I../../CMSIS-SP-00300-r4p5-00rel0/CMSIS/Include -I../ ../bandfilters.c -o bandfilters.o Цитата arm-none-eabi-gcc -c -mcpu=cortex-a9 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -Ofast -flto -gdwarf-2 -fomit-frame-pointer -Wall -Wstrict-prototype s -DNDEBUG=1 -DCPUSTYLE_R7S721=1 -DCPUSTYLE_R7S721020=1 -MD -MP -MF ./dep/bandfilters.o.d -I../ -I../rza1x_inc ../bandfilters.c -o bandfilters.o Например так вызывается.
Сообщение отредактировал Genadi Zawidowski - Oct 17 2016, 21:57
|
|
|
|
|
Oct 17 2016, 21:53
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
Цитата(aaarrr @ Oct 18 2016, 00:36)  Собирал ряд проектов для Cortex-M3/M4 и ARM926EJ. Всюду оптимизация -O2, багов нет. Не могли бы Вы протестить ' gcc_bug2.tar' (с баг-репорта) у себя ? Собственно, это я баг-репорты запостил.
|
|
|
|
|
Oct 17 2016, 22:01
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
Цитата(aaarrr @ Oct 18 2016, 00:58)  Уже  Таки да, воспроизводятся оба. Мне на этой неделе продукцию отгружать. С виду все работает (опустился до -O1), но коленки дрожат. Если ли смысл в срочном порядке переходить на 4.9 ?
|
|
|
|
|
Oct 18 2016, 13:36
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
Оказался сам дурак (давненько не было проблем с оптимизацией). Смотрите ответы. Придется весь сторонний код как-то тестить и проверять и самому быть гораздо аккуратнее (оптимизация очень жесткой оказалась).
|
|
|
|
|
Oct 18 2016, 15:09
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Kabdim @ Oct 18 2016, 17:05)  Качество кода lwip во всей красе, UB на UB и UB погоняет. ЗЫ А варнинги это тоже пропустили? Я бы не стал вот так огульно. Этот баг был исправлен 3 мая 2012 года, то есть после выхода версии 1.4.0, но перед выходом 1.4.1. Кроме того, в обсуждении было сказано, что этот баг может вылезти только в том случае, если лёгкий выход за границу массива вдруг попадёт в защищённую область памяти и вызовет срабатывание защиты. Кто же мог предположить, что компилятор, увидев такое, воспримет это как индульгенцию генерировать чудо-юдо код? Я бы сказал, что это минус авторам gcc - в такой ситуации неплохо было бы хотя бы предупреждение выдать. Кроме того, это говорит о пользе обновления до последнего релиза. В конце концов, есть надежда, что будет исправлено больше старых багов, чем добавлено новых
|
|
|
|
|
Oct 19 2016, 08:46
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(scifi @ Oct 19 2016, 11:31)  При выходе за границу массива компилятор генерирует код, который не то, чтобы просто за границу массива выходит, а лезет в совершенно левые адреса. Вот как раз что то подобное в паре проектов у себя наблюдаю... только вот выходы за границу массивов не наблюдаю...
|
|
|
|
|
Oct 19 2016, 09:12
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Kabdim @ Oct 19 2016, 10:40)  Прочитал. Долго втыкал в код CODE int main() { P = (float*)&P; // cast causes TBAA violation in zero_array. zero_array(); } Так и не понял, где тут ошибка. QUOTE This behavior enables an analysis known as "Type-Based Alias Analysis" (TBAA) which is used by a broad range of memory access optimizations in the compiler, and can significantly improve performance of the generated code. For example, this rule allows clang to optimize this function: CODE float *P; void zero_array() { int i; for (i = 0; i < 10000; ++i) P[i] = 0.0f; } into "memset(P, 0, 40000)". This optimization also allows many loads to be hoisted out of loops, common subexpressions to be eliminated, etc. This class of undefined behavior can be disabled by passing the -fno-strict-aliasing flag, which disallows this analysis. When this flag is passed, Clang is required to compile this loop into 10000 4-byte stores (which is several times slower), because it has to assume that it is possible for any of the stores to change the value of P, as in something like this: CODE int main() { P = (float*)&P; // cast causes TBAA violation in zero_array. zero_array(); } Кто-то может объяснить? Про переполнение знаковых целых как аргументов для функций выделения памяти - сами себе злобные Буратины: нафига размер передавать знаковой переменной? К тому же есть беззнаковый тип size_t. Но в целом да, раскрыты некоторые неочевидные вещи.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 19 2016, 22:56
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
В случае с lwip (dhcp код, gcc_bug.tar): Предупреждение не выдается с любыми флагами: "-Wstrict-aliasing", "-Wstring-aliasing=1", "-Wstring-aliasing=2", "-Wstring-aliasing=3". Везде, кроме этого, есть ключ "-Wall". Кстати, флаг "-fno-strict-aliasing" так же не помогает: начиная с "-O2" генерируется тот же "кривой" код.
|
|
|
|
|
Oct 20 2016, 12:17
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553

|
Цитата(Сергей Борщ @ Oct 20 2016, 09:16)  Испугался за lwIP. Полез в репозиторий. Это неопределнное поведение было устранено еще в мае 2012 года. Может стоит взять исходники посвежее, там и кучу других ошибок устранили за это время? Само собой. Но речь сейчас идет о том, как такие проблемы поймать на этапе компиляции (в виде предупреждений). Выходит, никак (или я не знаю).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|