Mejoras de tiempo de compilación en LLVM 23: del -6,75% al detalle interno

Fuentes: Compile-Time Improvements in LLVM 23

LLVM 23 reduce el tiempo de compilación un 6,75% en compilaciones -O3, con un descenso del 10,53% en el caso concreto de sqlite3, según los datos del propio proyecto. La mayor parte de la ganancia procede de tres reformas de las tablas hash que LLVM utiliza intensivamente: el paso de sondeo cuadrático a sondeo lineal con un esquema de borrado mejorado en DenseMap, SmallPtrSet y StringMap, que elimina la necesidad de claves tumba; el almacenamiento compacto de la ocupación de DenseMap en un array de bits, lo que evita valores reservados en banda y reduce fallos de caché y de bifurcación; y la sustitución de CityHash y una función hash débil de punteros por xxh3, más rápida y condición previa para los cambios anteriores.

Otro vector clave es SmallVector: el crecimiento trivially-copyable de push_back se ha movido fuera de línea y se ha habilitado la optimización de tail call, lo que acorta el rango vivo de los registros, reduce instrucciones en el camino rápido, favorece el shrink wrapping y disminuye el tamaño del código, abriendo la puerta a más inlining. En el dominator tree se ha sustituido el vector de hijos por una representación hijo-hermano para evitar asignaciones, complementada con un BumpAllocator que recorta las llamadas a malloc y free. La construcción del propio árbol se ha simplificado al no materializar sucesores y al guardar los predecesores como una lista de aristas. Los sucesores() se reescribieron como iteradores sobre rangos de Uses, lo que elimina una función externa que despachaba repetidamente sobre el tipo de instrucción terminal, y exigieron como preparación dividir Br en UncondBr y CondBr. Por último, se han eliminado comprobaciones baratas reiteradas al exigir IR bien formado y bloques no nulos, y se ha acelerado la iteración de predecesores.