On Fri, 3 Jun 2016, Jakub Jelinek wrote: > On Tue, Jan 12, 2016 at 05:21:37PM +0300, Ilya Enkovich wrote: > > > --- gcc/tree-vect-slp.c.jj 2016-01-08 21:45:57.000000000 +0100 > > > +++ gcc/tree-vect-slp.c 2016-01-11 12:07:19.633366712 +0100 > > > @@ -2999,12 +2999,9 @@ vect_get_constant_vectors (tree op, slp_ > > > gimple *init_stmt; > > > if (VECTOR_BOOLEAN_TYPE_P (vector_type)) > > > { > > > - gcc_assert (fold_convertible_p (TREE_TYPE > > > (vector_type), > > > - op)); > > > + gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (op))); > > > init_stmt = gimple_build_assign (new_temp, > > > NOP_EXPR, op); > > > > In vect_init_vector we had to introduce COND_EXPR to choose between 0 and > > -1 for > > boolean vectors. Shouldn't we do similar in SLP? > > Apparently the answer to this is YES. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/6.2? > > 2016-06-03 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/71259 > * tree-vect-slp.c (vect_get_constant_vectors): For > VECTOR_BOOLEAN_TYPE_P, return all ones constant instead of > one for constant op, and use COND_EXPR for non-constant. > > * gcc.dg/vect/pr71259.c: New test. > > --- gcc/tree-vect-slp.c.jj 2016-05-24 10:56:02.000000000 +0200 > +++ gcc/tree-vect-slp.c 2016-06-03 17:01:12.740955935 +0200 > @@ -3056,7 +3056,7 @@ vect_get_constant_vectors (tree op, slp_ > if (integer_zerop (op)) > op = build_int_cst (TREE_TYPE (vector_type), 0); > else if (integer_onep (op)) > - op = build_int_cst (TREE_TYPE (vector_type), 1); > + op = build_all_ones_cst (TREE_TYPE (vector_type)); > else > gcc_unreachable (); > } > @@ -3071,8 +3071,14 @@ vect_get_constant_vectors (tree op, slp_ > gimple *init_stmt; > if (VECTOR_BOOLEAN_TYPE_P (vector_type)) > { > + tree true_val > + = build_all_ones_cst (TREE_TYPE (vector_type)); > + tree false_val > + = build_zero_cst (TREE_TYPE (vector_type)); > gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (op))); > - init_stmt = gimple_build_assign (new_temp, NOP_EXPR, op); > + init_stmt = gimple_build_assign (new_temp, COND_EXPR, > + op, true_val, > + false_val);
So this ends up generating { a ? -1 : 0, b ? -1 : 0, ... }. That might be less optimal than doing { a, b, ... } ? { -1, -1 ... } : { 0, 0, .. } though I'm not sure we can easily construct a "proper" vector boolean from _Bool values either. Thus the patch is ok. Thanks, Richard. > } > else > { > --- gcc/testsuite/gcc.dg/vect/pr71259.c.jj 2016-06-03 17:05:37.693475438 > +0200 > +++ gcc/testsuite/gcc.dg/vect/pr71259.c 2016-06-03 17:05:32.418544731 > +0200 > @@ -0,0 +1,28 @@ > +/* PR tree-optimization/71259 */ > +/* { dg-do run } */ > +/* { dg-options "-O3" } */ > +/* { dg-additional-options "-mavx" { target avx_runtime } } */ > + > +#include "tree-vect.h" > + > +long a, b[1][44][2]; > +long long c[44][17][2]; > + > +int > +main () > +{ > + int i, j, k; > + check_vect (); > + asm volatile ("" : : : "memory"); > + for (i = 0; i < 44; i++) > + for (j = 0; j < 17; j++) > + for (k = 0; k < 2; k++) > + c[i][j][k] = (30995740 >= *(k + *(j + *b)) != (a != 8)) - > 5105075050047261684; > + asm volatile ("" : : : "memory"); > + for (i = 0; i < 44; i++) > + for (j = 0; j < 17; j++) > + for (k = 0; k < 2; k++) > + if (c[i][j][k] != -5105075050047261684) > + __builtin_abort (); > + return 0; > +} > > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)