> Am 23.04.2022 um 01:58 schrieb Marek Polacek via Gcc-patches > <gcc-patches@gcc.gnu.org>: > > Here we issue an error from c_build_shufflevector while parsing a template > because it got a TEMPLATE_PARM_INDEX, but this function expects INTEGER_CSTs > (except the first two arguments). It checks if any of the arguments are > type-dependent, if so, we leave the processing for later, but it should > also check value-dependency for the 3rd+ arguments, so as to avoid the > problem above. > > This is not a regression -- __builtin_shufflevector was introduced in > GCC 12, but it looks safe enough. > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? Fine with me. Richard > PR c++/105353 > > gcc/cp/ChangeLog: > > * typeck.cc (build_x_shufflevector): Use > instantiation_dependent_expression_p except for the first two > arguments. > > gcc/testsuite/ChangeLog: > > * g++.dg/ext/builtin-shufflevector-3.C: New test. > --- > gcc/cp/typeck.cc | 4 +++- > .../g++.dg/ext/builtin-shufflevector-3.C | 23 +++++++++++++++++++ > 2 files changed, 26 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/ext/builtin-shufflevector-3.C > > diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc > index 26a7cb4b50d..0da6f2485d0 100644 > --- a/gcc/cp/typeck.cc > +++ b/gcc/cp/typeck.cc > @@ -6315,7 +6315,9 @@ build_x_shufflevector (location_t loc, vec<tree, va_gc> > *args, > if (processing_template_decl) > { > for (unsigned i = 0; i < args->length (); ++i) > - if (type_dependent_expression_p ((*args)[i])) > + if (i <= 1 > + ? type_dependent_expression_p ((*args)[i]) > + : instantiation_dependent_expression_p ((*args)[i])) > { > tree exp = build_min_nt_call_vec (NULL, args); > CALL_EXPR_IFN (exp) = IFN_SHUFFLEVECTOR; > diff --git a/gcc/testsuite/g++.dg/ext/builtin-shufflevector-3.C > b/gcc/testsuite/g++.dg/ext/builtin-shufflevector-3.C > new file mode 100644 > index 00000000000..0f3cbbee563 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ext/builtin-shufflevector-3.C > @@ -0,0 +1,23 @@ > +// PR c++/105353 > +// { dg-do compile { target c++17 } } > +// { dg-additional-options "-Wno-psabi" } > + > +typedef unsigned char Simd128U8VectT __attribute__((__vector_size__(16))); > + > +template<int ShuffleIndex> > +static inline Simd128U8VectT ShufFunc(Simd128U8VectT vect) noexcept { > + if constexpr(unsigned(ShuffleIndex) >= 16) > + return Simd128U8VectT { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > 0 }; > + else if constexpr(ShuffleIndex == 0) > + return vect; > + else > + return __builtin_shufflevector(vect, vect, ShuffleIndex, > ShuffleIndex + 1, > + ShuffleIndex + 2, ShuffleIndex + 3, ShuffleIndex + 4, > ShuffleIndex + 5, > + ShuffleIndex + 6, ShuffleIndex + 7, ShuffleIndex + 8, > ShuffleIndex + 9, > + ShuffleIndex + 10, ShuffleIndex + 11, ShuffleIndex + 12, > ShuffleIndex + 13, > + ShuffleIndex + 14, ShuffleIndex + 15); > +} > + > +auto func1(Simd128U8VectT vect) noexcept { > + return ShufFunc<5>(vect); > +} > > base-commit: 7c21556daf385fe9ece37319f574776dd7d8ab1c > -- > 2.35.1 >
Re: [PATCH] c++: __builtin_shufflevector with value-dep expr [PR105353]
Richard Biener via Gcc-patches Fri, 22 Apr 2022 23:26:11 -0700
- [PATCH] c++: __builtin_shufflevector with v... Marek Polacek via Gcc-patches
- Re: [PATCH] c++: __builtin_shufflevect... Richard Biener via Gcc-patches
- Re: [PATCH] c++: __builtin_shufflevect... Jakub Jelinek via Gcc-patches
- Re: [PATCH] c++: __builtin_shufflevect... Jason Merrill via Gcc-patches