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