TPDE-LLVM: новий швидкий бекенд компілятора LLVM

Дослідники з Мюнхенського технічного університету розробили інструментарій TPDE та заснований на ньому бекенд компілятора для LLVM – TPDE-LLVM, який забезпечує генерацію машинного коду для архітектур x86-64 і AArch64 на основі проміжного представлення коду LLVM-IR. Тести показали, що TPDE-LLVM працює в 10-20 разів швидше бекенду LLVM -O0 (генератор коду без оптимізацій), зберігаючи той самий рівень продуктивності результуючого машинного коду при збільшенні розміру лише на 10-30%.

Особливості TPDE-LLVM

TPDE-LLVM спрямований на забезпечення компіляції з мінімальними затримками та рівнем якості, що відповідає режиму збірки без оптимізацій (“-O0”). Проєкт надає утиліту для окремого запуску tpde-llc, бібліотеку для інтеграції в застосунки (наприклад, для реалізації функціональності JIT-компілятора) та патчі для інтеграції з Clang і Flang.

Застосування

Проєкт може використовуватися як базовий компонент для JIT-компіляції або для створення неоптимізованих збірок. TPDE-LLVM зосереджений виключно на швидкості компіляції і не намагається конкурувати з оптимізуючими бекендами LLVM, які працюють повільніше, але дозволяють генерувати більш швидкий і компактний машинний код (приблизно в 2 рази швидше і в 2 рази менше за розміром).

Технологія генерації коду в TPDE-LLVM

TPDE-LLVM використовує для генерації коду три стадії:
– Очищення та підготовка проміжного представлення LLVM
– Аналіз інформації про цикли та використання змінних
– Формування машинного коду

Внесок у розвиток LLVM

За участю авторів TPDE до гілок LLVM 19 і 20 вже додані оптимізації, які дозволили прискорити роботу штатного бекенду LLVM на 18% на платформі x86-64 і на 13% на платформі ARM64. В майбутньому можна буде ще прискорити бекенд LLVM на 10-20% без значних змін, однак подальше підвищення продуктивності вимагатиме суттєвих архітектурних змін. При цьому, навіть при значній переробці, малоймовірно, що існуючий бекенд LLVM вдасться прискорити в 10 разів.

Поточний стан та цілі

На поточному етапі розвитку серед цілей проєкту TPDE заявлено забезпечення підтримки проміжного представлення коду LLVM, отриманого фронтендом Clang у режимах оптимізації “-O0” і “-O1”. Обробка проміжного представлення, створеного в режимі “-O2”, поки не гарантується через відсутність підтримки в TPDE векторних операцій. Частково підтримується проміжний код від Flang і компілятора Rust.

Наробки проєкту опубліковані під ліцензією Apache 2.0 і доступні на GitHub. Детальна інформація про інструментарій представлена на офіційному сайті TPDE.