2016-10-04 10 views
1

https://idea.popcount.org/2013-07-24-ir-is-better-than-assembly/ИК LLVM форма против сборки

Привет,

Я ухватить идею IR, но один вопрос не является чистым.

Почему IR лучше, чем сборка? Я читал, что автор сказал об этом, и я вижу, что в целом он выше в смысле абстракции. Он позволяет управлять типом. Но я бы хотел спросить о чем-то другом:

В частности, LLVM IR является своего рода промежуточной формой. Но почему оптимизация проводится по этой форме? Невозможно ли оптимизировать сборку? Действительно, это возможно? Итак, почему LLVM IR настолько хорош, чтобы использовать его в этом контексте? Я полагаю, что анализ формы IR просто проще и «более возможен».

+2

Конечно, вы можете оптимизировать сборку (компиляторы делать). LLVM спрашивает, зачем писать оптимизаторы для всех платформ, когда вы можете написать один оптимизатор для промежуточного представления, а затем перевести на свою платформу (инструкции по сборке?) – Chris

+1

@ChrisStathis: большинство компиляторов * не * оптимизировать сборку, они оптимизируют собственное внутреннее представление, как правило, представление SSA о поведении источника. Взятие asm в качестве входных данных представляет собой сложную задачу выяснить, какие значения, оставшиеся в регистрах или памяти, являются входами для отдаленных частей программы и которые являются только мертвыми временными. Оптимизатор asm не может предположить, что каждая функция ограничивается только стандартным соглашением ABI/вызова для передачи данных между блоками кода. –

ответ

2

Вот как я прочитал ваш вопрос: почему компиляторы не делают быстрый перевод на не оптимизированную сборку, а затем оптимизируют это.

Оптимизация сборки создает серьезные ограничения. Как отметил Крис Статис, оптимизатор сборки будет ограничен одной платформой. ИК-оптимизатор не зависит от платформы.

Также имеется слишком много деталей, специфичных для аппаратного обеспечения, закодированных в сборке. Оптимизация компилятора уже сложна, поэтому нет причин затруднять эту проблему, добавляя к ним ненужные детали оборудования. Например, в коде сборки у вас ограниченное количество регистров определенного размера. В IR вы можете использовать столько регистров, сколько хотите. Нет причин, чтобы сделать ваш алгоритм оптимизации более сложным, заставляя его отслеживать аппаратные регистры.

LLVM IR имеет некоторые преимущества для других IR-компиляторов, о которых я знаю. Одним из важных преимуществ является то, что LLVM IR находится в форме SSA. Это означает, что переменная может быть определена только один раз, и ее значение никогда не может измениться. Это значительно упрощает оптимизацию компилятора.

При взгляде на руководство LLVM IR может быть не очевидно, что он находится в форме SSA. Но как только вы посмотрите на структуры данных, используемые для представления IR в библиотеке LLVM, вы увидите, что вы не можете писать код, отличный от SSA, в LLVM IR.