コンパイラでのレジスタ割り当てに関するトピックを調べています。レジスタ割り当てに広く使用されているアルゴリズムは、単純化による反復グラフ彩色です。AndrewW.Appelによる著書「 ModernCompilerImplementationin Java」の第11章では、レジスタ割り当ての状態について次のように述べています。
干渉グラフの各ノードは一時的な値を表します。
[...]
一部の一時的なものは事前に色付けされています-それらはマシンレジスタを表します。フロントエンドは、たとえば、モジュールの境界を越えて標準の呼び出し規約に接続するときにこれらを生成します。フレームポインタ、standard-argument-1-register、standard-argument-2-registerなど、特定の目的に使用される実際のレジスタごとに、
Codegen
orFrame
モジュールは永続的にバインドされている特定の一時レジスタを使用する必要がありますそのレジスタに。任意の色(つまり、任意のマシンレジスタ)に対して、その色の事前に色付けされたノードは1つだけである必要があります。
上記の引用で示された行を完全には理解していません。同じレジスターでプレカラーされる複数の一時的なものがある状況を想像することができます。たとえば、x86mul
命令は結果をEDX:EAX
レジスタペアに格納しますが、関数はレジスタに値も返しますEAX
。だから私は同じ色の異なる一時的なものを持っています。それらの異なる使用法はEAX
異なるノードでなければならないと思いますか、それとも私は間違っていますか?
誰かが強調表示された文を説明できますか、おそらくいくつかの例を提示できますか?