On Fri, 17 Nov 2023, Jakub Jelinek wrote: > On Thu, Nov 16, 2023 at 11:49:03PM +0000, Joseph Myers wrote: > > > > While filing a clang request to return 18 on _BitInts for > > > > __builtin_classify_type instead of -1 they return currently, I've > > > > noticed that we return -1 for vector types. I'm not convinced it is a > > > > good > > > > idea to change behavior of __builtin_classify_type (vector_expression) > > > > after 22 years it behaved one way (returned -1), but the > > > > __builtin_classify_type (type) form is a new extension added for GCC 14, > > > > so this patch returns 19 for vectors just in that second form. Many > > > > other > > > > return values are only accessible from the second form as well (mostly > > > > because > > > > of argument promotions), so I think it is fine like that. > > > > > > > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > > > > > The C++ changes are OK (and obvious). I'm skeptical of the choice to keep > > > returning -1 for the expression form, it seems more likely to cause > > > problems > > > (due to it disagreeing with the type form) than changing it (due to old > > > code > > > somehow relying on -1?). But people who are more familiar with the use of > > > __builtin_classify_type should make the call. > > > > I'm also doubtful of keeping returning -1 for vectors in expression form > > (I'd be surprised if people are actually using __builtin_classify_type > > with vectors). The C changes are OK (but the front-end changes wouldn't > > be needed at all if the vector and type argument cases aren't > > distinguished). > > Given that you've both agreed that you think changing > __builtin_classify_type (vector_expr) is ok (hopefully in the wild people > test bct against known values rather than pretending to know what the > unknown -1 means because it can mean multiple type kinds), here is a simpler > patch which changes it even for that. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Do we have to adjust any of our documentation for this? > 2023-11-17 Jakub Jelinek <ja...@redhat.com> > > gcc/ > * typeclass.h (enum type_class): Add vector_type_class. > * builtins.cc (type_to_class): Return vector_type_class for > VECTOR_TYPE. > gcc/testsuite/ > * c-c++-common/builtin-classify-type-1.c (main): Add tests for vector > types. > > --- gcc/typeclass.h.jj 2023-09-06 17:28:24.238977355 +0200 > +++ gcc/typeclass.h 2023-11-10 10:50:59.519007647 +0100 > @@ -38,7 +38,7 @@ enum type_class > record_type_class, union_type_class, > array_type_class, string_type_class, > lang_type_class, opaque_type_class, > - bitint_type_class > + bitint_type_class, vector_type_class > }; > > #endif /* GCC_TYPECLASS_H */ > --- gcc/builtins.cc.jj 2023-11-09 09:17:40.230182483 +0100 > +++ gcc/builtins.cc 2023-11-10 11:19:29.669129855 +0100 > @@ -1859,6 +1859,7 @@ type_to_class (tree type) > case LANG_TYPE: return lang_type_class; > case OPAQUE_TYPE: return opaque_type_class; > case BITINT_TYPE: return bitint_type_class; > + case VECTOR_TYPE: return vector_type_class; > default: return no_type_class; > } > } > --- gcc/testsuite/c-c++-common/builtin-classify-type-1.c.jj 2023-09-26 > 09:25:30.019599039 +0200 > +++ gcc/testsuite/c-c++-common/builtin-classify-type-1.c 2023-11-10 > 11:02:01.927776922 +0100 > @@ -22,6 +22,10 @@ main () > const char *p = (const char *) 0; > float f = 0.0; > _Complex double c = 0.0; > + typedef int VI __attribute__((vector_size (4 * sizeof (int)))); > + typedef float VF __attribute__((vector_size (4 * sizeof (int)))); > + VI vi = { 0, 0, 0, 0 }; > + VF vf = { 0.0f, 0.0f, 0.0f, 0.0f }; > #ifdef __cplusplus > struct T { void foo (); }; > int &r = a[0]; > @@ -43,6 +47,8 @@ main () > static_assert (__builtin_classify_type (struct S) == 12, ""); > static_assert (__builtin_classify_type (union U) == 13, ""); > static_assert (__builtin_classify_type (int [2]) == 14, ""); > + static_assert (__builtin_classify_type (VI) == 19, ""); > + static_assert (__builtin_classify_type (VF) == 19, ""); > static_assert (__builtin_classify_type (__typeof__ (a[0])) == 1, ""); > static_assert (__builtin_classify_type (__typeof__ (e)) == 3, ""); > static_assert (__builtin_classify_type (__typeof__ (b)) == 4, ""); > @@ -57,6 +63,8 @@ main () > static_assert (__builtin_classify_type (__typeof__ (s)) == 12, ""); > static_assert (__builtin_classify_type (__typeof__ (u)) == 13, ""); > static_assert (__builtin_classify_type (__typeof__ (a)) == 14, ""); > + static_assert (__builtin_classify_type (__typeof__ (vi)) == 19, ""); > + static_assert (__builtin_classify_type (__typeof__ (vf)) == 19, ""); > #ifndef __cplusplus > static_assert (__builtin_classify_type (a[0]) == 1, ""); > static_assert (__builtin_classify_type (e) == 1, ""); > @@ -102,4 +110,8 @@ main () > abort (); > if (__builtin_classify_type (a) != 5) > abort (); > + if (__builtin_classify_type (vi) != 19) > + abort (); > + if (__builtin_classify_type (vf) != 19) > + abort (); > } > > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)