public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4520] Ensure float equivalences include + and - zero.
@ 2023-10-09 17:10 Andrew Macleod
  0 siblings, 0 replies; only message in thread
From: Andrew Macleod @ 2023-10-09 17:10 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:b0892b1fc637fadf14d7016858983bc5776a1e69

commit r14-4520-gb0892b1fc637fadf14d7016858983bc5776a1e69
Author: Andrew MacLeod <amacleod@redhat.com>
Date:   Mon Oct 9 10:15:07 2023 -0400

    Ensure float equivalences include + and - zero.
    
    A floating point equivalence may not properly reflect both signs of
    zero, so be pessimsitic and ensure both signs are included.
    
            PR tree-optimization/111694
            gcc/
            * gimple-range-cache.cc (ranger_cache::fill_block_cache): Adjust
            equivalence range.
            * value-relation.cc (adjust_equivalence_range): New.
            * value-relation.h (adjust_equivalence_range): New prototype.
    
            gcc/testsuite/
            * gcc.dg/pr111694.c: New.

Diff:
---
 gcc/gimple-range-cache.cc       |  3 +++
 gcc/testsuite/gcc.dg/pr111694.c | 19 +++++++++++++++++++
 gcc/value-relation.cc           | 19 +++++++++++++++++++
 gcc/value-relation.h            |  3 +++
 4 files changed, 44 insertions(+)

diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index 3c819933c4e..89c0845457d 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -1470,6 +1470,9 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
 		{
 		  if (rel != VREL_EQ)
 		    range_cast (equiv_range, type);
+		  else
+		    adjust_equivalence_range (equiv_range);
+
 		  if (block_result.intersect (equiv_range))
 		    {
 		      if (DEBUG_RANGE_CACHE)
diff --git a/gcc/testsuite/gcc.dg/pr111694.c b/gcc/testsuite/gcc.dg/pr111694.c
new file mode 100644
index 00000000000..a70b03069dc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr111694.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/111009 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#define signbit(x) __builtin_signbit(x)
+
+static void test(double l, double r)
+{
+  if (l == r && (signbit(l) || signbit(r)))
+    ;
+  else
+    __builtin_abort();
+}
+
+int main()
+{
+  test(0.0, -0.0);
+}
+
diff --git a/gcc/value-relation.cc b/gcc/value-relation.cc
index a2ae39692a6..0326fe7cde6 100644
--- a/gcc/value-relation.cc
+++ b/gcc/value-relation.cc
@@ -183,6 +183,25 @@ relation_transitive (relation_kind r1, relation_kind r2)
   return relation_kind (rr_transitive_table[r1][r2]);
 }
 
+// When one name is an equivalence of another, ensure the equivalence
+// range is correct.  Specifically for floating point, a +0 is also
+// equivalent to a -0 which may not be reflected.  See PR 111694.
+
+void
+adjust_equivalence_range (vrange &range)
+{
+  if (range.undefined_p () || !is_a<frange> (range))
+    return;
+
+  frange fr = as_a<frange> (range);
+  // If range includes 0 make sure both signs of zero are included.
+  if (fr.contains_p (dconst0) || fr.contains_p (dconstm0))
+    {
+      frange zeros (range.type (), dconstm0, dconst0);
+      range.union_ (zeros);
+    }
+ }
+
 // This vector maps a relation to the equivalent tree code.
 
 static const tree_code relation_to_code [VREL_LAST] = {
diff --git a/gcc/value-relation.h b/gcc/value-relation.h
index be6e277421b..31d48908678 100644
--- a/gcc/value-relation.h
+++ b/gcc/value-relation.h
@@ -91,6 +91,9 @@ inline bool relation_equiv_p (relation_kind r)
 
 void print_relation (FILE *f, relation_kind rel);
 
+// Adjust range as an equivalence.
+void adjust_equivalence_range (vrange &range);
+
 class relation_oracle
 {
 public:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-09 17:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-09 17:10 [gcc r14-4520] Ensure float equivalences include + and - zero Andrew Macleod

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).