1

静的単一代入(SSA)形式のIRへのレジスタベースのバイトコード用のコンパイラを作成しています(具体的には、DalvikVMバイトコードからLLVMIRまでですが、一般的なトピックについて質問が受けられることを期待しています)。これを実行するための最良の、または理論的に最もクリーンな方法を考えています。

たとえば、レジ​​スタベースの命令がある場合:

add vA, vB, vC    (vA := vB + vC)
...
sub vA, vD, vE    (vA := vD - vE)

そうすると、vAの古い値は上書きされてvD --vEに置き換えられたため、使用できなくなります。

SSA形式では、次のようなものがあります

vA1 := vB + vC
...
vA2 := vD - vE

各変数は1回だけ割り当てられるためです。

問題は、レジスタベースの言語からのマッピングでは、各レジスタの最新の値のみを使用するため、SSAフォームが追跡するこれらの以前の値を必要としないことです。私には、決して使用しない新しい変数を作成し続けることは悪い習慣、または単に「汚い」ように思えますが、それが表現で得られるものだと思います。

したがって、私の質問は、このマッピングを実現するための最良の方法は何ですか(少し主観的です、申し訳ありません)。私の当初の考えは、各メソッドに使用される(固定された)レジスタの数を知っているので、各レジスタの最新の値を追跡し、それだけを使用できるというものでしたが、それがどのように行われるかはわかりません。実践的に働きます。

ご意見をお待ちしております。

4

1 に答える 1

3

一般に、SSA 構築アルゴリズムに似たものを使用する必要があります。分岐が存在する場合、状況は複雑になる可能性があります (たとえば、if-else のような構造があり、「if」句でのみ変更されたが後で使用される 1 つのレジスタがあると考えてください)。

LLVM IR といえば、単純に非 SSA 形式で出力し (alloca を介してスタックにレジスタを割り当て、値をロード/ストアします)、mem2reg を渡してすべてを消去します。これは、clang、llvm-gcc、および他の多くのフロントエンドが物事を発行する方法です:)

于 2011-12-28T16:33:56.153 に答える