Наиболее важные изменения при переходе от 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 - отключено заведение в кеш L2
    3 - отключено заведение в кеши 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++