4

私のコンパイラ コースでは、MIPS アーキテクチャのグラフ カラーリングに基づくレジスタ アロケータを構築しています。私は私の実装のために同じことについてMuchnickの扱いに従っています。

Muchnick は、これらのアロケータで関数の引数をどのように扱うかについて、少しあいまいでした。

私はいくつかの仮定を立て、同じことを明確にしたいと考えました。

  1. 中間レベルの IR から低レベルの IR に変換するこのステップがあります。ネストされた関数呼び出しは処理されていません。私の考えは、関数呼び出しを右から左にスキャンし、最も内側の呼び出しの IR を外側に配置することです。このようにして、最初のいくつかの引数を引数レジスタに割り当て、残りを最小量のスピル (ちょうど 1) でスタックするという MIPS 呼び出し規則を使用できます。
  2. 本書のレジスタ合体処理は、関数の引数を固定引数レジスタに移動する LIR コードがどのように処理されるかを扱っていないため、私には直感的ではありません。多くの審議の後、私は、引数の受け渡しの動きに対してレジスタ合体を行うべきではないという結論に達しました。

これらの仮定に関するフィードバック/考えは非常に高く評価されています。

4

1 に答える 1

2

レジスタ割り当ての前に、関数呼び出しの実際の引数(または関数エントリでコピーされた関数呼び出しの正式な引数)に関して、仮想レジスタから引数レジスタへの引数の受け渡しの移動のためにレジスタ合体を実行したくないと思います。

ただし、そのような移動を確認した場合は、その移動ターゲット引数レジスタが推奨される選択であるというヒントをアロケータにタグ付けできます。優先選択が適切に干渉しない場合*、それを割り当てに使用できます。その結果、割り当て後に、が得られ、move rx,rx後で簡単に削除できます。

(もちろん、そのようなヒントが複数見つかる場合があるので、最も適切なヒントを選択すると、それらのほとんど(および多くの場合すべて)が他の干渉から除外されます:同じレジスタが複数の呼び出しに渡されます;ループで呼び出します、等..)

(*適切には、引数(実)レジスタが仮想レジスタの存続期間中、たとえばネストされた関数呼び出しなどによって使用または破棄されないことを意味します。(これを特定することは、仮想の干渉を検査するのと同じくらい簡単です。登録。))

于 2013-01-15T04:23:04.147 に答える