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

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

  • Добавлена поддержка C11 _Atomic
  • Добавлена экспериментальная поддержка C++20
  • Доведение режима -mptr128 до промышленного уровня
  • Добавлена поддержка процессора r2000+
  • Улучшена поддержка OpenMP:
    • Добавлена поддержка всех видов массивов языка Fortran
    • Добавлена поддержка C++ exceptions. За счёт этого стало возможным распараллеливать циклы, содержащие вызовы функций, которые потенциально могут бросать исключения (раньше в этом случае компилятор выдавал ошибку).
  • Добавлена поддержка прагм:
    • #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.