Qu'est-ce que Allocation de registres ?

Traitement du compilateur qui affecte les variables et valeurs intermédiaires du programme au nombre limité de registres du CPU. On l'effectue, par exemple par coloration du graphe d'interférence, de sorte que des valeurs utilisées simultanément ne partagent pas le même registre.

Nom japonais: レジスタ割り当て

« Allocation de registres » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Compilateurs.

Domaine: Compilateurs

S'entraîner : questions sur Allocation de registres

Pour l'allocation de registres par coloration du graphe d'interférence, quelle combinaison de ce que représentent nœuds et arêtes est correcte ?

  1. ALes nœuds sont les instructions, les arêtes l'ordre d'exécution
  2. BLes nœuds sont les registres, les arêtes le câblage entre registres
  3. CLes nœuds sont les valeurs, les arêtes la relation d'être vivantes simultanément
Afficher la réponse et l'explication

Réponse : C. Les nœuds sont les valeurs, les arêtes la relation d'être vivantes simultanément

Dans le graphe d'interférence, les variables et valeurs intermédiaires sont les nœuds, et deux valeurs toutes deux encore utilisées (vivantes) à un même instant sont reliées par une arête. Des valeurs reliées étant nécessaires simultanément, elles ne peuvent partager un registre. Avec k registres, si l'on parvient à colorier le graphe en k couleurs sans que deux voisins aient la même couleur, chaque couleur correspond directement à un registre. Sinon, certaines valeurs sont déversées en mémoire (spill). Ce n'est pas un graphe de l'ordre des instructions ni du câblage des registres.

Lorsqu'un « déversement » (spill) se produit lors de l'allocation de registres, qu'advient-il du code généré ?

  1. ALes instructions de sauvegarde sur la pile et de rechargement augmentent, et le code tend à ralentir
  2. BLe nombre de registres augmente automatiquement et toutes les valeurs tiennent en registres
  3. CLes valeurs inutilisées sont supprimées et le nombre d'instructions diminue
Afficher la réponse et l'explication

Réponse : A. Les instructions de sauvegarde sur la pile et de rechargement augmentent, et le code tend à ralentir

Le déversement consiste à placer certaines valeurs en mémoire (pile) lorsque les valeurs vivantes simultanément sont plus nombreuses que les registres. Chaque utilisation de la valeur exige une instruction de chargement et chaque modification une instruction de stockage ; les instructions augmentent et le code tend à ralentir du fait des accès mémoire. Le compilateur garde donc en registres les valeurs souvent utilisées, par exemple dans les boucles, et choisit de déverser celles qui le sont peu. Le nombre de registres est fixé par le CPU et n'augmente pas, et cela n'a rien à voir avec la suppression de valeurs inutiles.

Questions mentionnant « Allocation de registres » (3)

  1. Pour l'allocation de registres par coloration du graphe d'interférence, quelle combinaison de ce que représentent nœuds et arêtes est correcte ?
  2. Lorsqu'un « déversement » (spill) se produit lors de l'allocation de registres, qu'advient-il du code généré ?
  3. Que détermine l'analyse de vivacité (liveness), effectuée en préparation de l'allocation de registres ?

Termes associés

Débordement (spill) Graphe de flot de contrôle Analyse lexicale Analyse syntaxique Arbre syntaxique abstrait (AST) Bloc de base Compilation JIT Déroulage de boucle (loop unrolling) Élimination des sous-expressions communes Forme SSA

Retour au glossaire