[COMMITTED,PR,tree-optimization/107732,range-ops] Handle attempt to abs() negatives.

Message ID 20221117174449.825329-1-aldyh@redhat.com
State Committed
Commit 4e306222f442f8d4c6fc6da997ab756a5e43e36e
Headers
Series [COMMITTED,PR,tree-optimization/107732,range-ops] Handle attempt to abs() negatives. |

Commit Message

Aldy Hernandez Nov. 17, 2022, 5:44 p.m. UTC
  The threader is creating a scenario where we are trying to solve:

	[NEGATIVES] = abs(x)

While solving this we have an intermediate value of UNDEFINED because
we have no positive numbers.  But then we try to union the negative
pair to the final result by querying the bounds.  Since neither
UNDEFINED nor NAN have bounds, they need to be specially handled.

	PR tree-optimization/107732

gcc/ChangeLog:

	* range-op-float.cc (foperator_abs::op1_range): Early exit when
	result is undefined.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/pr107732.c: New test.
---
 gcc/range-op-float.cc                    |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr107732.c | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr107732.c
  

Patch

diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc
index adb0cbaa6d5..ee88511eba0 100644
--- a/gcc/range-op-float.cc
+++ b/gcc/range-op-float.cc
@@ -1407,7 +1407,7 @@  foperator_abs::op1_range (frange &r, tree type,
       neg_nan.set_nan (type, true);
       r.union_ (neg_nan);
     }
-  if (r.known_isnan ())
+  if (r.known_isnan () || r.undefined_p ())
     return true;
   // Then add the negative of each pair:
   // ABS(op1) = [5,20] would yield op1 => [-20,-5][5,20].
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr107732.c b/gcc/testsuite/gcc.dg/tree-ssa/pr107732.c
new file mode 100644
index 00000000000..b216f38db0e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr107732.c
@@ -0,0 +1,13 @@ 
+// { dg-do compile }
+// { dg-options "-O2" }
+
+double sqrt(double);
+double a, b, c;
+void d() {
+  for (;;) {
+    c = __builtin_fabs(a);
+    sqrt(c);
+    if (a)
+      a = b;
+  }
+}