Я думал, что наличие промежуточного представления на неком абстрактном ассемблере абстрактной машины - это крутая возможность запила каких-нибудь низкоуровневых оптимизаций, векторизаций и т.п. один раз в одном модуле, чтобы развивая один оптимизатор мы развивали оптимизацию сразу под все возможные конечные платформы.
А после абстрактной виртуальной машины ведь стоит какая-то реальная, под которую надо генерить код и в которой нет каких-то удобных векторных инстукций или нужной ширины регистров. IR-оптимизатор запилил суперкрутые оптимизации с векторными инструкциями, а потом на бекенде выясняется, что целевой процессор - intel 286.
Т.е. получается, оптимизатор должен учитывать конечную архитектуру. Получается, что у нас много оптимизаторов - под каждую архитектуру свой. Где я гоню?