From 4d1a05f13808cc12c09e71e6ca3951e878184bb2 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 10 Apr 2017 11:25:44 +0000 Subject: [PATCH] re PR target/79905 (ICE in canonical types differ for identical types __vector(4) int and V4i {aka __vector(4) int}) PR target/79905 * config/rs6000/rs6000.c (rs6000_vector_type): New. (rs6000_init_builtins): Use it. PR target/79905 * g++.dg/torture/pr79905.C: New. From-SVN: r246802 --- gcc/ChangeLog | 6 + gcc/config/rs6000/rs6000.c | 145 ++++++++++--------------- gcc/testsuite/ChangeLog | 5 + gcc/testsuite/g++.dg/torture/pr79905.C | 9 ++ 4 files changed, 75 insertions(+), 90 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr79905.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba40b098189..e763c42603a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-04-10 Nathan Sidwell + + PR target/79905 + * config/rs6000/rs6000.c (rs6000_vector_type): New. + (rs6000_init_builtins): Use it. + 2016-04-10 Kyrylo Tkachov * config/arm/arm.md (): Add mode to SET source. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 880c3eea1d8..7822a9d4566 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -17257,6 +17257,22 @@ rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, gcc_unreachable (); } +/* Create a builtin vector type with a name. Taking care not to give + the canonical type a name. */ + +static tree +rs6000_vector_type (const char *name, tree elt_type, unsigned num_elts) +{ + tree result = build_vector_type (elt_type, num_elts); + + /* Copy so we don't give the canonical type a name. */ + result = build_variant_type_copy (result); + + add_builtin_type (name, result); + + return result; +} + static void rs6000_init_builtins (void) { @@ -17273,18 +17289,29 @@ rs6000_init_builtins (void) V2SI_type_node = build_vector_type (intSI_type_node, 2); V2SF_type_node = build_vector_type (float_type_node, 2); - V2DI_type_node = build_vector_type (intDI_type_node, 2); - V2DF_type_node = build_vector_type (double_type_node, 2); + V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 ? "__vector long" + : "__vector long long", + intDI_type_node, 2); + V2DF_type_node = rs6000_vector_type ("__vector double", double_type_node, 2); V4HI_type_node = build_vector_type (intHI_type_node, 4); - V4SI_type_node = build_vector_type (intSI_type_node, 4); - V4SF_type_node = build_vector_type (float_type_node, 4); - V8HI_type_node = build_vector_type (intHI_type_node, 8); - V16QI_type_node = build_vector_type (intQI_type_node, 16); - - unsigned_V16QI_type_node = build_vector_type (unsigned_intQI_type_node, 16); - unsigned_V8HI_type_node = build_vector_type (unsigned_intHI_type_node, 8); - unsigned_V4SI_type_node = build_vector_type (unsigned_intSI_type_node, 4); - unsigned_V2DI_type_node = build_vector_type (unsigned_intDI_type_node, 2); + V4SI_type_node = rs6000_vector_type ("__vector signed int", + intSI_type_node, 4); + V4SF_type_node = rs6000_vector_type ("__vector float", float_type_node, 4); + V8HI_type_node = rs6000_vector_type ("__vector signed short", + intHI_type_node, 8); + V16QI_type_node = rs6000_vector_type ("__vector signed char", + intQI_type_node, 16); + + unsigned_V16QI_type_node = rs6000_vector_type ("__vector unsigned char", + unsigned_intQI_type_node, 16); + unsigned_V8HI_type_node = rs6000_vector_type ("__vector unsigned short", + unsigned_intHI_type_node, 8); + unsigned_V4SI_type_node = rs6000_vector_type ("__vector unsigned int", + unsigned_intSI_type_node, 4); + unsigned_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 + ? "__vector unsigned long" + : "__vector unsigned long long", + unsigned_intDI_type_node, 2); opaque_V2SF_type_node = build_opaque_vector_type (float_type_node, 2); opaque_V2SI_type_node = build_opaque_vector_type (intSI_type_node, 2); @@ -17299,8 +17326,11 @@ rs6000_init_builtins (void) must live in VSX registers. */ if (intTI_type_node) { - V1TI_type_node = build_vector_type (intTI_type_node, 1); - unsigned_V1TI_type_node = build_vector_type (unsigned_intTI_type_node, 1); + V1TI_type_node = rs6000_vector_type ("__vector __int128", + intTI_type_node, 1); + unsigned_V1TI_type_node + = rs6000_vector_type ("__vector unsigned __int128", + unsigned_intTI_type_node, 1); } /* The 'vector bool ...' types must be kept distinct from 'vector unsigned ...' @@ -17432,83 +17462,18 @@ rs6000_init_builtins (void) tdecl = add_builtin_type ("__pixel", pixel_type_node); TYPE_NAME (pixel_type_node) = tdecl; - bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16); - bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8); - bool_V4SI_type_node = build_vector_type (bool_int_type_node, 4); - bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2); - pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8); - - tdecl = add_builtin_type ("__vector unsigned char", unsigned_V16QI_type_node); - TYPE_NAME (unsigned_V16QI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector signed char", V16QI_type_node); - TYPE_NAME (V16QI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __bool char", bool_V16QI_type_node); - TYPE_NAME (bool_V16QI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector unsigned short", unsigned_V8HI_type_node); - TYPE_NAME (unsigned_V8HI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector signed short", V8HI_type_node); - TYPE_NAME (V8HI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __bool short", bool_V8HI_type_node); - TYPE_NAME (bool_V8HI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector unsigned int", unsigned_V4SI_type_node); - TYPE_NAME (unsigned_V4SI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector signed int", V4SI_type_node); - TYPE_NAME (V4SI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __bool int", bool_V4SI_type_node); - TYPE_NAME (bool_V4SI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector float", V4SF_type_node); - TYPE_NAME (V4SF_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __pixel", pixel_V8HI_type_node); - TYPE_NAME (pixel_V8HI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector double", V2DF_type_node); - TYPE_NAME (V2DF_type_node) = tdecl; - - if (TARGET_POWERPC64) - { - tdecl = add_builtin_type ("__vector long", V2DI_type_node); - TYPE_NAME (V2DI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector unsigned long", - unsigned_V2DI_type_node); - TYPE_NAME (unsigned_V2DI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __bool long", bool_V2DI_type_node); - TYPE_NAME (bool_V2DI_type_node) = tdecl; - } - else - { - tdecl = add_builtin_type ("__vector long long", V2DI_type_node); - TYPE_NAME (V2DI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector unsigned long long", - unsigned_V2DI_type_node); - TYPE_NAME (unsigned_V2DI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector __bool long long", - bool_V2DI_type_node); - TYPE_NAME (bool_V2DI_type_node) = tdecl; - } - - if (V1TI_type_node) - { - tdecl = add_builtin_type ("__vector __int128", V1TI_type_node); - TYPE_NAME (V1TI_type_node) = tdecl; - - tdecl = add_builtin_type ("__vector unsigned __int128", - unsigned_V1TI_type_node); - TYPE_NAME (unsigned_V1TI_type_node) = tdecl; - } + bool_V16QI_type_node = rs6000_vector_type ("__vector __bool char", + bool_char_type_node, 16); + bool_V8HI_type_node = rs6000_vector_type ("__vector __bool short", + bool_short_type_node, 8); + bool_V4SI_type_node = rs6000_vector_type ("__vector __bool int", + bool_int_type_node, 4); + bool_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 + ? "__vector __bool long" + : "__vector __bool long long", + bool_long_type_node, 2); + pixel_V8HI_type_node = rs6000_vector_type ("__vector __pixel", + pixel_type_node, 8); /* Paired and SPE builtins are only available if you build a compiler with the appropriate options, so only create those builtins with the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e6523ac41b..06ea8f75a9b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-10 Nathan Sidwell + + PR target/79905 + * g++.dg/torture/pr79905.C: New. + 2017-04-10 Martin Liska PR sanitizer/80350 diff --git a/gcc/testsuite/g++.dg/torture/pr79905.C b/gcc/testsuite/g++.dg/torture/pr79905.C new file mode 100644 index 00000000000..ded5db64cb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr79905.C @@ -0,0 +1,9 @@ +// PR target/79905 +// { dg-do compile { target { powerpc*-*-* } } } +// { dg-require-effective-target powerpc_altivec_ok } + +typedef int V4i __attribute__((vector_size(16))); +void a (V4i) { + vector int b; + a (b); +} -- 2.30.2