aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2017-11-27 19:45:56 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2017-11-27 19:45:56 +0000
commit32c95bcae37789ad601e557249310d7fd4444c7b (patch)
tree38542748b2e3e88e19378ff65a0d1154384482c2 /gcc
parent0f42ffd7f7c416a0702de90d2b0b374e877dc33b (diff)
downloadgcc-32c95bcae37789ad601e557249310d7fd4444c7b.zip
gcc-32c95bcae37789ad601e557249310d7fd4444c7b.tar.gz
gcc-32c95bcae37789ad601e557249310d7fd4444c7b.tar.bz2
[gcc]
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr82333.c34
-rw-r--r--gcc/varasm.c10
4 files changed, 53 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e6e5d0..10d5634 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a525509..bfcf7b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..27154c4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr82333.c
@@ -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);
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index ff912b7..0c7b26e 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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: