Master Info - 2013-2014 Compilation TD4 - Génération de code, et optimisation 1 Génération de code 1.1 Exo TD3 Cf l’énoncé du TD3. 1.2 Exo Supplémentaire n :=0; x0 : = 0 ; x1 : = 0 ; d e l t a := b∗b−4∗a ∗ c ; i f d e l t a > 0 then begin n:=2; x0 := (−b − s q r t ( b∗b−4∗a ∗ c ) ) / ( 2 ∗ a ) ; x1 := (−b + s q r t ( b∗b−4∗a ∗ c ) ) / ( 2 ∗ a ) ; end else begin i f d e l t a = 0 then begin n:=1; x0 := −b −s q r t ( b∗b−4∗a ∗ c ) ; x1 := x0 ; end ; end ; On suppose que la fonction sqrt est définie et utilisable via un appel. Donner le code 3 adresses correspondant à ce code. 2 TD4 : Optimisation : expressions communes Après la production de code 3 adresses, il reste à faire la production du code assembleur : — Sélection des instructions — Allocation des registres — Optimisations . . . Problèmes spécifiques à la machine cible Pour en savoir plus : Compilateurs (dragon book) Aho, Sethi, Ullman Dans la suite nous regardons les optimisations indépendantes de machine cible. Elles sont en général réalisées sur le graphe de flot de contrôle (cf document joint). 2.1 Exo du TD : sous expressions-communes. Soit le code à trois adresses suivant : TD4 MIF12, Master Info - 2013-2014, L. Gonnord & E. Guillou 1/4 (1) (2) (8) (10) a=b+c b=a+c d=c+e si d>7 aller a (8) t=a+c v=c+e aller a (10) t=b+c v=a+c b=a+c a=b+c 1. Construire le graphe de flot de contrôle. 2. On cherche à réaliser l’optimisation des sous expressions communes. Pour chaque bloc, calculer les ensembles d’expressions produites et supprimées : Prod et Sup. 3. Calculer les ensembles des expressions disponibles en entrée et en sortie de chaque bloc. 4. Avec ce résultat, optimiser le code. Avec une boucle Mêmes questions avec ce programme : x:=a+b; y:=a*b; while(y>a+b) do a:=a+a; x:=a+b; done 2.2 Pour s’entraı̂ner - exos corrigés La définition des différents ensembles est dans le cours, sur le web (c’est classique) ou par exemple ici : http://laure.gonnord.org/pro/teaching/m2ens analysestatique slides2012.pdf Attention ;.les calculs ne sont pas garantis sans erreur. Graphe de flot Générer le graphe de flot de contrôle pour le code suivant : while d>0 do{ a:=b+c; d:=d-b; e:=a+f; if e>0 {f:=a-d;b:=d+f} else {e:=a-c} b:=a+c} On obtient pour graphe de flot de contrôle : TD4 MIF12, Master Info - 2013-2014, L. Gonnord & E. Guillou 2/4 B0 d > 0? B1 a := b + c d := d − b e := a + f e > 0? B3 f := a + d b := d + f e := a − c b := a + c B4 B5 On met le test dans le bloc B1 . Variables actives Sur le graphe de flot de l’exercice précédent : 1. Écrire et résoudre le système d’équations relatif aux ensembles Gen, Kill, In et Out, en prenant bien soin d’initialiser les ensembles correctement. 2. Supprimer les instructions inutiles (“code mort”). Bi Gen Kill B0 d ∅ B1 bcdf ade B2 e ∅ B3 ac e B4 ad bf B5 ac b In d bcdf e ad ac ac Out bcdf e acd ac ac d In Out bcdf bcdf bcdf acde acde acd acd acd ac acd acd bcdf In bcdf bcdf acde acd acd acdf Out bcdf acde acd acdf acdf bcdf In bcdf bcdf acde acdf acd acdf Out bcdf acde acdf acdf acdf bcdf In bcdf bcdf acdef acd acdf acdf Out bcdf acde acdf acdf acdf bcdf In bcdf bcdf acdef acd acdf acdf On a donc : Out(B3 ) = {a, c, d, f }. b est affectée en B3 mais n’est pas vivante en sortie de B3 , on peut donc enlever cette affectation. De même, dans le bloc 4, e n’est pas vivante en sortie, donc on peut supprimer l’affectation e := .... Variables Actives Après génération de code, on obtient le programme suivant : TD4 MIF12, Master Info - 2013-2014, L. Gonnord & E. Guillou 3/4 Out bcdf acde acdef acdf acdf bcdf B1 d1 : i := m − 1 d2 : J := n d3 : a := u1 B2 d4 : i := i + 1 d5 : j := j − 1 B3 B4 d6 : a := u2 d7 : i := u3 Supprimer le code mort. Initialisation : Bi Gen Kill B1 m, n, u1 i, J, a B2 i, j i, j B3 u2 a B4 u3 i Itérations Bi B1 B2 B3 B4 In Out m, n, u1 i, j i, j u2 , u3 u2 i, j u3 i, j In m, n, j, u1 u2 , u3 , i, j i, j, u2 u3 , j Out u2 , u3 , i, j i, j, u2 , u3 u2 , u3 , i, j u2 , u3 , i, j In m, n, u1 , u2 , u3 , j u2 , u3 , i, j u2 , u3 , i, j u2 , u3 , j Out u2 , u3 , i, j u2 , u3 , i, j u2 , u3 , i, j u2 , u3 , i, j In u1 , u2 , u3 , m, n, j u2 , u3 , i, j u2 , u3 , i, j u2 , u3 , j Conclusion : on peut supprimer d2 , d3 et d6 car J, a 6∈ Out(B1 ) et a 6∈ Out(B3 ). TD4 MIF12, Master Info - 2013-2014, L. Gonnord & E. Guillou 4/4 Out idem idem idem idem