Наиболее важные изменения при переходе от lcc-1.24 к lcc-1.25 (changelog)
Изменения, затрагивающие совместимость
- Изменён ABI режима
-mptr128. Из-за этого коды из-под lcc-1.25 в режиме -mptr128
стали бинарно-НЕсовместимыми с кодами из-под более ранних версий компилятора.
- Встроенная функция
__builtin_expect_prob объявлена устаревшей.
Вместо неё следует использовать __builtin_expect_with_probability, совместимую с gcc-9.
- Изменена трактовка квалификатора
volatile.
Раньше операция обращения к переменной с квалификатором volatile считалась “полюсом”,
т.е. не могла быть переставлена с вызовами и любыми другими операциями обращения к памяти
в процессе оптимизаций.
В новой трактовке volatile операцию нельзя переставлять с вызовами и
другими volatile операциями.
Данное изменение позволяет лучше перемешивать код, однако может
привести к некорректной работе программ, в которых предполагалось,
что volatile операции являются “полюсом”.
Данное изменение сделано ради ускорения ядра linux.
- Следующие устаревшие опции более не поддерживаются:
- -fwhole-obj
- -ffor-inline-libs
- -finline-libs
- -fno-inline-libs
- -finline-vararg
- -finline-growfactor=
- -finline-size=
- -finline-uncond-size=
- -finline-to-size=
- -finline-prog-growfactor=
- -flib-inline-uncond-size=
- -finline-probable-calls=
- –inline_libs
- –inline_list=
- –inline_into_list=
- –not_inline_list=
- –inline_list_tuned=
- -fignore-inline-libs-incompatible
- -fdfa-pointers-ext
- -fdfa-pointers-aggr
- -fipo-prefetch
- -fschedral
- -floop-reroll
- -fgsh
- -fgsh-cache-opt
- -fgsh-dam-ext
- -fgsh-maxopers=
- -fno-gnu
- -fgnu
- -fprofile-use-ext
- -fprofile-generate-ext
- -fuse-asm-output
- -fno-use-asm-output
Общие улучшения
- Добавлена поддержка C11 _Atomic
- Добавлена экспериментальная поддержка C++20
- Доведение режима
-mptr128 до промышленного уровня
- Добавлена поддержка процессора r2000+
- Улучшена поддержка OpenMP:
- Добавлена поддержка всех видов массивов языка Fortran
- Добавлена поддержка C++ exceptions. За счёт этого стало возможным
распараллеливать циклы, содержащие вызовы функций, которые потенциально
могут бросать исключения (раньше в этом случае компилятор выдавал ошибку).
- Добавлена поддержка прагм:
- #pragma ivdep - указывает на независимость операций обращения к памяти в цикле
- #pragma prefetch - форсирует включение аппаратной предподкачки данных в цикле
- #pragma noprefetch - запрещает использование аппаратной предподкачки данных в цикле
- #pragma comb_oper - форсирует комбинирование пар арифметических операций в двухэтажные операции в цикле
- #pragma reduce recurrence - форсирует разрыв рекурентностей в цикле
- #pragma no_dam - запрещает применение динамического разрыва зависимостей (DAM) в цикле
- #pragma vector nontemporal - запрещает заведение в кэш-память всех уровней и включает режим write combining для операций записи в цикле
- #pragma inline - рекомендует inline-подстановку функций в следующую за директивой строку
- #pragma no_inline - запрещает inline-подстановку функций в следующую за директивой строку
- Добавлена поддержка
__builtin_expect_with_probability для указания вероятности ветвлений управления
- Реализована выдача отчёта о применении оптимизаций (в текстовый файл или на экран).
Для этого добавлены следующие опции:
- -fopt-report[=N] - включить выдачу отчёта о применившихся оптимизациях
с опциональным заданием уровня детализации
N=[1;5],
по умолчанию N=2
- -fopt-report-file=<file> - направить выдачу отчёта о применившихся оптимизациях в файл
<file>
- -fopt-report-append - добавлять выдачу отчёта в конец файла, не перезатирая его содержимое
- -fopt-report-dir=<dir> - сохранять отчёты о применившихся оптимизациях в каталоге
<dir>
- -fopt-report-phase=<phase1,phase2,…> - указать оптимизации, для которых выводится отчёт
- -fopt-report-routine=<name1,name2,…> - указать функции, для которых выводится отчёт
- -fopt-report-help - напечатать список всех оптимизаций, для которых возможна генерация отчёта
- Добавлена поддержка режима
-mstrict-align для запрета генерации невыровненных обращений к памяти.
Режим по умолчанию зависит от наличия в целевой архитектуре эффективной поддержки
невыровненных обращений к памяти.
- Реализован режим профилирования для ядра linux-4.19
(опция
-fprofile-generate-kernel)
- Оптимизация вынос векторного инварианта (VIR - Vector Invariant Removal)
теперь включается опцией
-fvir
- Проведена большая работа по ускорению компиляции.
По замерам на стандартных бенчмарках spec cpu 2017
среднее ускорение составило 12% в режиме -O3.
Доработки оптимизаций
- Добавлена поддержка 64-разрядного аппаратного счётчика циклов,
появившегося в Elbrus V5. За счёт этого в некоторых случаях
компилятору не требуется выполнять loop splitting для задействования
аппаратной поддержки исполнения циклов, т.е. уменьшаются накладные
расходы на эту поддержку, что может быть заметно для циклов
с небольшим количеством итераций.
- Доработана автоматическая векторизация для Elbrus V5/V6: улучшены эвристики, определяющие
полезность векторизации циклов; добавлен учёт эффективной аппаратной поддержки
невыровненных обращений к памяти.
- Добавлено сокращение рекурентности с помощью циклического регистрового буфера.
Это позволяет существенно ускорить циклы, время исполнения которых определяется
длинной рекурентной цепочки из арифметических операций.
- Доработан межпроцедурный анализ указателей ipa_simple для поддержки очень больших программ.
За счёт этого при компиляции в режиме
-fwhole анализ может порвать больше зависимостей
между обращениями к памяти, и код может планироваться более плотно.
- Проведена большая работа по настройке оптимизаций в режиме
-mptr64.
По нашим замерам на стандартных бенчмарках spec cpu 2017
среднее ускорение составило 14.5%
- Реализована оптимизация Structure Peeling - разрезание динамического массива структур
на отдельные массивы, соответствующие полям структуры.
Оптимизация включается в режиме
-fstruct-reorg.