From 6ea5fb3cc7f3cc9b731d72183c66c23543876f5a Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 25 Nov 2021 19:02:06 +0000 Subject: [PATCH] PR middle-end/103406: Check for Inf before simplifying x-x. This is a simple one line fix to the regression PR middle-end/103406, where x - x is being folded to 0.0 even when x is +Inf or -Inf. In GCC 11 and previously, we'd check whether the type honored NaNs (which implicitly covered the case where the type honors infinities), but my patch to test whether the operand could potentially be NaN failed to also check whether the operand could potentially be Inf. 2021-11-25 Roger Sayle gcc/ChangeLog PR middle-end/103406 * match.pd (minus @0 @0): Check tree_expr_maybe_infinite_p. gcc/testsuite/ChangeLog PR middle-end/103406 * gcc.dg/pr103406.c: New test case. --- gcc/match.pd | 4 +++- gcc/testsuite/gcc.dg/pr103406.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr103406.c diff --git a/gcc/match.pd b/gcc/match.pd index 39fd77ddc4a1..fbb5a5a1eeb9 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -233,7 +233,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) is volatile. */ (simplify (minus @0 @0) - (if (!FLOAT_TYPE_P (type) || !tree_expr_maybe_nan_p (@0)) + (if (!FLOAT_TYPE_P (type) + || (!tree_expr_maybe_nan_p (@0) + && !tree_expr_maybe_infinite_p (@0))) { build_zero_cst (type); })) (simplify (pointer_diff @@0 @0) diff --git a/gcc/testsuite/gcc.dg/pr103406.c b/gcc/testsuite/gcc.dg/pr103406.c new file mode 100644 index 000000000000..9c7b83b2e9ea --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr103406.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +#define HUGE __DBL_MAX__ +#define INF (HUGE + HUGE) +#define NAN (INF - INF) + +double foo() { + double x = -NAN; + double y = NAN; + return x + y; +} + +/* { dg-final { scan-tree-dump-not "return 0\.0" "optimized" } } */ -- 2.47.2