Decoupled (SSA-based) Register Allocators : from Theory to Practice, Coping with Just In Time Compilation and Embedded Processors Constraints. - TEL - Thèses en ligne Accéder directement au contenu
Thèse Année : 2012

Decoupled (SSA-based) Register Allocators : from Theory to Practice, Coping with Just In Time Compilation and Embedded Processors Constraints.

Quentin Colombet
  • Fonction : Auteur
  • PersonId : 864979

Résumé

In compilation, register allocation is the optimization that chooses which vari- ables of the source program, in unlimited number, are mapped to the actual registers, in limited number. Parts of the live-ranges of the variables that can- not be mapped to registers are placed in memory. This eviction is called spilling. Until recently, compilers mainly addressed register allocation via graph coloring using an idea developed by Chaitin et al. in 1981. This approach addresses the spilling and the mapping of the variables to registers in one phase. In 2001, Appel and George proposed to split the register allocation in two separate phases. This idea yields better and independent solutions for both problems, but requires a very aggressive form of live-range splitting, split everywhere, which renames all variables between all instructions of the program. However, in 2005, several groups observed that the static single assignment (SSA) form provides suﰄcient split points to decouple the register allocation as Appel and George suggested, unless register aliasing or precoloring constraints are involved. Prior to this thesis, no alternative to this aggressive live-range splitting was available for decoupled register allocation with register aliasing. Other forms of architectural constraints, e.g., encoding and application binary interface (ABI) constraints, can be handled via a form of live-range splitting, more intensive than SSA but less aggressive than split everywhere. This thesis covers all the aspects of decoupled register allocation under SSA with architectural constraints. In a first part, we focused on the spilling problem. Using an exact formulation of the spilling problem, we investigated the impact of SSA during this phase and compared several spilling approaches, exact or not, in our model. This comparison pointed out that SSA complicates the problem and that the state-of-the-art objective function, the static spill cost, used to optimize spill code placement may not be relevant for runtime performances. Following these observations, we evaluated several, existing or not, simpliﰂcations of the spilling problem that should help design a good spilling heuristic in terms of runtime performance, though not necessarily static spill cost. The second part of the manuscript is dedicated to the assignment phase. We showed how to handle regular architectural constraints without intensive live-range splitting. Our approach is compatible with graph-coloring-based ap- proaches, but also with scan-based approaches (traversal of the control-ﰃow graph), as we demonstrated with our fast register allocator, tree-scan . Regard- ing register aliasing, we showed how to limit the eﰆect of split everywhere and still having the decoupling property. Finally, in a third part, we demonstrated how to improve the ﰂnal assembly code via local recoloring techniques. These techniques help to deconstruct colored SSA, i.e., register-allocated SSA, and eliminates many copies instructions inserted for live-range splitting purposes. We wanted all this work to be applicable to just-in-time (JIT) compilation for embedded targets, thus speed and memory footprint were a concern.
En compilation, l'allocation de registres est l'optimisation qui choisit quelles variables du programme source, en nombre illimité, sont stockées dans les registres physiques, en nombre limité. Les variables qui ne peuvent tenir en registre sont placées en mémoire. Cette éviction est appelée spilling. Jusqu'à récemment, les compilateurs traitaient l'allocation de registres glob- alement via la coloration de graphes en utilisant une idée développée par Chaitin et al. en 1981. En 2001, Appel et George ont proposé de découper l'allocation de registres en deux phases distinctes. Cette idée permet de définir de meilleures solutions pour les deux problèmes, mais nécessite une forme très agressive de renommage des variables, le split everywhere, qui renomme toutes les variables entre toutes les instructions du programme. Cependant, en 2005, plusieurs groupes ont observé qu'en l'absence de contraintes d'aliasing de registres et de précoloriage, le passage en static single assignment (SSA) définit des points de renommage suffisants pour découpler l'allocation de registres tel que suggéré par Appel et George. Avant cette thèse, pour les approches découplées, seule la technique agressive du split everywhere était disponible en présence d'aliasing de registres. Les autres formes de contraintes d'allocation, contraintes d'encodage d'instructions et celles dites d'application binary interface (ABI) peuvent être traitées par du renommage plus intensif qu'avec SSA mais moins qu'avec le split everywhere. Cette thèse couvre tous les aspects de l'allocation de registres découplée sous SSA avec des contraintes architecturales. Dans une première partie, nous nous sommes concentrés sur le problème du spill. En utilisant une formulation exacte, nous avons mis en évidence le fait que SSA complique le problème et que la fonction objective de l'état de l'art, le coût statique de spill, utilisée pour optimiser le placement du code de spill n'est pas pertinente en ce qui concerne les performances d'exécution. Suivant ces observations, nous avons évalué plusieurs simplifications du problème, proposées antérieurement ou non, qui devraient permettre de concevoir un bonne heuristique en termes de performances d'exécution mais pas nécessairement de coût statique de spill. La deuxième partie du manuscrit est dédiée à la phase d'assignation aux registres. Nous avons montré comment éviter un renommage intensif pour gérer les contraintes architecturales habituelles. Notre méthode est compatible avec les approches basées sur la coloration de graphe, mais aussi sur les scans (parcours du graphe de flot de contrôle), comme nous l'avons démontré avec notre allocateur de registre rapide, le tree-scan . En présence d'aliasing de registres, nous avons montré comment limiter les eﰆets de split everywhere tout en ayant les bonnes propriétés des approches découplées. Finalement, dans une troisième partie, nous avons montré comment améliorer le code assembleur final avec des techniques de recoloriage. Celles-ci aident à la déconstruction de SSA et à l'élimination des copies insérées par le renommage. Enfin, nous voulions que nos travaux soient applicables à la compilation dite just-in-time (JIT) pour processeurs embarqués, ainsi la vitesse et l'empreinte mémoire ont été une préoccupation de tous les instants.
Fichier principal
Vignette du fichier
thesis.pdf (3.55 Mo) Télécharger le fichier

Dates et versions

tel-00764405 , version 1 (13-12-2012)
tel-00764405 , version 2 (21-02-2013)

Identifiants

  • HAL Id : tel-00764405 , version 1

Citer

Quentin Colombet. Decoupled (SSA-based) Register Allocators : from Theory to Practice, Coping with Just In Time Compilation and Embedded Processors Constraints.. Data Structures and Algorithms [cs.DS]. Ecole normale supérieure de lyon - ENS LYON, 2012. English. ⟨NNT : 2012ENSL0777⟩. ⟨tel-00764405v1⟩
360 Consultations
1793 Téléchargements

Partager

Gmail Facebook X LinkedIn More