Index: gcc/varasm.c =================================================================== --- gcc/varasm.c (revision 254556) +++ gcc/varasm.c (working copy) @@ -3118,10 +3118,16 @@ compare_constant (const tree t1, const t 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: Index: gcc/testsuite/gcc.target/powerpc/pr82333.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/pr82333.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/pr82333.c (revision 0) @@ -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); +}