Объекты на Т регистрах
Предположим, что мы вначале выполняли планирование потока команд, не распределив В/Т регистры. Выполнить это планирование мы можем, следовательно, только в некоторых предположениях, предполагается, например, что все операнды будут находиться на В/Т регистрах или напротив в памяти. В результате может быть получена некоторая последовательность команд. Однако, реальное распределение В/Т регистров может привести, во-первых, к тому, что не все объекты могут быть распределены на В/Т регистры. Отсюда возникают не учтенные задержки, и таким образом, полученная последовательность команд не будет являться, вообще говоря, «лучшей» из возможных, во-вторых, влияние окажут перезагрузки. Иначе говоря, процесс теперь нужно повторить, для того чтобы получить лучший код.
Но то же самое можно сказать и в том случае, когда мы прежде распределяем В/Т регистры, а затем выполняем планирование. В результате планирования могут быть исключены фактические задержки, связанные со считыванием некоторых операндов, которые после распределения регистров остались в памяти, но остались не исключенными задержки, которые можно было бы исключить перераспределив В/Т регистры.
Иначе говоря, выполнить планирование точно мы можем, только моделируя время выполнения команд. Для этого необходимо распределить В/Т регистры. Но в результате планирования может потребоваться их перераспределение.
В этом смысле мы можем сказать, что вообще задачи распределения регистров и планирования предъявляют взаимо исключающие требования.
Мы предполагаем, что генерация идет по правой ветви и что все объекты находятся на Т регистрах, причем свободен всего один Т регистр, тогда получим следующую последовательность команд:
S1 Т.В
S2 Т.С
SI S1*S2 (4)
S2 ТА
SI S2—S1
распределив регистры находим, что только С находится там, но тогда реально команда (3) задержана командой (1), а команда (5) командой (4) и при этом распределении регистров лучшей была бы последовательность команд:
S1 В
S2 А
S3 Т.С (5)
SI S/#S3
SI S2—S1.
Теперь пробуем распределить В/Т регистры до генерации: пусть А получает регистр Т. Мы получим последовательность команд (6), но максимальная задержка будет по команде (2).
Эту задержку, вообще говоря, можно было бы устранить, если отдать регистр под (С).
В данном примере мы могли бы получить выигрыш, если бы пришли к последовательности (5)
S1 В
S2 С
SI S/*S2 (6)
S3 ТА
SI S3—S1.
Заметим, что, говоря о распределении регистров, о переста новке команд, о выигрыше, мы имели ввиду, что применяем их к некоторой последовательности команд, более широкой, чем подвыражение, анализируя ее в целом.
Распределение A/S регистров оказывается также тесно связанным с задачей выбора последовательности команд. Так, на пример, если осуществлять перестановку команд после распределения A/S регистров, то тем самым будет резко сужена область возможного перемещения команд. С другой стороны в перестановке до распределения Л/5 регистров трудно учесть команды их перезагрузки. Таким образом, и в этом случае она может быть несколько неточной.
Хотя мы выделили и сформулировали 3 задачи, мы видим, что, по сути, они являются настолько связанными, что возможно было бы правильнее сказать о том, что это 3 стороны одной общей задачи.
Метки: последовательность команд, регистры, распределение регистров, планирование потока команд, перераспределение регистров