diff mbox series

PR middle-end/103406: Check for Inf before simplifying x-x.

Message ID 02cd01d7e1ef$b8b17570$2a146050$@nextmovesoftware.com
State New
Headers show
Series PR middle-end/103406: Check for Inf before simplifying x-x. | expand

Commit Message

Roger Sayle Nov. 25, 2021, 11:29 a.m. UTC
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.

This patch doesn't address the issue of NaN signedness from binary
arithmetic operations, just the regression.

This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
and make -k check with no new failures.  Ok for mainline?


2021-11-25  Roger Sayle  <roger@nextmovesoftware.com>

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.

Thanks in advance (and sorry for the inconvenience),
Roger
--

Comments

Richard Biener Nov. 25, 2021, 12:02 p.m. UTC | #1
On Thu, Nov 25, 2021 at 12:30 PM Roger Sayle <roger@nextmovesoftware.com> wrote:
>
>
> 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.
>
> This patch doesn't address the issue of NaN signedness from binary
> arithmetic operations, just the regression.
>
> This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
> and make -k check with no new failures.  Ok for mainline?

OK.

Thanks,
Richard.

>
> 2021-11-25  Roger Sayle  <roger@nextmovesoftware.com>
>
> 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.
>
> Thanks in advance (and sorry for the inconvenience),
> Roger
> --
>
diff mbox series

Patch

diff --git a/gcc/match.pd b/gcc/match.pd
index f059b47..d28dfe2 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -232,7 +232,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 0000000..9c7b83b
--- /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" } } */