From 32c95bcae37789ad601e557249310d7fd4444c7b Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Mon, 27 Nov 2017 19:45:56 +0000 Subject: [PATCH] [gcc] 2017-11-27 Michael Meissner 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 PR middle_end/82333 * gcc.target/powerpc/pr82333.c: New test. From-SVN: r255177 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/powerpc/pr82333.c | 34 ++++++++++++++++++++++ gcc/varasm.c | 10 +++++-- 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr82333.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e6e5d091c3..10d5634b118 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-11-27 Michael Meissner + + 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 * hash-set.h (DEFINE_DEBUG_HASH_SET): Remove static qualifier diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a52550985af..bfcf7b19cdc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-27 Michael Meissner + + PR middle_end/82333 + * gcc.target/powerpc/pr82333.c: New test. + 2017-11-27 Jakub Jelinek 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 00000000000..27154c49961 --- /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 ff912b7fa57..0c7b26ebab7 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: -- 2.30.2