On Tue, 8 Jan 2019, Jakub Jelinek wrote: > Hi! > > As mentioned in the PR, if a VECTOR_CST is not VECTOR_CST_STEPPED_P, > it is sufficient to recurse just on all the encoded elt, because if > the vector has more elts than encoded, all the remaining ones are equal to > the last one. > But, if it is stepped, there is the possibility that while the penultimate > and last encoded elt could be zero or one, the first non-encoded one could > be two or minus one. > > The patch as committed is doing: > unsigned HOST_WIDE_INT nelts = vector_cst_encoded_nelts (expr); > if (VECTOR_CST_STEPPED_P (expr) > && !TYPE_VECTOR_SUBPARTS (TREE_TYPE (expr)).is_constant (&nelts)) > return false; > so if it is stepped, it updates nelts to the subparts count and thus > attempts to verify all elts rather than just the encoded ones. But that > fails because VECTOR_CST_ENCODED_ELT can't really access the non-encoded > ones. The following patch fixes it by using vector_cst_elt there instead, > for the encoded elt it just returns VECTOR_CST_ENCODED_ELT immediately and > for the next value it will likely fail the predicate. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. > 2019-01-08 Jelinek <ja...@redhat.com> > > PR middle-end/88758 > * tree.c (initializer_each_zero_or_onep) <case VECTOR_CST>: Use > vector_cst_elt instead of VECTOR_CST_ENCODED_ELT. > > --- gcc/tree.c.jj 2019-01-07 17:59:22.883951743 +0100 > +++ gcc/tree.c 2019-01-08 18:15:01.956087119 +0100 > @@ -11255,7 +11255,7 @@ initializer_each_zero_or_onep (const_tre > > for (unsigned int i = 0; i < nelts; ++i) > { > - tree elt = VECTOR_CST_ENCODED_ELT (expr, i); > + tree elt = vector_cst_elt (expr, i); > if (!initializer_each_zero_or_onep (elt)) > return false; > } > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)