# Наиболее важные изменения при переходе от 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. Подробнее см. в статье Потенциально несовместимое изменение при разборе опции -fno-strict-aliasing в lcc-1.26

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

  - `__attribute__((no_associative_math))` [ `__attribute__((optimize("-fno-associative-math")))` ]

  - `__attribute__((no_fp_spec))` [ `__attribute__((optimize("-fno-spec-fp")))` ]

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

      __builtin_expect_prob (expr, probability)

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

      __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 гигабайта и более)

- Добавлена поддержка `__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: теперь применяется в функциях, содержащих вызовы (ранее работала только в листовых функциях)