Наиболее важные изменения при переходе от 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
Общие улучшения¶
Переход на edg-5.1. В lcc-1.24 использовался edg-5.0
Добавлена поддержка C11 _Atomic
Добавлена экспериментальная поддержка C++20
Доведение режима
-mptr128
до промышленного уровня
Добавлена поддержка процессора r2000+
Улучшена поддержка OpenMP:
Добавлена поддержка всех видов массивов языка Fortran
Добавлена поддержка C++ exceptions. За счёт этого стало возможным распараллеливать циклы, содержащие вызовы функций, которые потенциально могут бросать исключения (раньше в этом случае компилятор выдавал ошибку).
Добавлена поддержка следующих опций:
-fno-fast-math
Добавлена поддержка прагм:
#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
.