2010-04-23 29 views
2

Pour exmaple:Comment traiter les registres d'alias dans l'analyse des flux de données à l'aide du formulaire SSA? (Par exemple EAX/AX/AH/AL dans x86)

Comment représenter le x86 suivant SSA form:

xor eax, eax 
inc ax 

En introduisant certaines fonctions pseudo, je viens avec:

[email protected] = [email protected]^[email protected] 
[email protected] = LOWORD([email protected]) 
[email protected] = LOBYTE([email protected]) 
[email protected] = HIBYTE([email protected]) 
[email protected] = HIWORD([email protected]) 

[email protected] = [email protected] + 1 
[email protected] = MAKEDWORD([email protected], HIWORD([email protected])) 
[email protected] = LOBYTE([email protected]) 
[email protected] = HIBYTE([email protected]) 

Mais je pense qu'il est trop bavard

+0

Qu'entendez-vous par "formulaire SSA"? –

+0

@Eli Bendersky: http://en.wikipedia.org/wiki/Static_single_assignment_form – inv

+0

Je n'ai aucune suggestion pour simplifier cela, mais je suis curieux de savoir où cela est utilisé. Êtes-vous en train d'essayer d'optimiser/traduire une application compilée existante? ***** En regardant l'exemple ci-dessus, n'auriez-vous pas besoin de garder eax, ax, al et ah synchronisé à chaque étape. Par exemple, que se passe-t-il si les instructions suivantes sont une branche conditionnelle où un chemin utilise ax et l'autre utilise eax? Vous devrez alors être encore plus bavard pour mettre à jour toutes les versions de ce registre mises à jour! –

Répondre

2

Utilisation de 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
  4. @ 1 = 0 (be hache de cause ne peut être non nulle si EAX est égal à zéro)
  5. hache
  6. @ 2 = ax @ 1 + 1

Étape 2 parce que tout nombre avec lui-même est un OU Exclusif 0 ... EAX @ 0 est mort à ce point, et donc eax @ 1 peut être renommé (en utilisant ebx comme renommer pour qu'il soit lisible; évidemment vous pouvez utiliser un registre virtuel, 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 peut 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 compresser les deux ensemble (ie pliage constant)

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

Si les 16 bits supérieurs de EBX ne dominent rien dessous, vous pourrait également supprimer l'étape 2.

+2

Oui, c'est vrai. J'essaye d'éviter le verbeux, mais le verbose peut être la caractéristique de SSA. – inv