Вот как я прочитал ваш вопрос: почему компиляторы не делают быстрый перевод на не оптимизированную сборку, а затем оптимизируют это.
Оптимизация сборки создает серьезные ограничения. Как отметил Крис Статис, оптимизатор сборки будет ограничен одной платформой. ИК-оптимизатор не зависит от платформы.
Также имеется слишком много деталей, специфичных для аппаратного обеспечения, закодированных в сборке. Оптимизация компилятора уже сложна, поэтому нет причин затруднять эту проблему, добавляя к ним ненужные детали оборудования. Например, в коде сборки у вас ограниченное количество регистров определенного размера. В IR вы можете использовать столько регистров, сколько хотите. Нет причин, чтобы сделать ваш алгоритм оптимизации более сложным, заставляя его отслеживать аппаратные регистры.
LLVM IR имеет некоторые преимущества для других IR-компиляторов, о которых я знаю. Одним из важных преимуществ является то, что LLVM IR находится в форме SSA. Это означает, что переменная может быть определена только один раз, и ее значение никогда не может измениться. Это значительно упрощает оптимизацию компилятора.
При взгляде на руководство LLVM IR может быть не очевидно, что он находится в форме SSA. Но как только вы посмотрите на структуры данных, используемые для представления IR в библиотеке LLVM, вы увидите, что вы не можете писать код, отличный от SSA, в LLVM IR.
Конечно, вы можете оптимизировать сборку (компиляторы делать). LLVM спрашивает, зачем писать оптимизаторы для всех платформ, когда вы можете написать один оптимизатор для промежуточного представления, а затем перевести на свою платформу (инструкции по сборке?) – Chris
@ChrisStathis: большинство компиляторов * не * оптимизировать сборку, они оптимизируют собственное внутреннее представление, как правило, представление SSA о поведении источника. Взятие asm в качестве входных данных представляет собой сложную задачу выяснить, какие значения, оставшиеся в регистрах или памяти, являются входами для отдаленных частей программы и которые являются только мертвыми временными. Оптимизатор asm не может предположить, что каждая функция ограничивается только стандартным соглашением ABI/вызова для передачи данных между блоками кода. –