SSAフォームを使用したデータフロー分析のエイリアスレジスタを処理する方法は? (例えば、x86のeax/ax/ah/al)

StackOverflow https://stackoverflow.com/questions/2697172

質問

Exmapleの場合:

次のx86を表す方法 SSAフォーム:

xor  eax, eax
inc  ax

いくつかの擬似関数を導入することで、私は考えました:

eax@1 = eax@0 ^ eax@0
ax@1 = LOWORD(eax@1)
al@1 = LOBYTE(ax@1)
ah@1 = HIBYTE(ax@1)
hax@1 = HIWORD(eax@1)

ax@2 = ax@1 + 1
eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1))
al@2 = LOBYTE(ax@2)
ah@2 = HIBYTE(ax@2)

しかし、私はそれがあまりにも多くの冗長だと思います

役に立ちましたか?

解決

あなたの表記の使用:

  1. eax@0 = ...ここの前のことは何でも...
  2. EAX@1 = 0
  3. ax@2 = ax@1 + 1

EAXにはaxが含まれているため、2〜3の間に暗黙のステップがあります

  1. EAX@0 = ...
  2. EAX@1 = 0
  3. ax@1 = 0(axがゼロの場合、axはゼロではないため)
  4. ax@2 = ax@1 + 1

ステップ2 xor'shed自体が0 ... eax@0がその時点で死んでいるため、eax@1は名前を変更できます(ebxを変更して読み取り可能です。明らかに仮想レジスタを使用します。本当のもの):

  1. ---削除された、EAXはもはや関連性がありません
  2. EBX@0 = 0
  3. BX@0 = 0
  4. BX@1 = BX@0 + 1

次に、ステップ3は一定の関数であるため、ステップ4(定数を定数に追加)し、2つを一緒に圧縮することに注意することができます(つまり、定数折りたたみ式)

  1. - 削除された、EAXはもはや関連性がありません
  2. EBX@0 = 0
  3. BX@0 = 1

EBXの上部16ビットがこれ以下のものを支配しない場合は、ステップ2を削除することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top