Déplacement des invariants de boucle
From Wikipedia, the free encyclopedia
En programmation informatique, les invariants de boucle sont des instructions[réf. nécessaire] 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.
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.