# Наиболее важные изменения при переходе от 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`.