[Bug middle-end/103406] [12 Regression] gcc -O0 behaves differently on "DBL_MAX related operations" than gcc -O1 and above
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Nov 24 13:02:06 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103406
--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
And the -nan vs. nan is because we fold x + -y to x - y:
/* We can't reassociate at all for saturating types. */
(if (!TYPE_SATURATING (type))
/* Contract negates. */
/* A + (-B) -> A - B */
(simplify
(plus:c @0 (convert? (negate @1)))
/* Apply STRIP_NOPS on the negate. */
(if (tree_nop_conversion_p (type, TREE_TYPE (@1))
&& !TYPE_OVERFLOW_SANITIZED (type))
(with
{
tree t1 = type;
if (INTEGRAL_TYPE_P (type)
&& TYPE_OVERFLOW_WRAPS (type) != TYPE_OVERFLOW_WRAPS (TREE_TYPE (@1)))
t1 = TYPE_OVERFLOW_WRAPS (type) ? type : TREE_TYPE (@1);
}
(convert (minus (convert:t1 @0) (convert:t1 @1))))))
all the negate contracting misses HONOR_SIGNED_ZEROS/HONOR_NANS checking?
Not sure if they are really a problem for signed zeros? If so we should
try to get a testcase for that as well.
diff --git a/gcc/match.pd b/gcc/match.pd
index 5adcd6bd02c..9cdd113e02c 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2471,7 +2473,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(plus:c @0 (convert? (negate @1)))
/* Apply STRIP_NOPS on the negate. */
(if (tree_nop_conversion_p (type, TREE_TYPE (@1))
- && !TYPE_OVERFLOW_SANITIZED (type))
+ && !TYPE_OVERFLOW_SANITIZED (type)
+ && (!FLOAT_TYPE_P (type) || !tree_expr_maybe_nan_p (@1)))
(with
{
tree t1 = type;
@@ -2484,7 +2487,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(minus @0 (convert? (negate @1)))
(if (tree_nop_conversion_p (type, TREE_TYPE (@1))
- && !TYPE_OVERFLOW_SANITIZED (type))
+ && !TYPE_OVERFLOW_SANITIZED (type)
+ && (!FLOAT_TYPE_P (type) || !tree_expr_maybe_nan_p (@1)))
(with
{
tree t1 = type;
btw, that doesn't fix it since combine will happily contract the negate as
well:
- 10: {r88:DF=-r83:DF;use r89:V2DF;clobber flags:CC;}
- REG_DEAD r89:V2DF
- REG_UNUSED flags:CC
- 11: r90:DF=r88:DF+r83:DF
- REG_DEAD r88:DF
+ 9: NOTE_INSN_DELETED
+ 10: NOTE_INSN_DELETED
+ 11: r90:DF=r83:DF-r83:DF
More information about the Gcc-bugs
mailing list