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