Compilateurs

Quelle description de l'élimination des sous-expressions communes appliquée au code ci-dessus est correcte ?

x = (a + b) * c;
y = (a + b) * d;
  1. ACalculer a + b une seule fois, le stocker dans une variable temporaire et le réutiliser dans les deux expressions
  2. Bx et y étant des expressions similaires, supprimer le calcul de l'une d'elles
  3. CRemplacer la multiplication par une addition pour alléger le calcul
Afficher la réponse et l'explication

Réponse : A. Calculer a + b une seule fois, le stocker dans une variable temporaire et le réutiliser dans les deux expressions

L'élimination des sous-expressions communes est une optimisation qui, lorsqu'une expression de même valeur est calculée plusieurs fois, ne la calcule qu'une fois et réutilise le résultat. Ici, en calculant t = a + b puis x = t * c et y = t * d, on économise une addition. Il faut toutefois vérifier que a et b ne sont pas modifiés entre les deux expressions. x et y ayant des valeurs différentes, aucune ne peut être supprimée. Le remplacement de la multiplication par une opération plus légère est une autre optimisation, la réduction de force.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Qu'élimine la suppression de code mort (dead code elimination) ?
  2. Quelle combinaison d'avantage et d'inconvénient de l'expansion en ligne (inlining) des fonctions est correcte ?
  3. Quel est le principal effet du déroulage de boucle (loop unrolling) ?
  4. Dans la boucle ci-dessus, quel calcul est concerné par le déplacement d'expression invariante de boucle (sortie de la boucle) ? (x et y ne sont pas modifiés dans la boucle)
  5. Dans la boucle ci-dessus, quelle transformation correspond à la réduction de force appliquée au calcul d'indice i * 4 ?

Comparatifs sur ce thème