Проект pli-llvm, компилятор языка PL/I с бэкендом LLVM, достиг производительности на уровне C. Среднее отношение времени выполнения кода на PL/I к C составило 1,0 на 21 бенчмарке при сравнении с clang -O2. Разработчики использовали семантику языка, включая непересекающиеся локальные переменные и фиксированные диапазоны типов, для генерации более эффективного машинного кода.
Оптимизация арифметики позволила заменить вызовы runtime-функций на LLVM-интринсики и отказаться от операций с плавающей точкой в пользу целочисленных вычислений. Исправление выбора типов для операций с десятичными числами изменило отношение времени выполнения в горячих циклах с 2,3 до 0,9 на уровне -O3. Также была внедрена передача скалярных параметров по значению вместо ссылок.
Изменение способа передачи параметров во внутренних процедурах снизило отношение времени выполнения вызовов с 2,9 до 1,0. Оптимизация конкатенации строк позволила избежать лишних выделений памяти, что сократило потребление оперативной памяти (RSS) с 109 МБ до 1 МБ на уровне -O0. Для операций со строками в ряде тестов удалось добиться ускорения в 3–14 раз по сравнению с C.
Функция поиска подстроки index была ускорена в 14 раз за счет использования memchr, memcmp и инструкций NEON на архитектуре ARM64. Авторы отмечают, что анализ LLVM IR помогает выявлять избыточные преобразования типов и лишние вызовы функций. Методика измерений включала расширение циклов с 5 000 до 200 000 итераций для исключения влияния шума на результаты тестирования.




