* [COMMITTED] [PR 106819] NANs can never be a singleton
@ 2022-09-03 15:36 Aldy Hernandez
0 siblings, 0 replies; only message in thread
From: Aldy Hernandez @ 2022-09-03 15:36 UTC (permalink / raw)
To: GCC patches; +Cc: Andrew MacLeod, Aldy Hernandez
Possible NANs can never be a singleton, so they will never be
propagated. This was the intent, and then the signed zero code crept
in, and was mistakenly checked before the NAN.
PR 106819
gcc/ChangeLog:
* value-range.cc (frange::singleton_p): Move NAN check to the top.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/pr106819.c: New test.
---
gcc/testsuite/gcc.dg/tree-ssa/pr106819.c | 24 ++++++++++++++++++++++++
gcc/value-range.cc | 9 ++++-----
2 files changed, 28 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr106819.c
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c b/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c
new file mode 100644
index 00000000000..1272d4b5805
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr106819.c
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-evrp-details" }
+
+static int isNaN(double x)
+{
+ return x != x;
+}
+
+static double opCmpProper(int lhs, double rhs)
+{
+ return lhs < rhs ? -1.0
+ : lhs > rhs ? 1.0
+ : lhs == rhs ? 0.0
+ : __builtin_nan("");
+}
+
+int main()
+{
+ if (!isNaN(opCmpProper(41, __builtin_nan(""))))
+ __builtin_abort();
+ return 0;
+}
+
+// { dg-final {scan-tree-dump-not "Folds to: 0.0" "evrp" } }
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 6fd6e3b745c..a1c29f7bd0b 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -632,6 +632,10 @@ frange::singleton_p (tree *result) const
{
if (m_kind == VR_RANGE && real_identical (&m_min, &m_max))
{
+ // Return false for any singleton that may be a NAN.
+ if (HONOR_NANS (m_type) && !get_nan ().no_p ())
+ return false;
+
// Return the appropriate zero if known.
if (HONOR_SIGNED_ZEROS (m_type) && zero_p ())
{
@@ -649,11 +653,6 @@ frange::singleton_p (tree *result) const
}
return false;
}
-
- // Return false for any singleton that may be a NAN.
- if (HONOR_NANS (m_type) && !get_nan ().no_p ())
- return false;
-
if (result)
*result = build_real (m_type, m_min);
return true;
--
2.37.1
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-09-03 15:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-03 15:36 [COMMITTED] [PR 106819] NANs can never be a singleton Aldy Hernandez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).