Группа исследователей из университета Юты (США) предложила оптимизатор Minotaur для набора компиляторов LLVM, использующий метод на основе решения задач выполнимости формул (SMT Solver) для выявления недостающих оптимизаций в промежуточном представлении кода (LLVM IR), генерируемом оптимизатором LLVM. Minotaur главным образом нацелен на оптимизацию целочисленных векторных инструкций (SIMD), как переносимых, так и специфичных для систем x86_64 (SSE, AVX, AVX2 и AVX-512).
В качестве векторизатора задействована библиотека Alive2, модифицированная для синтеза и поддержки векторных инструкций, используемых на системах x86_64. Разработка продолжает развитие проекта Souper, разрабатывавшегося теми же авторами. Minotaur может находить различные оптимизации применения векторных инструкций, пропущенные штатным оптимизатором LLVM. При тестировании дополнительно оптимизированного кода на системе с CPU Intel Cascade Lake зафиксировано максимальное повышение производительности в 1.64 раза, но в тестовых наборах SPEC CPU2017 и libYUV ускорение составило лишь 1.3% и 2.2%.
Пример оптимизации для Си-кода:
do { if (*–p == ‘.’) *p = ‘_’; } while (p != name);
Штатный оптимизатор LLVM сгенерирует для него биткод для использования инструкций AVX-2:
%1 = shufflevector %0, %2 = icmp eq %1, %3 = shufflevector %2,
Minotaur исключит лишние операции shufflevector и сведёт код к одному вызову операции icmp, которая также выполняет сравнение регистра с символом “.” (ASCII-код 46), но без лишней реверсии вектора: