This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix for PR67896 (C++ FE cannot distinguish __Poly{8,16,64,128}_t types)


Hi,

aarch64-builtins.c defines several SIMD builtin types. Among these
SIMD types there are the polynomials __Poly{8,16,64,128}_t. These are
built by a call to build_distinct_type_copy
(unsigned_int{Q,H,D,T}I_type_node), respectively, i.e. they are not
VECTOR_TYPEs. A later loop, traverses an array containing all the SIMD
types and skips those types for which a VECTOR_TYPE does not have to
be built: this is, types __Poly{8,16,64,128}_t. That same loop does
SET_TYPE_STRUCTURAL_EQUALITY on the newly created vector type, but it
does this unconditionally, thus setting TYPE_CANONICAL of types
__Poly{8,16,64,128}_t to NULL.

The net effect of this is that the C++ FE is unable to distinguish
between all __Poly{8,16,64,128}_t and between vector types with the
same number of elements but different polynomial type as element type
(like __Poly8x8_t vs __Poly16x8_t). Note that sizeof (correctly)
returns different values for all these types. This patch simply
protects SET_TYPE_STRUCTURAL_EQUALITY inside the branch that creates
the vector type.

I have bootstrapped and regression tested this on a small board
aarch64-unknown-linux-gnu host without new regressions.

P.S.: I haven't signed the copyright assignment to the FSF. The change
is really small but I can do the paperwork if required.

Kind regards,

gcc/ChangeLog:

2016-01-19 Roger Ferrer IbÃÃez <rofirrim@gmail.com>

        PR aarch64/67896
        * aarch64-builtins.c (aarch64_init_simd_builtin_types): Do not set
        structural equality to __Poly{8,16,64,128}_t types

gcc/testsuite/ChangeLog:

2016-01-19 Roger Ferrer IbÃÃez <rofirrim@gmail.com>

        PR aarch64/67896
        * pr67896.C: New test

-- 
Roger Ferrer IbÃÃez
From 22edde54bcc50fc41a8195d84d278bd1a1dfeb13 Mon Sep 17 00:00:00 2001
From: Roger Ferrer Ibanez <roger.ferrer@bsc.es>
Date: Thu, 14 Jan 2016 21:54:56 +0100
Subject: [PATCH] Do not mark polynomial types as requiring structural equality

---
 gcc/config/aarch64/aarch64-builtins.c           | 8 +++++---
 gcc/testsuite/gcc.target/aarch64/simd/pr67896.C | 7 +++++++
 2 files changed, 12 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/simd/pr67896.C

diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index bd7a8dd..edacf10 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -610,14 +610,16 @@ aarch64_init_simd_builtin_types (void)
       enum machine_mode mode = aarch64_simd_types[i].mode;
 
       if (aarch64_simd_types[i].itype == NULL)
-	aarch64_simd_types[i].itype =
-	  build_distinct_type_copy
+	{
+	  aarch64_simd_types[i].itype =
+	    build_distinct_type_copy
 	    (build_vector_type (eltype, GET_MODE_NUNITS (mode)));
+	  SET_TYPE_STRUCTURAL_EQUALITY (aarch64_simd_types[i].itype);
+	}
 
       tdecl = add_builtin_type (aarch64_simd_types[i].name,
 				aarch64_simd_types[i].itype);
       TYPE_NAME (aarch64_simd_types[i].itype) = tdecl;
-      SET_TYPE_STRUCTURAL_EQUALITY (aarch64_simd_types[i].itype);
     }
 
 #define AARCH64_BUILD_SIGNED_TYPE(mode)  \
diff --git a/gcc/testsuite/gcc.target/aarch64/simd/pr67896.C b/gcc/testsuite/gcc.target/aarch64/simd/pr67896.C
new file mode 100644
index 0000000..1f916e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/simd/pr67896.C
@@ -0,0 +1,7 @@
+typedef __Poly8_t A;
+typedef __Poly16_t A; /* { dg-error "conflicting declaration" } */
+typedef __Poly64_t A; /* { dg-error "conflicting declaration" } */
+typedef __Poly128_t A; /* { dg-error "conflicting declaration" } */
+
+typedef __Poly8x8_t B;
+typedef __Poly16x8_t B; /* { dg-error "conflicting declaration" } */ 
-- 
2.1.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]