Detectar valores NaN en la frontera de pases de MLIR

Fuentes: Catching NaN at the MLIR Pass Boundary

En el compilador MLIR, un pase de fusión puede generar un atributo NaN durante el constant folding aunque todos sus operandos partan de valores válidos, lo que termina propagando un resultado numéricamente inválido al runtime y degradando métricas de precisión mucho más adelante, sin que el fallo se localice fácilmente. El estándar IEEE 754 define que operaciones como 0 * Inf, Inf − Inf, Inf / Inf o 0/0 producen NaN, y que cualquier operación aritmética posterior propaga ese NaN; además, NaN no se compara igual consigo mismo, por lo que un chequeo de rango como x < min || x > max lo acepta como válido y solo un chequeo directo de finitud lo detecta.

El artículo propone un flujo de depuración análogo al de la propagación de X en simuladores HDL: se recorre el grafo hacia atrás hasta la primera transición de un valor válido a NaN, que identifica el pase defectuoso. En MLIR se usa -mlir-print-ir-after-all para localizar el pase sospechoso y luego -mlir-print-ir-before y -mlir-print-ir-after para comparar el último IR válido con el primer IR corrupto. Como el verificador por defecto solo valida estructura y tipos, no captura el problema, la solución recomendada es definir un Operation Definition Specification (ODS) con hasVerifier = 1 y un verificador en C++ que use APFloat::isFinite(), isNegative() e isZero() para exigir que el atributo scale sea un real positivo finito, garantizando que cualquier productor futuro del atributo cumpla el mismo contrato.