静的単一代入(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フォームが追跡するこれらの以前の値を必要としないことです。私には、決して使用しない新しい変数を作成し続けることは悪い習慣、または単に「汚い」ように思えますが、それが表現で得られるものだと思います。
したがって、私の質問は、このマッピングを実現するための最良の方法は何ですか(少し主観的です、申し訳ありません)。私の当初の考えは、各メソッドに使用される(固定された)レジスタの数を知っているので、各レジスタの最新の値を追跡し、それだけを使用できるというものでしたが、それがどのように行われるかはわかりません。実践的に働きます。
ご意見をお待ちしております。