Какие оптимизации включены в -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", применяемые, когда они "могут иметь меньше точность или быть ограничена меньшей областью"