2009-02-27 11 views
9

私はスタックマシン用のコンパイラ(特にCIL)を開発しており、コードを基本ブロックのグラフに解析しました。ここからは、SSAをメソッドに適用することを検討していますが、それほどうまくいきません。私の最初の試み(グラフではなくフラットなリストを使って作業している間)は、コードを反復してSSA idsのスタックを保持していました(割り当てターゲットの場合)。彼らは使用されています。これは単一の基本ブロックではうまく動作しますが、Φ関数を生成する方法を把握することはできません。SSA for stack machine code

SSA IDにスタック位置を付けて、コード・パスが収束したときにスタックに残っているものを見ていますが、これはRight Way(TM)のようには見えません。物事をするの。

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

+0

コンパイラはこれまでに何か来たのですか?私はまったく同じことをやろうと考えています。 –

答えて

8

ノード(基本ブロック)に複数の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 

これはちょっと役立ちます。

+1

ありがとうございました。私はこれの99%を持っていましたが、何らかの理由でスタックの位置が十分ではないようでした。あなたの答えとMS ResearchのMarmotコンパイラー紙の間に、私は今それを持っています:) –