re PR tree-optimization/29921 (internal compiler error: in set_lattice_value, at...
authorZdenek Dvorak <dvorakz@suse.cz>
Wed, 22 Nov 2006 23:11:15 +0000 (00:11 +0100)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 22 Nov 2006 23:11:15 +0000 (23:11 +0000)
PR tree-optimization/29921
* fold-const.c (operand_equal_p): Without HONOR_SIGNED_ZEROS, consider
signed and unsigned zero equal.

* gcc.dg/pr29921.c: New test.

From-SVN: r119102

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr29921.c [new file with mode: 0644]

index c6fdb9f..5bb0ce3 100644 (file)
@@ -1,3 +1,9 @@
+2006-11-23  Zdenek Dvorak <dvorakz@suse.cz>
+
+       PR tree-optimization/29921
+       * fold-const.c (operand_equal_p): Without HONOR_SIGNED_ZEROS, consider
+       signed and unsigned zero equal.
+
 2006-11-22  Peter Bergner  <bergner@vnet.ibm.com>
 
        * config/rs6000/rs6000.c (get_store_dest): New.
index cd7f1d9..b19b768 100644 (file)
@@ -2584,8 +2584,19 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
        return tree_int_cst_equal (arg0, arg1);
 
       case REAL_CST:
-       return REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
-                                     TREE_REAL_CST (arg1));
+       if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
+                                  TREE_REAL_CST (arg1)))
+         return 1;
+
+       
+       if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
+         {
+           /* If we do not distinguish between signed and unsigned zero,
+              consider them equal.  */
+           if (real_zerop (arg0) && real_zerop (arg1))
+             return 1;
+         }
+       return 0;
 
       case VECTOR_CST:
        {
index ff2a80d..f8dc647 100644 (file)
@@ -1,3 +1,8 @@
+2006-11-23  Zdenek Dvorak <dvorakz@suse.cz>
+
+       PR tree-optimization/29921
+       * gcc.dg/pr29921.c: New test.
+
 2006-11-22  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/29441
diff --git a/gcc/testsuite/gcc.dg/pr29921.c b/gcc/testsuite/gcc.dg/pr29921.c
new file mode 100644 (file)
index 0000000..7689f54
--- /dev/null
@@ -0,0 +1,20 @@
+/* With -ffast-math, the latice value for t changes from -0.0 to 0.0 in this
+   testcase.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+double test (int param)
+{
+  double a = 0.0, b = -1.0, t;
+  int i;
+
+  for (i = 0; i < 100; i++)
+    {
+      t = a * b;
+      if (param)
+       b = 2.0;
+    }
+
+  return t;
+}