Richard Biener <rguent...@suse.de> writes: > On Fri, 25 Sep 2020, Richard Sandiford wrote: > >> Richard Biener <rguent...@suse.de> writes: >> >> What do we allow for non-boolean constructors. E.g. for: >> >> >> >> v2hi = 0xf001; >> >> >> >> do we allow the CONSTRUCTOR to be { 0xf001 }? Is the type of an >> >> initialiser value allowed to be arbitrarily different from the type >> >> of the elements being initialised? >> >> >> >> Or is there requirement that (say) each constructor element is either: >> >> >> >> - a scalar that initialises one element of the constructed vector >> >> - a vector of N elements that initialises N elements of the constructed >> >> vector >> >> >> >> ? >> >> >> >> Like you say, it mostly seems like guesswork how booleans would be >> >> handled here, but personally I don't know the answer for non-booleans >> >> either :-) >> > >> > There's extensive checking in tree-cfg.c for vector CTORs meanwhile. >> > We only supporm uniform element CTORs with only trailing zeros elided. >> > And the elements need to either have types of the vector component >> > or be vectors with such component. >> >> Ah, great. So in that case, could we ditch bitsize altogether and >> just use: >> >> unsigned int nelts = (VECTOR_TYPE_P (val_type) >> ? TYPE_VECTOR_SUBPARTS (val_type).to_constant () : 1); >> >> or equivalent to work out the number of elements being initialised >> by each constructor element? > > But > > store_constructor_field (target, bitsize, bitpos, 0, > bitregion_end, value_mode, > value, cleared, alias, reverse); > > still wants the bits to initialize (for the original testcase > the vector<bool:1> had only the first 4 elements initialized, > at wrong bit positions and sizes - QImode). > > But yes, I'm sure we can eventually simplify this further. > FYI, the following passed bootstrap, regtest is still running > (but as said, test coverage dropped to zero).
LGTM FWIW. Thanks, Richard > > Richard. > > commit d16b5975ca985cbe97698479fc38b6a636886978 > Author: Richard Biener <rguent...@suse.de> > Date: Fri Sep 25 11:13:13 2020 +0200 > > middle-end/96814 - fix VECTOR_BOOLEAN_TYPE_P CTOR RTL expansion > > The RTL expansion code for CTORs doesn't handle VECTOR_BOOLEAN_TYPE_P > with bit-precision elements correctly as the testcase shows before > the PR97085 fix. The following makes it do the correct thing > (not 100% sure for CTOR of sub-vectors due to the lack of a testcase). > > The alternative would be to assert such CTORs do not happen (and also > add IL verification for this). > > The GIMPLE FE needs a way to declare the VECTOR_BOOLEAN_TYPE_P vectors > (thus the C FE needs that). > > 2020-09-25 Richard Biener <rguent...@suse.de> > > PR middle-end/96814 > * expr.c (store_constructor): Handle VECTOR_BOOLEAN_TYPE_P > CTORs correctly. > > * gcc.target/i386/pr96814.c: New testcase. > > diff --git a/gcc/expr.c b/gcc/expr.c > index 1a15f24b397..1c79518ee4d 100644 > --- a/gcc/expr.c > +++ b/gcc/expr.c > @@ -6922,7 +6922,7 @@ store_constructor (tree exp, rtx target, int cleared, > poly_int64 size, > insn_code icode = CODE_FOR_nothing; > tree elt; > tree elttype = TREE_TYPE (type); > - int elt_size = tree_to_uhwi (TYPE_SIZE (elttype)); > + int elt_size = vector_element_bits (type); > machine_mode eltmode = TYPE_MODE (elttype); > HOST_WIDE_INT bitsize; > HOST_WIDE_INT bitpos; > @@ -6987,6 +6987,15 @@ store_constructor (tree exp, rtx target, int cleared, > poly_int64 size, > } > } > > + /* Compute the size of the elements in the CTOR. It differs > + from the size of the vector type elements only when the > + CTOR elements are vectors themselves. */ > + tree val_type = TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value); > + if (VECTOR_TYPE_P (val_type)) > + bitsize = tree_to_uhwi (TYPE_SIZE (val_type)); > + else > + bitsize = elt_size; > + > /* If the constructor has fewer elements than the vector, > clear the whole array first. Similarly if this is static > constructor of a non-BLKmode object. */ > @@ -7001,11 +7010,7 @@ store_constructor (tree exp, rtx target, int cleared, > poly_int64 size, > > FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) > { > - tree sz = TYPE_SIZE (TREE_TYPE (value)); > - int n_elts_here > - = tree_to_uhwi (int_const_binop (TRUNC_DIV_EXPR, sz, > - TYPE_SIZE (elttype))); > - > + int n_elts_here = bitsize / elt_size; > count += n_elts_here; > if (mostly_zeros_p (value)) > zero_count += n_elts_here; > @@ -7045,7 +7050,6 @@ store_constructor (tree exp, rtx target, int cleared, > poly_int64 size, > HOST_WIDE_INT eltpos; > tree value = ce->value; > > - bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (value))); > if (cleared && initializer_zerop (value)) > continue; > > diff --git a/gcc/testsuite/gcc.target/i386/pr96814.c > b/gcc/testsuite/gcc.target/i386/pr96814.c > new file mode 100644 > index 00000000000..b280c737130 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr96814.c > @@ -0,0 +1,19 @@ > +/* { dg-do run } */ > +/* { dg-options "-mavx512vl -mavx512bw" } */ > +/* { dg-require-effective-target avx512bw } */ > +/* { dg-require-effective-target avx512vl } */ > + > +typedef unsigned char __attribute__ ((__vector_size__ (32))) V; > + > +void > +test (void) > +{ > + V x = ((V){8} > 0) == 0; > + for (unsigned i = 0; i < sizeof (x); i++) > + if (x[i] != (i ? 0xff : 0)) __builtin_abort(); > +} > + > +#define DO_TEST test > +#define AVX512VL > +#define AVX512BW > +#include "avx512-check.h"