Наиболее важные изменения при переходе от lcc-1.30 к lcc-1.31 (changelog)¶
Изменения, затрагивающие совместимость¶
Следующие экспериментальные builtin’ы более не поддерживаются:
__builtin_read_barrier__builtin_write_barrier__builtin_mem_barrier__builtin_barrier
На замену им введены новые builtin’ы, которые поддерживаются только для архитектуры Elbrus:
__builtin_e2k_read_barrier__builtin_e2k_write_barrier__builtin_e2k_mem_barrier__builtin_e2k_barrier.
Отличие новых builtin’ов в том, что они помимо программного барьера в данной точке программы для указанного в названии builtin’а типа операций также устанавливают аппаратный барьер в виде операции
wait, маска которой задаётся аргументом builtin’аИзменилась реакция компилятора на ситуацию, когда оптимизации inline не удалось подставить вызов функции с атрибутом
always_inline. Раньше в этом случае компилятор выдавал ошибку, которую можно было отключить опцией-fno-error-always-inline:lcc: "file.c", line 123: error: failed to inline foo into bar: recursion (use -fno-error-always-inline option to ignore this error)
Теперь же компилятор выдаёт предупреждение по опции
-Wattributes, аналогично тому, как это делает gcc:lcc: "file.c", line 123: warning: failed to inline 'always_inline' function 'foo' into 'bar': recursion [-Wattributes]
Это предупреждение можно отключить опцией
-Wno-attributesили наоборот повысить до ошибки с помощью опции-Werror=attributesили-WerrorНачиная с версии lcc-1.31.05 по опции
-Osizeвзводится макрос__OPTIMIZE_SIZE__Следующие устаревшие опции были удалены:
-fno-tail-calls(используйте-fno-optimize-sibling-calls)-fno-loop-unswitching(используйте-fno-unswitch-loops)-finit-locals-zero(используйте-ftrivial-auto-var-init=zero)-fprofile-strict-names(вместо неё используется опция-Wmissing-profile, включённая по умолчанию)-fno-gcp(используйте-fno-gcse)-fno-loop-unroll-jam(используйте-fno-loop-unroll-and-jam)-fno-dam4swp(используйте-fno-swp-dam)-fdam-no-rbranch(используйте-fdam-no-short-cc)--dwarf2-64bit(используйте-gdwarf64)--no-dwarf2-64bit(используйте-gdwarf32)-fext-strict-aliasing(используйте-fstrict-aliasing)-fautopar(функциональность более не поддерживается)-fthreads=(функциональность более не поддерживается)-fpar-numa=(функциональность более не поддерживается)-fpar-distr-mem=(функциональность более не поддерживается)
Общие улучшения¶
Добавлена поддержка прагмы
apb_cache. Прагмаapb_cacheработает для ближайшего к объявлению цикла. Если в этом цикле задействован механизм программно-аппаратной подкачки данных Array Prefetch Buffer, то для всех чтений будет задан уровень заведения в кеш-память, указанный в параметре прагмы. Возможные значения:0 - включено заведение во все уровни кеш-памяти2 - отключено заведение в кеш L23 - отключено заведение в кеши L2, L3Введены новые опции включения (
-floop-full-peeling) и выключения (-fno-loop-full-peeling) оптимизации full peeling - преобразование цикла с известным числом итераций в скалярный код. По умолчанию оптимизация включена.Оптимизация full peeling отключается, если значение прагмы
unrollне совпадает с количеством итераций циклаВ режиме сборки ядра
-fkernelвключена оптимизация преобразования цикла с известным числом итераций в скалярный код. Оптимизацию можно отключить по опции-fno-loop-full-peelingРеализованы опции
-fstack-protector-*Реализована опция
-mfixed-gregs-base, разрешающая преобразования, предполагающие отсутствие изменения базы вращения глобальных числовых регистров%g24-%g31. По сути, опция включает потоковые оптимизации для инструкций, использующих указанные регистры. Режим по умолчанию-mno-fixed-gregs-base.Предупреждение
-Wreturn-typeвключено на уровне-O1, раньше включалось на уровне-O2
Доработки оптимизаций¶
Доработана оптимизация Array Prefetch Buffer:
Добавлена возможность объединения чтений разных форматов из одного массива в одну область подкачки для сокращения количества инструкций подкачки. Например, в случае чтения из массива структур теперь компилятор может объединять смежные чтения полей структуры разных форматов. Доступно для целевых архитектур, начиная с Elbrus V5.
Добавлена возможность применения оптимизации к чтениям из массива, у которых шаг адреса не является кратным формату этого чтения. Доступно для целевых архитектур, начиная с Elbrus V6.
Добавлена возможность многократного продвижения “головы” области буфера аппаратной подкачки массивов за одну итерацию цикла. Доступно для целевых архитектур, начиная с Elbrus V6. Добавлена соответствующая опция
-fno-loop-apb-packetsдля запрета многократного продвижения. Режим по умолчанию:-floop-apb-packets.
Добавлена оптимизация cddce, которая ставит под условие вызовы стандартных математических функций, не имеющих использований
Добавлена оптимизация apcse, реализующая специфичный сбор общих подвыражений (SCE) для адресных инструкций защищённого режима (опция
-m128)Доработана оптимизация u2s, канонизирующая индуктивную переменную цикла, что позволяет чаще применять другие цикловые оптимизации. Добавлена опция
-fstrict-lc-overflow, с помощью которой программист может сообщить компилятору факт отсутствия переполнения в операциях инкремента индуктивных переменных циклов; опция помогает увеличить количество применений u2s и других цикловых оптимизаций.Доработано инструментирование кода в режиме
-fprofile-generate, уменьшено потребление памяти инструментированных программ на языке C++
