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