Инженер компании Intel внес в компилятор GCC небольшое, но значимое изменение: всего одна строка кода увеличила вес штрафа за неверное предсказание ветвлений для архитектуры x86. Это обновление позволило существенно повысить скорость выполнения определенных задач: так, в тесте 544.nab_r производительность выросла на 12,7% при использовании оптимизации «-O2 -mtune=graniterapids» для процессоров Intel Granite Rapids (Xeon 6) и на 12,1% для чипов AMD Zen 5 с флагом «-mtune=znver5».
Суть изменений заключается в корректировке веса с «COSTS_N_INSNS (2)» до «COSTS_N_INSNS (2) + 3». Тем самым значимость ошибки предсказания ветвления была поднята с 2 до 5 условных инструкций. Это значение точнее соответствует архитектуре конвейеров современных процессоров, где сброс состояния конвейера из-за неверного прогноза обходится системе гораздо дороже, чем раньше. Подобная настройка вынуждает компилятор чаще преобразовывать конструкции «if» в условные инструкции (например, CMOV) без переходов, что позволяет избежать дорогостоящих простоев.
Ранее такой подход применялся в GCC лишь точечно, для архитектур Intel Ice Lake и Alder Lake, однако теперь он стал частью «generic»-профиля для всей платформы x86.
Побочные эффекты и регрессия
Несмотря на успех в ряде тестов, внедрение патча выявило и негативные стороны. Разработчики обнаружили регрессию: при определенных условиях скорость выполнения теста «Hint» падала до 30%. Автор изменений подтвердил наличие проблемы, уточнив, что при сборке с параметрами «-O2 -mtune=generic -march=x86–64-v3» замедление составляет около 14%.
Анализ показал, что в коде теста Hint присутствует единственная условная конструкция, оптимизированная через CMOV. Она срабатывает крайне редко (в 3% случаев) и сама по себе не должна влиять на общую картину, однако изменение логики генерации кода привело к неожиданным побочным эффектам, снизившим быстродействие более нагруженных частей программы. При этом результаты в стандартных наборах SPEC2017 и SPEC2026 после обновления остались в пределах нормы.






