.. ВНИМАНИЕ!
   При изменении в данном документе, сам документ нужно скопировать во все ветки,
   где он присутствует. Кроме копирования ничего делать не надо

Наиболее важные изменения при переходе от lcc-1.24 к lcc-1.25 (changelog)
=========================================================================

.. Caveats в терминологии changelog'а компилятора gcc

Изменения, затрагивающие совместимость
--------------------------------------

* Изменён 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`` до промышленного уровня

..  Для демонстрации зрелости этого режима и его пригодности для больших проектов
..  (миллионы строк кода), сам компилятор портирован в режиме ``-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``.

