[gcc]
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Mon, 27 Nov 2017 19:45:56 +0000 (19:45 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Mon, 27 Nov 2017 19:45:56 +0000 (19:45 +0000)
2017-11-27  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR middle_end/82333
* varasm.c (compare_constant): Take the mode of the constants into
account when comparing floating point constants.

[gcc/testsuite]
2017-11-27  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR middle_end/82333
* gcc.target/powerpc/pr82333.c: New test.

From-SVN: r255177

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr82333.c [new file with mode: 0644]
gcc/varasm.c

index 0e6e5d091c3807c7ef69d8e1c9cd1adbc080ac42..10d5634b118857c6d32916411ff03af0f735cbca 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR middle_end/82333
+       * varasm.c (compare_constant): Take the mode of the constants into
+       account when comparing floating point constants.
+
 2017-11-27  Gerald Pfeifer  <gerald@pfeifer.com>
 
        * hash-set.h (DEFINE_DEBUG_HASH_SET): Remove static qualifier
index a52550985af4b74278fc9b83d60aeda0ef014066..bfcf7b19cdc8ec3079ebe6447b19ed97bdbf187b 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR middle_end/82333
+       * gcc.target/powerpc/pr82333.c: New test.
+
 2017-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/81675
diff --git a/gcc/testsuite/gcc.target/powerpc/pr82333.c b/gcc/testsuite/gcc.target/powerpc/pr82333.c
new file mode 100644 (file)
index 0000000..27154c4
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-require-effective-target ppc_float128_sw } */
+/* { dg-require-effective-target vsx_hw } */
+/* { dg-options "-mvsx -O2 -mabi=ibmlongdouble -Wno-psabi" } */
+
+/* PR 82333 was an internal compiler abort where the compiler thought that a
+   long double _Complex constant was the same as __float128 _Complex.  */
+
+_Complex long double vld;
+_Complex _Float128 vf128;
+
+_Complex long double
+fld (_Complex long double arg0)
+{
+  return 0;
+}
+
+_Complex _Float128
+ff128 (_Complex _Float128 arg0)
+{
+  return 0;
+}
+
+void
+tld (void)
+{
+  vld = fld (vld);
+}
+
+void
+tf128 (void)
+{
+  vf128 = ff128 (vf128);
+}
index ff912b7fa578b023cb908ff2da06f71434e340aa..0c7b26ebab747e871e180539bbe20c9b4dd4f1b4 100644 (file)
@@ -3118,10 +3118,16 @@ compare_constant (const tree t1, const tree t2)
       return tree_int_cst_equal (t1, t2);
 
     case REAL_CST:
-      /* Real constants are the same only if the same width of type.  */
+      /* Real constants are the same only if the same width of type.  In
+        addition to the same width, we need to check whether the modes are the
+        same.  There might be two floating point modes that are the same size
+        but have different representations, such as the PowerPC that has 2
+        different 128-bit floating point types (IBM extended double and IEEE
+        128-bit floating point).  */
       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
        return 0;
-
+      if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
+       return 0;
       return real_identical (&TREE_REAL_CST (t1), &TREE_REAL_CST (t2));
 
     case FIXED_CST: