next up previous
Next: Reconnaissance des tests Up: 2.2.1 Code de contrôle Previous: Introduction

Déplacement de code


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.



Julien Zory
Thu Mar 12 17:35:23 MET 1998