https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90248
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |NEW
CC| |pinskia at gcc dot gnu.org,
| |rguenth at gcc dot gnu.org
Known to work| |7.3.1
Known to fail| |8.1.0, 9.0
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
(for cmp (gt ge lt le)
outp (convert convert negate negate)
outn (negate negate convert convert)
/* Transform (X > 0.0 ? 1.0 : -1.0) into copysign(1, X). */
/* Transform (X >= 0.0 ? 1.0 : -1.0) into copysign(1, X). */
/* Transform (X < 0.0 ? 1.0 : -1.0) into copysign(1,-X). */
/* Transform (X <= 0.0 ? 1.0 : -1.0) into copysign(1,-X). */
(simplify
(cond (cmp @0 real_zerop) real_onep@1 real_minus_onep)
(if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (type)
&& types_match (type, TREE_TYPE (@0)))
(switch
(if (types_match (type, float_type_node))
(BUILT_IN_COPYSIGNF @1 (outp @0)))
(if (types_match (type, double_type_node))
(BUILT_IN_COPYSIGN @1 (outp @0)))
(if (types_match (type, long_double_type_node))
(BUILT_IN_COPYSIGNL @1 (outp @0))))))
looks like this one is the culprit. Similar suspicious symmetry with
/* Transform (X > 0.0 ? -1.0 : 1.0) into copysign(1,-X). */
/* Transform (X >= 0.0 ? -1.0 : 1.0) into copysign(1,-X). */
/* Transform (X < 0.0 ? -1.0 : 1.0) into copysign(1,X). */
/* Transform (X <= 0.0 ? -1.0 : 1.0) into copysign(1,X). */
(simplify
(cond (cmp @0 real_zerop) real_minus_onep real_onep@1)
(if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (type)
&& types_match (type, TREE_TYPE (@0)))
(switch
(if (types_match (type, float_type_node))
(BUILT_IN_COPYSIGNF @1 (outn @0)))
(if (types_match (type, double_type_node))
(BUILT_IN_COPYSIGN @1 (outn @0)))
(if (types_match (type, long_double_type_node))
(BUILT_IN_COPYSIGNL @1 (outn @0)))))))
caused by r249704