Cuando un desarrollador escribe (x << 2) & -4 en Java, un compilador optimizador debería poder eliminar el AND bit a bit: el desplazamiento a la izquierda siempre deja los dos bits inferiores a cero, así que la máscara con -4 (11111100) no tiene efecto. Sin embargo, el compilador C2 de HotSpot no podía demostrarlo durante décadas porque su modelo de tipos enteros solo almacenaba un rango [lo, hi] firmado, una información demasiado débil para capturar propiedades como "este valor es múltiplo de cuatro".
La solución, incorporada en JDK 26 y ampliada en JDK 27, consiste en complementar el rango con dos máscaras adicionales de 32 bits: una de ceros conocidos y otra de unos conocidos por cada posición de bit. Con esta estructura, llamada KnownBits, cada bit puede estar en tres estados (conocido cero, conocido uno o desconocido) y la invariante zeros & ones == 0 debe cumplirse siempre. No es una idea exclusiva de HotSpot: LLVM usa una representación equivalente en su clase KnownBits y GCC mantiene algo similar en su pase de propagación constante condicional.
El artículo explica cómo HotSpot combina dos abstracciones, el rango firmado, el rango sin signo y las máscaras de bits, en un "producto reducido" que se refinan mutuamente mediante la función canonicalize_constraints(). Cuando los bits saben que los dos inferiores son cero, el rango se estrecha al múltiplo de cuatro más cercano dentro de su intervalo; cuando el rango limita los valores posibles, los bits pueden marcar como cero conocidos los bits altos que nunca pueden aparecer. Este intercambio iterativo es el corazón de la optimización que finalmente permite al JIT borrar máscaras inútiles y, por extensión, realizar optimizaciones más agresivas en código numérico de bajo nivel.
