9

私はスタック マシン (具体的にはCIL ) のコンパイラに取り組んでおり、コードを基本ブロックのグラフに解析しました。ここからメソッドにSSAを適用しようとしていますが、なかなかうまくいきません。私の最初の試み (グラフではなくフラットなリストで作業している間) は、コードを反復処理し、SSA ID のスタック (つまり、割り当てターゲット用) を保持し、割り当てを生成するときにそれらをプッシュし、割り当て時にそれらをポップすることでした。それらは使用されています。これは、単一の基本ブロックに対しては問題なく機能しますが、Φ 関数の生成を処理する方法がわかりません。

私が思いついたアイデアは、SSA ID にスタック位置をアタッチし、コード パスが収束したときにまだスタック上にあるものを調べることですが、これは物事を行う正しい方法 (TM) とは思えません。

複数のコード パスにわたるスタック操作を追跡し、それらが収束したときに衝突を判断するための単純なアルゴリズムはありますか?

4

1 に答える 1

9

ノード (基本ブロック) に収束するSSA IDの複数のセットを確認する必要があります。ブロック内のすべての識別子を簡単に使用 (クエリなど) できるように、中間の基本ブロック構造を維持します。

衝突の意味はわかりませんが、次のようなものを解決したいと思います

 if (bExp)                  if (bExp)
   x := 1                    x1 := 1
 else            SSA:       else
   x := 2                    x2 := 2
 y := x;                    y := Phi(x1,x2)

つまり、この場所にファイが必要です。実行コードには Phi がないことを認識してください! y が x1 または x2 のいずれかに (依存) しているという情報を使用して、次のステップでこれを書き直すことができます。たとえば、メモリ中心の表現では、Phi(x1,x2) は、x1 と x2 が同じメモリ位置、つまり y の 2 つのエイリアスである必要があることを示しています。ファイは情報を結び付けるだけです。

if (bExp)
  stackframe[y_index] = 1     (y_index being some offset)
else
  stackframe[y_index] = 2
nop

これが少し役立つことを願っています!

于 2009-02-27T13:04:16.947 に答える