Compilateurs

En appliquant de façon répétée la propagation et le repliement de constantes au code ci-dessus, quel code obtient-on finalement ?

int n = 8;
int m = n * 2;
return m + 1;
  1. Areturn n * 2 + 1;
  2. Breturn 8 * 2 + m;
  3. Creturn 17;
Afficher la réponse et l'explication

Réponse : C. return 17;

Par propagation de constantes, n valant 8 et n'étant plus modifiée, ses utilisations sont remplacées par 8, d'où m = 8 * 2. Le repliement calcule 8 * 2 = 16, d'où m = 16, puis la propagation et le repliement transforment m + 1 en 16 + 1 = 17. Les affectations de n et m n'étant plus utilisées, elles sont supprimées comme code mort, et il ne reste que return 17;. Les formes arrêtées en cours de route ou issues d'un remplacement erroné ne sont pas le résultat final.

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

Autres questions sur Compilateurs

  1. Quelle description de l'élimination des sous-expressions communes appliquée au code ci-dessus est correcte ?
  2. Qu'élimine la suppression de code mort (dead code elimination) ?
  3. Quelle combinaison d'avantage et d'inconvénient de l'expansion en ligne (inlining) des fonctions est correcte ?
  4. Quel est le principal effet du déroulage de boucle (loop unrolling) ?
  5. 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)

Comparatifs sur ce thème