Publiée le 14 avril, LLVM 12, la dernière version du compilateur open source LLVM (Low Level Virtual Machine) apporte des optimisations pour la plateforme x86 et des modifications dans le back-end AArch64 Arm. Pour la cible x86, unattribut de fonction, tune-cpu, a été ajouté pour supporter -mtune comme GNU Compiler Collection (GCC), ce qui permet d’appliquer des optimisations de microarchitecture indépendamment de l'attribut target-cpu ou TargetMachine CPU, qui sera utilisé pour sélectionner le jeu d'instructions. Si cet attribut est absent, le tune CPU suivra le CPU cible. Toujours à propos de la cible x86, l'assembleur supporte désormais les préfixes de pseudo {disp32} et {disp8} pour contrôler la taille du déplacement pour les opérandes mémoire et les placements de saut.

Concernant le back-end AArch64 Arm, des améliorations ont été apportées à la génération de données unwind Windows. Plus précisément, les données unwind sont optimisées et écrites sous forme empaquetée quand cela est possible, ce qui réduit la taille des données unwind d'environ 60% par rapport à version LLVM 11 précédente. La génération de prologues/épilogues est modifiée quand on cible Windows, afin d'augmenter les chances de pouvoir utiliser le format de données unwind empaquetées.

Autre changement dans LLVM 12, le script de build interne Python llvm-build et les fichiers LLVMBuild.text associés décrivant la structure des composants LLVM ont été supprimés et remplacés par une approche purement CMake. Du fait de ce changement, chaque composant stocke des propriétés supplémentaires dans les cibles créées, les propriétés étant traitées une fois que tous les composants sont définis pour résoudre les dépendances des bibliothèques et produire l'en-tête attendu par llvm-config.

Autres fonctionnalités et améliorations apportées à LLVM 12 :

- Parmi les améliorations apportées à la LLVM IR (Intermediate Representation), on peut citer l'ajout d'un attribut byref pour mieux représenter le passage d'argument pour la convention d'appel amdgpu_kernel et l'ajout d'un paramètre de type à l'attribut sret, pour poursuivre le travail sur la suppression des types d'éléments ponctuels.

- La famille instrinsics llvm.experimental.vector.reduce a été renommée, le terme « experimental » a été supprimé pour signaler qu'elle était supportée dans Intermediate Representation (IR).

- le nettoyeur d'entiers -fsanitize=integer a maintenant un nouveau « sanitizer », -fsanitize=unsigned-shift-base. Le débordement n'est pas un comportement indéfini pour un décalage à gauche non signé, mais il a été à l’origine de bogues et d'exploits dans certaines bases de code.

- Des modifications ont été apportées à la cible PowerPC, y compris le support de la vectorisation d’épilogue (Epilogue Vectorization).