Я изучаю тему о размещении регистров в компиляторах. Широко используемый алгоритм распределения регистров - это итеративная раскраска графа путем упрощения. В книге Современная реализация компилятора на Java Эндрю В. Аппель, глава 11 о распределении регистров гласит:
Каждый узел в графе интерференции представляет временное значение.
[...]
Некоторые временные файлы предварительно окрашены - они представляют собой машинные регистры. Внешний интерфейс генерирует их, например, при взаимодействии со стандартными соглашениями о вызовах через границы модуля. Для каждого фактического регистра, который используется для определенной цели, например указателя кадра, регистра стандартного аргумента 1, регистра стандартного аргумента 2 и т. Д., Модуль
Codegen
илиFrame
должен использовать конкретный временный постоянно привязан к этому регистру. Для любого заданного цвета (то есть для любого заданного машинного регистра) должен быть только один предварительно окрашенный узел этого цвета.
Я не совсем понимаю указанную строку в приведенной выше цитате. Я могу представить себе ситуации, когда есть несколько временных конструкций, которые будут предварительно окрашены одним и тем же регистром. Например, инструкция x86 mul
сохраняет результат в регистровой паре EDX:EAX
, но функции также возвращают значения в регистре EAX
. Итак, у меня есть разные временные конструкции одного цвета. Я бы подумал, что эти разные варианты использования EAX
должны быть разными узлами, или я ошибаюсь?
Может ли кто-нибудь объяснить выделенное предложение, может, привести несколько примеров?