DĂ©placement des invariants de boucle
En programmation informatique, les invariants de boucle sont des instructions ou des expressions d'un langage de programmation impĂ©ratif qui peuvent ĂȘtre dĂ©placĂ©es hors du corps de la boucle sans affecter le rĂ©sultat du programme. Le dĂ©placement des invariants de boucle est une optimisation assurĂ©e par le compilateur qui effectue automatiquement ce dĂ©placement.
Exemple
Deux optimisations peuvent ĂȘtre appliquĂ©es Ă l'extrait de code suivant :
for (int i = 0; i < n; i++) {
x = y + z;
a[i] = 6 * i + x * x;
}
L'affectation x = y + z
et l'expression x * x
peuvent ĂȘtre sortis de la boucle, car ce sont des invariants de boucle : ils ne changent pas d'une itĂ©ration Ă la suivante. Le code optimisĂ© ressemblera Ă :
x = y + z;
temp1 = x * x;
for (int i = 0; i < n; i++) {
a[i] = 6 * i + temp1;
}
DĂ©tection du code invariant
Pour déterminer les instructions et les expressions invariantes, on analyse la portion de code sur laquelle une valeur reste inchangée (Reaching definition en anglais).
Par exemple, si tous les opérandes d'une expression sont définis à l'extérieur de la boucle et inchangés depuis, on peut sortir cette expression de la boucle.
Avantages et inconvénients de la méthode
Le code qui a été sorti d'une boucle est exécuté moins souvent, ce qui apporte une accélération. Un autre effet de cette transformation est qu'elle permet de placer des constantes dans des registres et il ne faut donc pas calculer l'adresse d'une variable puis accéder à la mémoire à chaque itération.
NĂ©anmoins, si l'on crĂ©e trop de variables, on augmente les besoins en allocation de registres, ce qui est encore plus gĂȘnant sur les processeurs qui disposent de peu de registres, comme les x86 32 bits. Si le compilateur a Ă©puisĂ© les registres, certaines variables devront ĂȘtre mises en mĂ©moire. Pour pallier ce problĂšme, il faut procĂ©der Ă l'optimisation « inverse » du dĂ©placement des invariants de boucle, la « rematĂ©rialisation ».
Bibliographie
- (en) Aho, Alfred V.; Sethi, Ravi; & Ullman, Jeffrey D. (1986). Compilers: Principles, Techniques, and Tools. Addison Wesley. (ISBN 0-201-10088-6).