https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90248
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2019-04-25 Component|c++ |middle-end Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- We should simplify this to a = copysignf (1.0, a); I guess. Confirmed on trunk with a C testcase: int main() { float a = 0; __builtin_printf ("%f\n", a); a = (a > 0) ? 1.0 : -1.0; __builtin_printf ("%f\n", a); return 0; } And indeed .original already shows (but only with -ffinite-math-only because of a being possibly NaN). float a = 0.0; __builtin_printf ((const char *) "%f\n", (double) a); a = __builtin_copysignf (1.0e+0, a); __builtin_printf ((const char *) "%f\n", (double) a); wrong sign for the copysign transform for zero.