Bonjour,
C'est le schéma classique. Il ne suppose pas que les phases amont de l'optimisation soient traitées sans réflexion sous prétexte qu'il y a l'optimisation. Or pour créer une variable booléenne intermédiaire il faut plus de code : pratiquement le code cible plus celui de la création de la variable booléenne et celui son utilisation par une comparaison à 0 pour opérer le saut attendu.
Exemple débile mais avec un code simple :
if(i > 7) i--; else i++; // on suppose i dans eax et la variable booléenne dans ecx
Deux implémentations assembleur non optimales possibles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ; Code direct
cmp eax, 7
jng @else ; jump if not greater : i <= 7
dec eax
jmp @end_if
@else:
inc eax
@end_if
; Code avec variable booléenne
cmp eax, 7
setg ecx ; création de la variable booléenne = eax > 7 ? 1 : 0
cmp ecx, 0 ; utilisation de la variable booléenne
jng @else ; Saut si ecx !> 0 <=> ecx <= 0, mais comme ecx = 0 ou 1 <=> exc == 0 soit jz
dec eax
jmp @end_if
@else:
inc eax
@end_if |
On voit bien (d'autant que j'ai mis jng ligne 14 là où jz aurait été plus lisible
) que les deux lignes 12 et 13 consacrées à la variable booléenne peuvent allègrement disparaître, ou mieux ne pas être crées, sans complexifier aucunement le code donc à la portée d'un compilo simplet. J'y arrive bien moi !
LLVM a beaucoup de succès par la souplesse qu'il apporte tout en gardant des performances correctes. Ce n'est cependant pas mon premier choix.
Salutations
Partager