Certains calculs au sein d'une boucle sont invariants, et peuvent
être évalués à l'extérieur de cette boucle (donc une seule fois au
lieu de n). Des algorithmes permettant de rechercher les calculs
invariants puis de les déplacer (basés sur l'utilisation des
used-def chains) existent et sont utilisés par la plupart des
compilateurs [2]. Cependant, lorsque la structure de
l'expression à évaluer ne se prête pas directement à de telles
optimisations, le compilateur n'en fera rien. Or, dans le cadre de la
génération automatique de code, les propriétés opératoires classiques
peuvent être utilisées pour effectuer divers "arrangements" sur la
structure étudiée (de telles manipulations sont à manipuler avec plus
de précautions en calcul numérique car elle ne peuvent garantir
la "stabilité" des résultats). Nous allons donc nous intéresser à des
techniques permettant de normaliser, factoriser, atomiser ou encore
déplacer des expressions arithmétiques, tout en respectant les
contraintes du flot de données. L'exemple de la figure
1 montre un nid de boucles pour lequel
l'évaluation de la borne inférieur de l'indice de boucle i peut être
partiellement remontée (figure 2 - gain de 2000
opérations). Ce genre de transformations suppose l'application de
quelques propriétés opératoires (dans ce cas, distributivité de
l'addition par rapport au ).
Figure 1: Un indice de boucle complexe.
Figure 2: L'évaluation de i est partiellement remontée.