есть те, что по правилу Парето выдают 80% эффекта? Это удаление мёртвого кода, общие выражения, встраивание процедур (inline) и что ещё?
Peephole скорее всего
Loop unrolling, loop-invariant code motion, ещё всякое. Там возле Ruby JIT (MIR?) этот вопрос обсуждался.
я бы ещё добавил constant propagation и его усовершенствованные варианты
Ну loop unroll я тогда бы дополнил программной конвейеризацией
Проблема телеги в том, что это всё тонет в С++ спаме на 300 реплик.
В смысле векторизацией?
Тогда уж и constant folding
это важно для in-order и vliw, а для OoO толку не много, в 80% скорее всего не попадёт
copy propagation/coalescing, обычно это часть регаллокатора, планировщик
Нет, именно конвейеризацией, очень мощная штука для заполнения всех исполнительных устройств и маскировки пауз между операциями итерации за счёт выполнения операций с других итераций
Let me Google that for you: https://developers.redhat.com/blog/2020/01/20/mir-a-lightweight-jit-compiler-project 😊
Мб, но к unroll оно прямо-таки просится. Помнится, полезность конвейеризации в драгонбуке рассказывали именно через unroll:)
Аааа!!! Я не понял - думал, что обсуждалось тут, в репликах рядом с обсуждением Ruby.
Хотя вообще не уверен, что прямо так выделяется что-то в 80%, оно все по чуть-чуть и работает вместе, потому что оптимизации друг друга усиливают
Тут это тоже обсуждалось, да. 😊
Да, это очень важная оптимизация для спецпроцессоров и ускорителей. И там очень большое поле для исследований.
Самые главные — алгоритмические оптимизации, которые влияют на асимптотическую сложность :) Понимаю, что вопрос не об этом, поэтому предлагаю посмотреть, что реализовано в популярных JIT-компиляторах, в том же MIR.
Обсуждают сегодня