On Wed, Aug 26, 2015 at 03:21:52PM +0200, Richard Biener wrote: > On Wed, Aug 26, 2015 at 3:16 PM, Jakub Jelinek <ja...@redhat.com> wrote: > > On Wed, Aug 26, 2015 at 03:02:02PM +0200, Richard Biener wrote: > >> > AVX-512 is such target. Current representation forces multiple scalar > >> > mask -> vector mask and back transformations which are artificially > >> > introduced by current bool patterns and are hard to optimize out. > >> > >> I dislike the bool patterns anyway and we should try to remove those > >> and make the vectorizer handle them in other ways (they have single-use > >> issues anyway). I don't remember exactly what caused us to add them > >> but one reason was there wasn't a vector type for 'bool' (but I don't see > >> how > >> it should be necessary to ask "get me a vector type for 'bool'"). > > > > That was just one of the reasons. The other reason is that even if we would > > choose some vector of integer type as vector of bool, the question is what > > type. E.g. if you use vector of chars, you almost always get terrible > > vectorized code, except for the AVX-512 you really want an integral type > > that has the size of the types you are comparing. > > Yeah, but the way STMT_VINFO_VECTYPE is computed is that we always > first compute the vector type for the comparison itself (which is "fixed") and > thus we can compute the vector type of any bitwise op on it as well.
Sure, but if you then immediately vector narrow it to a V*QI vector because it is stored originally into a bool/_Bool variable, and then again when it is used in say a COND_EXPR widen it again, you get really poor code. So, what the bool pattern code does is kind of poor man's type promotion/demotion pass for bool only, at least for the common cases. PR50596 has been the primary reason to introduce the bool patterns. If there is a better type promotion/demotion pass on a copy of the loop, sure, we can get rid of it (but figure out also what to do for SLP). Jakub