SSAフォームを使用したデータフロー分析のエイリアスレジスタを処理する方法は? (例えば、x86のeax/ax/ah/al)
-
01-10-2019 - |
質問
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)
しかし、私はそれがあまりにも多くの冗長だと思います
解決
あなたの表記の使用:
- eax@0 = ...ここの前のことは何でも...
- EAX@1 = 0
- ax@2 = ax@1 + 1
EAXにはaxが含まれているため、2〜3の間に暗黙のステップがあります
- EAX@0 = ...
- EAX@1 = 0
- ax@1 = 0(axがゼロの場合、axはゼロではないため)
- ax@2 = ax@1 + 1
ステップ2 xor'shed自体が0 ... eax@0がその時点で死んでいるため、eax@1は名前を変更できます(ebxを変更して読み取り可能です。明らかに仮想レジスタを使用します。本当のもの):
- ---削除された、EAXはもはや関連性がありません
- EBX@0 = 0
- BX@0 = 0
- BX@1 = BX@0 + 1
次に、ステップ3は一定の関数であるため、ステップ4(定数を定数に追加)し、2つを一緒に圧縮することに注意することができます(つまり、定数折りたたみ式)
- - 削除された、EAXはもはや関連性がありません
- EBX@0 = 0
- BX@0 = 1
EBXの上部16ビットがこれ以下のものを支配しない場合は、ステップ2を削除することもできます。
所属していません StackOverflow