私は自分が書いているコンパイラーのためにSSA構築を実装しています。SSAアルゴリズムには理解できないことがあります(Cytronの論文とAWAppelによる第2版の本「 ModernCompilerImplementation inJava」を使用)。変数y
が1つの直線制御フローパスで初めて定義された(そして使用された)が、別の並列パスでは定義されなかった場合はどうなりますか。ジョインポイント(定義するブロックの支配辺境y
)にPHI関数を挿入する必要がありますか?
x = 1; // A
if (P) // A
y = x + 1; // B
y = y + 1; // B
x = x + 1; // C
return; // C
たとえば、ブロックBには、の最初の定義がありy
ます。ブロックCの先頭に2つのオペランド(入力制御フローパスごとに1つ)を持つPHI命令を挿入する必要がありますか?次に、SSAの名前変更について:定義されA -> C
ていないパス(Bを経由しない)からのオペランドにどのように名前を付けますか?y
Entry --- A --------- C --- Exit
\ /
\-- B --/