¿Qué tipo de optimizaciones se incluyen en -funsafe-math-optimizations?

¿Qué tipo de optimizaciones se incluyen en -funsafe-math-optimizations?


La página man de GCC establece que -funsafe-math-optimizations permite optimizaciones que "(a) asumen que los argumentos y los resultados son válidos y (b) pueden violar los estándares IEEE o ANSI", pero eso no es muy preciso, ¿verdad?


¿Cuál podría ser un argumento "no válido" en este caso? ¿NaN? ¿Infinitos? Subnormales? Números negativos hasta sqrt() ?


¿Hasta qué punto se permite que los resultados se desvíen de los estándares IEEE o ANSI? ¿Es "simplemente" cosas como la asociatividad de operaciones y el orden, o podría incluir, por ejemplo. comparaciones verdaderas con NaNs o comparaciones incorrectas con infinitos? ¿Se podría volver a redondear una variable almacenada después de haberla utilizado (de modo que, para variables x y y , (x == y) + (x == y) podría evaluar a 1)? Podría isinf() /isnan() dejar de funcionar?


¿Los desarrolladores de GCC siguen algún sistema o disciplina en particular con respecto a tales preguntas, o la respuesta podría diferir enormemente de una versión a otra?


Respuestas:


Según gcc.gnu.org (mi negrita ):



Eso incluye su mención del reordenamiento asociativo, así como "Funciones integradas [que] tienen nombres como __builtin_sqrt" se aplican cuando "pueden tener menos precisión o estar restringidos a un dominio más pequeño"