Optimized and formally verified compilation for a VLIW processor - Archive ouverte HAL Accéder directement au contenu
Thèse Année : 2021

Optimized and formally verified compilation for a VLIW processor

Cyril Six

Résumé

Software programs are used for many critical roles. A bug in those can have a devastating cost, possibly leading to the loss of human lives. Such bugs are usually found at the source level (which can be ruled out with source-level verification methods), but they can also be inserted by the compiler unknowingly. CompCert is the first commercially available optimizing compiler with a formal proof of correctness: compiled programs are proven to behave the same as their source programs. However, because of the challenges involved in proving compiler optimizations, CompCert only has a limited number of them. As such, CompCert usually generates low-performance code compared to classical compilers such as GCC. While this may not significantly impact out-of-order architectures such as x86, on in-order architectures, particularly on VLIW processors, the slowness is significant (code running half as fast as GCC -O2). On VLIW processors, the intra-level parallelism is explicit and specified in the assembly code through “bundles” of instructions: the compiler must bundlize instructions to achieve good performance. In this thesis, we identify, investigate, implement and formally verify several classical optimizations missing in CompCert. We start by introducing a formal model for VLIW bundles executing on an interlocked core and generate those bundles through a postpass (after register allocation) scheduling. Then, we introduce a prepass (before register allocation) superblock scheduling, implementing static branch prediction and tail-duplication along the way. Finally, we further increase the performance of our generated code by implementing loop unrolling, loop rotation and loop peeling – the latter being used for Loop-Invariant Code Motion. These transformations are verified by translation validation, some of them with hash-consing to achieve reasonable compilation time. We evaluate each introduced optimization on benchmarks, including Polybench and TACleBench, on the KV3 VLIW core, ARM Cortex A53, and RISC-V “Rocket” core. Thanks to this work, our version of CompCert is now only 16% slower (respectively 12% slower and 30% slower) than GCC -O2 on the KV3 (respectively ARM and RISC-V), instead of 50% (respectively 38% and 45%).
On utilise des logiciels pour différents rôles, parfois critiques. La présence d’un bogue dans un logiciel peut avoir un coût dévastateur, pouvant aller jusqu’à la perte de vies humaines dans les cas les plus extrêmes. Les bogues viennent en général du code source (ceux-là peuvent être détectés par des méthodes de vérification formelle sur le langage source), mais ils peuvent être également générés par le compilateur. CompCert est le premier compilateur optimisant commercialisé comportant une preuve formelle de correction : il est formellement prouvé que les programmes compilés avec cet outil ont le même comportement que leurs programmes sources originels. Cependant, comme prouver les optimisations d’un compilateur relève d’un défi considérable, CompCert n’en a qu’un nombre limité. Ainsi, en général CompCert génère du code moins performant comparé à d’autres compilateurs classiques tels que GCC. Bien que cela n’impacte peu les architectures à exécution dans le désordre telles que x86, sur des architectures à exécution dans l’ordre, et en particulier sur des processeurs VLIW, le ralentissement estimportant (le code résultant est deux fois plus lent que GCC -O2). Sur un processeur VLIW , le parallélisme d’instructions est explicite et spécifié dans le code assembleur par des bundles (paquets) d’instructions : le compilateur doit paquétiser les instructions pour obtenir une bonne performance. Le but de cette thèse est d’identifier, d’enquêter, d’implémenter et de vérifier formellement plusieurs optimisations classiques manquantes dans CompCert. Tout d’abord, j’introduis un model formel d’exécution de bundles VLIW sur processeur à pipeline imbriqué. Nous générons ces bundles à partir d’un réordonnancement en postpass (après allocation de registres). Ensuite, j’introduis un réordonnancement de superblocks en prepass (avant allocation de registres). Ce travail implique aussi l’introduction d’une prédiction statique de branchements, et une duplication de queue. Enfin, pour continuer d’augmenter la performance du code généré, j’introduis du déroulage, rotation, et pelage de boucles – ce dernier étant utilisé dans du déplacement d’invariants de boucles. Ces transformations sont vérifiées par validation de translation, et certaines utilisent du partage maximal afin d’obtenir des temps de compilation raisonnables. Nous avons évalué chacune de ces optimisations sur des tests de performance, dont Polybench et TACLeBench, sur le coeur VLIW KV3, l’ARM Cortex A53, et le coeur RISC-V “Rocket”. Grâce à nos travaux, notre version de CompCert est maintenant seulement 16% plus lente (respectivement 12% et 30% plus lente) que GCC -O2 sur KV3 (respectivement ARM et RISC-V), au lieu de 50% (respectivement 38% et 45%).
Fichier principal
Vignette du fichier
thesis.pdf (7.81 Mo) Télécharger le fichier
Origine : Fichiers produits par l'(les) auteur(s)

Dates et versions

tel-03326923 , version 1 (26-08-2021)
tel-03326923 , version 2 (10-12-2021)

Identifiants

  • HAL Id : tel-03326923 , version 1

Citer

Cyril Six. Optimized and formally verified compilation for a VLIW processor. Programming Languages [cs.PL]. Université Grenoble Alpes, 2021. English. ⟨NNT : ⟩. ⟨tel-03326923v1⟩
315 Consultations
133 Téléchargements

Partager

Gmail Facebook X LinkedIn More