Проекты:

  1. Оптимизация кодогенерации для платформы ARM.
  2. Разработка инструментов для анализа производительности, эффективности использования памяти и кэша (для платформы ARM).
  3. Автоматическая настройка компиляторных оптимизаций для улучшения производительности и размера кода.
  4. Оптимизации в JIT-компиляторах, виртуальных машинах.
  5. Разработка динамического компилятора для языков высокого уровня на основе LLVM JIT.
  6. Использование информации о трассах выполнения для уточнения оптимизаций, основанных на профиле (PGO) в LLVM.

В ходе работы над проектами студенты приобретают следующие знания и навыки:

  • Внутреннее устройство компилятора.
  • Написание оптимизационного прохода в одном из компиляторов LLVM, GCC или оптимизации для виртуальной машины среды выполнения языка Java/JavaScript.
  • Анализ сгенерированного компилятором кода, сопоставление с промежуточным кодом, и улучшение оптимизаций/кодогенерации в компиляторе на основе анализа.
  • Углубленные знания о процессорных архитектурах, языке ассемблера, соглашениях о вызовах.

Темы исследовательских работ студентов в 2022-2023 уч. г.:

  • Переупорядочивание функций в больших приложениях для улучшения локальности кода. Эта задача включает в себя снятие частичных трасс выполнения через аппаратные счётчики и интерфейс perf на Linux, поиск эвристик для определения порядка функций, который минимизировал бы промахи в кеше инструкций и трансляции страниц (iTLB), и реализацию переупорядочивания функций для стандартного тулчейна (GCC + Binutils).
  • Обнаружение случаев неопределенного поведения в языке Си при использовании функций семейства setjmp. Программы на языке Си могут вызывать необычные функции setjmp и vfork, которые возвращают управление в точку вызова более одного раза (setjmp возвращается второй раз, принимая управление от longjmp, а vfork возвращает управление сначала в дочернем процессе, затем в родительском). Типичной ошибкой при использовании таких функций является использование обычных стековых переменных, которые живы в момент «второго возврата», так как для них не гарантируется сохранение значений. Задача — улучшить качество предупреждений, выдаваемых компилятором GCC на подобные ошибки.

Open source проекты, разработанные группой:

LLV8 — an experimental top-tier compiler for V8 JavaScript Engine — https://github.com/ispras/llv8
Tool for Automatic Compiler Tuning (TACT) — https://github.com/ispras/tact
PostgreSQL with JIT compiler for expressions — https://github.com/ispras/postgres
V8 JavaScript Engine with AOTC — https://github.com/ispras/v8-aotc
Webkit with JavaScriptCore AOTB support — https://github.com/ispras/webkit-aotc
GCC with extended modulo scheduling support — https://github.com/ispras/gcc-sms