Какие оптимизации включены в -funsafe-math-optimizations?

GCC справочная страница утверждает, что -funsafe-math-optimizations допускает оптимизацию: "(а) предположить, что аргументы и результаты действительны и (б) могут нарушать стандарты IEEE или ANSI", но это не очень точно, не так ли?

Что может быть "недействительным" аргументом в этом случае? NaNs? Бесконечностей? Subnormals? Отрицательные числа до sqrt()?

Насколько далеки результаты, позволяющие отклоняться от стандартов IEEE или ANSI? Это "просто", например, ассоциативность и упорядочение операций, или может включать, например. истинные сравнения с NaN или неправильные сравнения с бесконечными? Может ли измененная хранимая переменная быть повторно округлена после того, как она уже используется (для переменных x и y, (x == y) + (x == y) может быть оценено 1)? Не удалось isinf()/isnan() работать?

Разрабатывают ли разработчики GCC какую-либо конкретную систему или дисциплину в отношении таких вопросов или может ли ответ сильно отличаться от версии к версии?

Ответы

Ответ 1

Согласно gcc.gnu.org (мой жирный):

Этот режим позволяет оптимизировать, позволяющие произвольные преобразования и без гарантии точности. Он также не пытается сохранить знак нулей.

Это включает ваше упоминание о ассоциативном переупорядочении, а также "Встроенные функции [которые] имеют имена, такие как __builtin_sqrt", применяемые, когда они "могут иметь меньше точность или быть ограничена меньшей областью"