En informatique , le chaînage de sauts est une optimisation du compilateur qui consiste à effectuer un saut direct vers un autre. Si la seconde condition est un sous-ensemble ou l'inverse de la première, elle peut être éliminée ou enchaînée au premier saut. Ceci est facilement réalisable en une seule passe à travers le programme, en suivant des chaînes de sauts acycliques jusqu'à ce que le compilateur atteigne un point fixe.
Avantages
Le principal avantage du traitement par sauts est la réduction du nombre de sauts exécutés dynamiquement. Ceci ouvre la voie à d'autres optimisations grâce à la diminution du nombre de conditions, ce qui améliore les performances. En moyenne, on peut s'attendre à ce que 2 à 3 instructions soient omises suite à la suppression réussie d'une branche d'exécution .
Exemples
Le pseudocode suivant illustre les cas où un saut peut être enchaîné.
10. a = SomeNumber(); 20. SI a > 10 ALLER À 50 ... 50. SI a > 0 ALLER À 100 ...
Le saut sur la ligne 50 sera toujours effectué si le saut sur la ligne 20 est effectué. Par conséquent, tant que la ligne 100 est accessible depuis le saut (ou que la taille du saut n'a pas d'importance), le saut sur la ligne 20 peut être modifié sans risque pour atteindre directement la ligne 100.
Un autre exemple illustre le chaînage par saut de 2 conditions de chevauchement partiel :
void baz ( bool x , bool y , bool z ) {si ( x && y )bar ();si ( y || z )foo ();}
Ce qui précède peut être transformé en :
void baz ( bool x , bool y , bool z ) {si ( x && y ) {bar ();aller à jmp ;}si ( y || z ) {saut :foo ();}}
Si la première branche est choisie xet yque les deux conditions sont vraies ( conjonction logique ), l'évaluation de l'expressiony || z n'est pas nécessaire ( disjonction logique ). Par conséquent, un saut vers l'étiquettejmp est effectué.