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