Предварительно окрашенные узлы в распределении регистров - максимум по одному каждого цвета?

Я изучаю тему о размещении регистров в компиляторах. Широко используемый алгоритм распределения регистров - это итеративная раскраска графа путем упрощения. В книге Современная реализация компилятора на Java Эндрю В. Аппель, глава 11 о распределении регистров гласит:

Каждый узел в графе интерференции представляет временное значение.

[...]

Некоторые временные файлы предварительно окрашены - они представляют собой машинные регистры. Внешний интерфейс генерирует их, например, при взаимодействии со стандартными соглашениями о вызовах через границы модуля. Для каждого фактического регистра, который используется для определенной цели, например указателя кадра, регистра стандартного аргумента 1, регистра стандартного аргумента 2 и т. Д., Модуль Codegen или Frame должен использовать конкретный временный постоянно привязан к этому регистру. Для любого заданного цвета (то есть для любого заданного машинного регистра) должен быть только один предварительно окрашенный узел этого цвета.

Я не совсем понимаю указанную строку в приведенной выше цитате. Я могу представить себе ситуации, когда есть несколько временных конструкций, которые будут предварительно окрашены одним и тем же регистром. Например, инструкция x86 mul сохраняет результат в регистровой паре EDX:EAX, но функции также возвращают значения в регистре EAX. Итак, у меня есть разные временные конструкции одного цвета. Я бы подумал, что эти разные варианты использования EAX должны быть разными узлами, или я ошибаюсь?

Может ли кто-нибудь объяснить выделенное предложение, может, привести несколько примеров?


person Daniel A.A. Pelsmaeker    schedule 20.11.2012    source источник


Ответы (1)


В книге идея состоит в том, что у вас будет один временный EAX, который вы будете использовать как с mul, так и для возвращаемого значения. Когда какое-то значение должно быть в данном регистре, вы генерируете переход от временного, содержащего это значение, к временному, представляющему этот регистр; аналогично, как только значение поступило в конкретный регистр (например, функция вернулась), вы генерируете переход от временного регистра к временному, который будет удерживать это значение с тех пор. См. Рисунок 11.7 в книге.

person ibid    schedule 29.11.2012
comment
Итак, чтобы обобщить: одна и та же переменная (виртуальный временный регистр или машинный регистр), используемая для нескольких различных целей в методе, будет когда-либо представлена ​​только одним единственным узлом в графе интерференции? - person Daniel A.A. Pelsmaeker; 29.11.2012
comment
Я не думаю, что ваше обобщение справедливо. Это справедливо для временных файлов, представляющих определенные регистры для целей предварительной раскраски. - person ibid; 04.12.2012