2

例:

次の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)

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

4

1 に答える 1

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(eaxがゼロの場合、axをゼロ以外にすることはできないため)
  4. ax @ 2 = ax @ 1 + 1

ステップ2それ自体と排他的論理和された数値は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を削除することもできます。

于 2010-07-09T00:15:53.350 に答える