Comment gérer les registres d'alias dans l'analyse de flux de données en utilisant le formulaire SSA? (Par exemple EAX / AX / AH / AL dans x86)

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

Question

Pour exmaple:

Comment représenter les éléments suivants x86 SSA forme :

xor  eax, eax
inc  ax

En introduisant des fonctions pseudo, je viens avec:

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)

Mais je pense qu'il est trop bavard

Était-ce utile?

La solution

En utilisant votre notation:

  1. eax @ 0 = ... quelque chose comme ça avant ici ...
  2. eax @ 1 = 0
  3. hache @ 2 = ax @ 1 + 1

Parce que eax contient hache, il y a une étape implicite entre 2 et 3

  1. eax @ 0 = ...
  2. eax @ 1 = 0
  3. hache @ 1 = 0 (parce que la hache ne peut pas être non nulle si EAX est égal à zéro)
  4. hache @ 2 = ax @ 1 + 1

Étape 2 parce que tout numéro avec lui-même est un OU Exclusif 0 ... EAX @ 0 est mort à ce moment-là, et donc EAX @ 1 peuvent être renommés (en utilisant EBX comme renommant il est lisible, vous évidemment utiliser un virtuel registre, pas un vrai):

  1. --- supprimé, EAX ne sont plus pertinentes
  2. EBX @ 0 = 0
  3. bx @ 0 = 0
  4. bx @ 1 = bx @ 0 + 1

On pourrait alors noter que, parce que l'étape 3 est une fonction constante, est donc l'étape 4 (en ajoutant une constante à une constante) et de comprimer les deux ensemble (à savoir pliage constante)

  1. - supprimé, EAX ne sont plus pertinentes
  2. EBX @ 0 = 0
  3. bx @ 0 = 1

Si les 16 bits supérieurs de EBX tout pour ne pas dominer en dessous, vous pouvez aussi l'étape de suppression 2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top