В настоящее время я работаю через nand2tetris для университетского курса и подумал, что было бы интересно добавить некоторые оптимизации.Для стека vm это в основном включало отображение вершины стека в регистр, отображение слотов стека, которые не используются при обращениях к постоянной памяти, и специализацию инструкций с известными входами, чтобы избежать ненужных манипуляций со стеком.Изначально я добавил одну специализацию слишком поздно, поэтому x = x + 1
в итоге
push 1
push x
add
pop x
store temp
load x
inc
store x
load temp
store temp
inc x
load temp
inc x
понижается до @x; M = M + 1
, что не перезаписывает регистр D, поэтому сохранение / загрузка не нужны.
Время вопроса: Как настоящий компилятор может оптимизировать этот тип ненужного сохранения / загрузки в общих настройках?Моя интуиция говорит что-то вроде:
- анализ на основе потока, чтобы выяснить возможные назначения кучи данных
- анализ псевдонимов, чтобы мы знали, когда аннулировать эти сопоставления
Я нашел много о возможных реализациях для этого анализа, но очень мало о том, как использовать полученные данные.Можно ли проводить такого рода оптимизацию в изолированных проходах или для этого требуется какая-то специализированная гибридная версия нескольких алгоритмов?