2015-05-13 1 views
2

Преобразование абстрактного синтаксического выражения в базовый блок SSA влечет за собой выписывание всех операций в выражении в линейной последовательности, например. x * y + 1 преобразуется в список операций, содержащих * и + в этом порядке.Включая атомные значения в базовые блоки

Можно ли включать в список операций переменные и литеральные выборки? То есть должен ли приведенный выше список длины 2 или 5?

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

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

С третьей стороны, включая атомные значения в линейной последовательности, вы можете отвечать на такие вопросы, как «какие глобальные переменные выполняет эта функция», путем итерации через базовые блоки и операции, а также для повторения аргументов каждой операции ,

Есть ли другие соображения, которые мне не хватает?

Чтобы уточнить: имена локальных переменных обычно исчезают в SSA (им нет необходимости, вы можете просто использовать прямой указатель на операцию, которая сгенерировала значение). Я думаю о вещах, которым по-прежнему нужны имена - константы, имена глобальных переменных, локальные переменные, чей адрес был взят и т. Д.

ответ

2

Это зависит от того, что вы хотите от своего оптимизатора.

Если вы хотите иметь много свободы, планируя выбор операндов (возможно, потому, что они дороги), вы захотите сделать их явными, чтобы вы могли ими манипулировать. (У старых машин Cray были регистры данных и адресов: вы могли загружать регистр адресов и запускать выборку в регистр данных, а затем идти делать что-то еще, наконец, касаясь регистра данных, когда нет других вычислений, которые вы можете запланировать).

Если вам все равно, вы можете смоделировать весь базовый блок как единый узел SSA с большим количеством входов и выходов.

Смежные вопросы