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

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

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

* Изменена версия g++ ABI. В lcc-1.25 и более ранних версиях версия g++ ABI была зафиксирована
  на уровне gcc-3.4.6. Начиная с lcc-1.26 версия g++ ABI будет соответствовать версии gcc,
  с которой номинально совместим lcc. Любое изменение версии g++ ABI приводит к тому, что
  некоторые конструкции C++ становятся бинарно несовместимыми

* В lcc-1.25 по ошибке поддерживались feature test macros: ``__has_feature``,
  ``__has_extension``, ``__has_builtin``, ``__is_identifier``. Эти макросы
  соответствуют clang'у, в gcc их быть не должно. Наличие поддержки этих макросов
  иногда приводило к тому, что при сборке софта компилятор lcc ошибочно
  распознавался как clang-совместимый. Начиная с lcc-1.26.07 поддержка указанных
  макросов удалена (приведена в соответствие с эквиалентной версией gcc)

* Следующие опции объявлены устаревшими и будут удалены в следующей версии компилятора
  (в скобках указаны опции, на которые их следует заменить):

  * ``-fcontrol-spec`` (``-fno-semi-spec-ld``)
  * ``-fno-control-spec`` (``-fno-spec-ld``)
  * ``-fno-control-spec-globals`` (``-fsemi-spec-ld-glob``)
  * ``-fno-control-spec-stack`` (``-fsemi-spec-ld-stack``)
  * ``-fno-control-spec-greg`` (``-fsemi-spec-ld-greg``)
  * ``-fno-ld-spec`` (``-fno-semi-spec-ld -fno-spec-ld``)
  * ``-fno-fp-spec`` (``-fno-spec-fp``)
  * ``-fdisable-spec-ctp`` (``-fno-spec-ctp``)
  * ``-fomp-for-procs=<proc_list>``
  * ``-fno-ipo-region``
  * ``-fipo-min-region-size=<n>``
  * ``-fipo-max-region-size=<n>``
  * ``-Wpointer-qual`` (``-Wdiscarded-qualifiers``)
  * ``-Wpointer-to-pointer-cast`` (``-Wincompatible-pointer-types``)
  * ``-Wunused-variable-all`` (``-Wunused-variable``)

* Следующие устаревшие опции более не поддерживаются:

  * ``-ffast-adfp``
  * ``-fipa3``
  * ``-fswp-cache-opt=<n>``
  * ``-fgsh``
  * ``-fgsh-pull-bound=<f>``
  * ``-fsgsh-renaming``
  * ``-fsgsh-no-reg-pressure``
  * ``-fswitch-process-ticks=<n>``
  * ``-fcorrect-prefetchL1-sched``
  * ``-fclone-by-profile``
  * ``-fipo-invup``
  * ``-fforce-loop2scalar``
  * ``-fsparc-softpipe-old``
  * ``-mkernel-profile``
  * ``-mcpu=<cpu>`` для архитектуры Эльбрус

* Изменена опция ``-fkernel`` для архитектуры Эльбрус:

  * Вместо полного запрета полуспекулятивных чтений из памяти введён частичный запрет:
    ``-fno-semi-spec-ld -fsemi-spec-ld-glob -fsemi-spec-ld-stack -fsemi-spec-ld-greg``
  * Убрано отключение механизма аппаратной подкачки массивов,
    т.е. опция ``-fno-loop-apb`` более не входит в состав ``-fkernel``
  * Убрано отключение анализа указателей на основе типов,
    т.е. опция ``-fno-strict-aliasing`` более не входит в состав ``-fkernel``

* Исправлена ошибка при разборе опции -fno-strict-aliasing, которая потенциально может привести
  к ошибке исполнения, если речь идёт о формально некорректной программе, нарушающей strict aliasing rules.
  Подробнее см. в статье :doc:`incompat_126_no_strict_aliasing`

* Следующие атрибуты объявлены устаревшими и будут удалены в следующей версии компилятора
  (в скобках указаны атрибуты, на которые их следует заменить):

  * ``__attribute__((no_associative_math))`` [ ``__attribute__((optimize("-fno-associative-math")))`` ]
  * ``__attribute__((no_fp_spec))`` [ ``__attribute__((optimize("-fno-spec-fp")))`` ]

* Устаревшая встроенная функция ``__builtin_expect_prob`` более не поддерживается. Вместо

  .. code-block:: c

    __builtin_expect_prob (expr, probability)

  следует использовать

  .. code-block:: c

    __builtin_expect_with_probability (expr, 1, probability)


Общие улучшения
---------------

* Переход на совместимость с gcc-9.3.0. В lcc-1.25 была совместимость с gcc-7.3.0

* Переход на edg-6.2. В lcc-1.25 использовался edg-5.1

* Добавлена поддержка C18

* В режиме языка C изменился стандарт по умолчанию. По умолчанию используется режим ``-std=gnu18``. В lcc-1.25 по умолчанию использовался режим ``-std=gnu11``

* Поддержана цветовая подсветка сообщений

* Для E2K добавлена экспериментальная поддержка режима ``-mdmodel=huge`` (работа с глобальными переменными размером 4 гигабайта и более)

.. Пока не сделано
.. * Добавлена поддержка стандарта OpenMP 4.0.
..   В lcc-1.25 была поддержка OpenMP версии 3.1

* Добавлена поддержка ``__attribute__((optimize))`` для ограниченного набора опций:

  * ``-O0``, ``-O1``, ``-O2``, ``-O3``, ``-O4``, ``-Og``, ``-Ominimal``, ``-Osize``, ``-Ofast``
  * ``-faligned``, ``-fno-aligned``
  * ``-fassociative-math``, ``-fno-associative-math``
  * ``-fcx-limited-range``, ``-fno-cx-limited-range``
  * ``-fext-strict-aliasing``, ``-fno-ext-strict-aliasing``
  * ``-ffast`` (без ``-fstdlib``)
  * ``-ffast-math``
  * ``-ffinite-math-only``, ``-fno-finite-math-only``
  * ``-fforce-inline``
  * ``-finline-to-small-functions``
  * ``-floop-apb-conditional-loads``, ``-fno-loop-apb-conditional-loads``
  * ``-fmalloc-opt``, ``-fno-malloc-opt``
  * ``-fmath-errno``, ``-fno-math-errno``
  * ``-fprefetch``, ``-fno-prefetch``
  * ``-frestrict-all``
  * ``-frestrict-params``
  * ``-frounding-math``, ``-fno-rounding-math``
  * ``-fsignaling-nans``, ``-fno-signaling-nans``
  * ``-fspec-fp``, ``-fno-spec-fp``
  * ``-fstrict-aliasing``, ``-fno-strict-aliasing``
  * ``-ftree-vectorize``, ``-fno-tree-vectorize`` (в виде игнорирования)
  * ``-funsafe-math-optimizations``, ``-fno-unsafe-math-optimizations``
  

* Добавлена поддержка прагм:

  * ``#pragma spmv`` - подсказка компилятору, что следующий за директивой цикл реализует
    умножение разреженных матриц. Это позволяет лучше настроить оптимизации для таких циклов.

  * ``#pragma no_comb_oper`` - запрещает комбинирование пар арифметических операций в
    двухэтажные операции в ближайшем после объявления директивы цикле

  * ``#pragma GCC optimize`` - настройка опций оптимизаций для выборочного набора функций

* Добавлена поддержка ``__builtin_assume_aligned`` - позволяет указать выравнивание указателя
  и избавить компилятор от необходимости строить динамические проверки выравнивания указателей
  при автоматической векторизации.

* Добавлена поддержка режима ``-fforbid-fp``, в котором запрещено использование вещественных операций.
  В случае обнаружения таких операций в исходной программе компилятор выдаёт ошибку.
  Используется для сборки ядра linux.

* Переработаны опции, управляющие спекулятивным режимом исполнения.
  Добавлены следующие опции:

  * ``-fsemi-spec-ld`` (``-fno-semi-spec-ld``) -
    разрешить (запретить) снимать предикат с операций чтения из памяти и
    ставить их в полуспекулятивный режим исполнения

  * ``-fsemi-spec-ld-glob`` (``-fno-semi-spec-ld-glob``) -
    разрешить (запретить) снимать предикат с операций чтения глобальных
    переменных и ставить их в полуспекулятивный режим исполнения

  * ``-fsemi-spec-ld-stack`` (``-fno-semi-spec-ld-stack``) -
    разрешить (запретить) снимать предикат с операций чтения переменных в
    стеке и ставить их в полуспекулятивный режим исполнения

  * ``-fsemi-spec-ld-greg`` (``-fno-semi-spec-ld-greg``) -
    разрешить (запретить) снимать предикат с операций чтения по указателям
    из глобальных регистров и ставить их в полуспекулятивный режим исполнения

  * ``-fsemi-spec-lintel`` (``-fno-semi-spec-lintel``) -
    ограничить снятие предиката и постановку чтений и записей в
    полуспекулятивный режим для сборки двоичного транслятора

  * ``-fspec-ld`` (``-fno-spec-ld``) -
    разрешить (запретить) снимать предикат с операций чтения из памяти и
    ставить их в спекулятивный режим исполнения с созданием компенсирующего кода

  * ``-fspec-fp`` (``-fno-spec-fp``) -
    разрешить (запретить) снимать предикат с вещественных операций и
    ставить их в спекулятивный режим исполнения

  * ``-fspec-ctp`` (``-fno-spec-ctp``) -
    разрешить (запретить) выносить из-под условия и исполнять спекулятивно
    операции подготовки перехода

* Доработана выдача предупреждений об инициализированных, но неиспользуемых
  переменных (опция ``-Wunused-but-set-variable``).
  Теперь компилятор выдаёт больше предупреждений, они стали более точными.

* Доработана выдача отчёта о применении оптимизаций (опция ``-fopt-report[=N]``).
  Теперь при слиянии циклов в отчёте печатается список привязок к исходнику,
  а также корректно объединяются признаки применения оптимизаций к исходным циклам.
  
* Доработка OpenMP:

  * Добавлена поддержка массивов в clause ``reduction``
  * Добавлена поддержка clause ``default(none)``
  * Добавлена поддержка переменной окружения ``GOMP_CPU_AFFINITY``
  * Добавлена поддержка выражений в clause'ах ``if`` и ``num_threads`` для C/C++ (начиная с lcc-1.26.14)

* В защищённом режиме сняты все ограничения по поддержке builtin'ов (встроенных функций ``__atomic_*``
  и ``__sync_*``), работающих над дескриптором (указателем). За исключением тех атомарных арифметических
  операций, которые в защищённом режиме недопустимы


Доработки оптимизаций
---------------------

* Доработан планировщик кода:

  * Доработана и включена по умолчанию технология эффективной накрутки
    циклов умножения разреженных матриц
  * Реализовано более компактное планирование операций spill,fill
  * Добавлен учёт особенностей планирования вещественных инструкций в 5 канале (Elbrus V5)
  * Добавлен учёт отмены байпаса LD-ST (Elbrus V6)
  * Скорректированы длительности инструкций Sparc R2000+
  * Скорректированы эвристики планировщика накрученных циклов
  * Доработан учёт межузловых задержек
  * Ускорение фазы

* Реализована оптимизация Structure Splitting - разрезание динамического массива структур
  на два массива: для холодных и горячих полей структуры.
  Оптимизация включается в режиме ``-fstruct-reorg -fwhole``.
  Для оптимальной работы желательно использовать профильную информацию (опция ``-fprofile-use``).

* Доработан расширенный анализ указателей на основе типов (опция ``-fext-strict-aliasing``)

* Доработана оптимизация rsepredct: реализована склейка чтений под антипредикатами.

* Доработано удаление избыточных объектов: ускорение фазы,
  расширение области применимости.

* Доработана оптимизация gsr: теперь применяется в функциях, содержащих вызовы
  (ранее работала только в листовых функциях)

