[Bug middle-end/67052] tree_single_nonnegative_warnv_p and fold_relational_const are inconsistent with NaNs
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Jul 30 11:16:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67052
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
This means that the ABS_EXPR<x> < 0 code is correct in simplifying
NaN < 0 to true and it is correct to _not_ simplify NaN >= 0 to true.
But at the same time it has to do the same as fold_relational_const and
preserve traps with -ftrapping-math for the ordered compares.
So the following patch should fix the inconsistency and avoid the wrong-code
issue in the ABS_EXPR<x> < 0 folding:
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c (revision 226387)
+++ gcc/fold-const.c (working copy)
@@ -11634,7 +11455,9 @@ fold_binary_loc (location_t loc,
/* Convert ABS_EXPR<x> < 0 to false. */
strict_overflow_p = false;
if (code == LT_EXPR
- && (integer_zerop (arg1) || real_zerop (arg1))
+ && (integer_zerop (arg1)
+ || ((! HONOR_NANS (arg0) || !flag_trapping_math)
+ && real_zerop (arg1)))
&& tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
{
if (strict_overflow_p)
More information about the Gcc-bugs
mailing list