Optimized and formally-verified compilation for a VLIW processor - TEL - Thèses en ligne Access content directly
Theses Year : 2021

Optimized and formally-verified compilation for a VLIW processor

Compilation optimisante et formellement prouvée pour un processeur VLIW

Cyril Six

Abstract

Software programs are used for many critical roles. A bug in those can have a devastatingcost, possibly leading to the loss of human lives. Such bugs are usually found at a source level(which can be ruled out with source-level verification methods), but they can also be inserted bythe compiler unknowingly. CompCert is the first compiler with a formal proof of correctness:compiled programs are proven to behave the same as their source programs. However, because ofthe challenges involved in proving compiler optimizations, CompCert only has a limited numberof them. As such, CompCert usually generates low-performance code compared to classicalcompilers such as GCC. While this may not significantly impact out-of-order architectures suchas 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 isexplicit and specified in the assembly code through “bundles” of instructions: the compiler mustbundlize instructions to achieve good performance.In this thesis, we identify, investigate, implement and formally verify several classical optimiza-tions missing in CompCert. We start by introducing a formal model for VLIW bundles executionon 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 furtherincrease the performance of our generated code by implementing loop unrolling, loop rotationand loop peeling – the latter being used for Loop-Invariant Code Motion. These transformationsare verified by translation validation, some of them with hash-consing to achieve reasonablecompilation time.We evaluate each introduced optimization on benchmarks, including Polybench and TACleBench,on the KV3 VLIW core, ARM Cortex A53, and RiscV “Rocket” core. Thanks to this work, ourversion of CompCert is now only 16% slower (respectively 12% slower and 30% slower) thanGCC -O2 on the KV3 (respectively ARM and RiscV), instead of 50% (respectively 38% and45%).
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 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 est important (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 formellementplusieurs optimisations classiques manquantes dans CompCert. Tout d’abord, j’introduis un model formel d’exécution de bundles VLIW sur processeur à bitoduc imbriqué. Nous génèronsces 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). Cetravail implique aussi l’introduction d’une prédiction statique de branchements, et une duplica-tion 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éplacementd’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 RiscV “Rocket”. Grâce à nos travaux, notre version de CompCert est maintenant seulement 16% plus lente (respectivement12% et 30% plus lente) que GCC -O2 sur KV3 (respectivement ARM et RiscV), au lieu de 50% (respectivement 38% et 45%).
Fichier principal
Vignette du fichier
SIX_2021_archivage.pdf (7.82 Mo) Télécharger le fichier
Origin Version validated by the jury (STAR)

Dates and versions

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

Identifiers

  • HAL Id : tel-03326923 , version 2

Cite

Cyril Six. Optimized and formally-verified compilation for a VLIW processor. Performance [cs.PF]. Université Grenoble Alpes [2020-..], 2021. English. ⟨NNT : 2021GRALM025⟩. ⟨tel-03326923v2⟩

Collections

UGA STAR
364 View
201 Download

Share

Gmail Mastodon Facebook X LinkedIn More