On Tue, Dec 1, 2015 at 10:44 AM, Ilya Enkovich <[email protected]> wrote: > Hi, > > This patch fixes a way invariant boolean vector is generated. It makes sure > boolean vector consists of 0 and -1 values. Bootstrapped and tested on > x86_64-unknown-linux-gnu. OK for trunk?
Ok. Richard. > Thanks, > Ilya > -- > gcc/ > > 2015-12-01 Ilya Enkovich <[email protected]> > > PR middle-end/68595 > * tree-vect-stmts.c (vect_init_vector): Cast boolean > scalars to a proper value before building a vector. > > gcc/testsuite/ > > 2015-12-01 Ilya Enkovich <[email protected]> > > PR middle-end/68595 > * gcc.dg/pr68595.c: New test. > > > diff --git a/gcc/testsuite/gcc.dg/pr68595.c b/gcc/testsuite/gcc.dg/pr68595.c > new file mode 100644 > index 0000000..179c6c3 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr68595.c > @@ -0,0 +1,13 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3" } */ > + > +int a, b; > +char c; > +void fn1() { > + b = 30; > + for (; b <= 32; b++) { > + c = -17; > + for (; c <= 56; c++) > + a -= 0 == (c || b); > + } > +} > diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c > index 3b078da..5bb2289 100644 > --- a/gcc/tree-vect-stmts.c > +++ b/gcc/tree-vect-stmts.c > @@ -1300,7 +1300,25 @@ vect_init_vector (gimple *stmt, tree val, tree type, > gimple_stmt_iterator *gsi) > { > if (!types_compatible_p (TREE_TYPE (type), TREE_TYPE (val))) > { > - if (CONSTANT_CLASS_P (val)) > + /* Scalar boolean value should be transformed into > + all zeros or all ones value before building a vector. */ > + if (VECTOR_BOOLEAN_TYPE_P (type)) > + { > + tree true_val = build_zero_cst (TREE_TYPE (type)); > + tree false_val = build_all_ones_cst (TREE_TYPE (type)); > + > + if (CONSTANT_CLASS_P (val)) > + val = integer_zerop (val) ? false_val : true_val; > + else > + { > + new_temp = make_ssa_name (TREE_TYPE (type)); > + init_stmt = gimple_build_assign (new_temp, COND_EXPR, > + val, true_val, false_val); > + vect_init_vector_1 (stmt, init_stmt, gsi); > + val = new_temp; > + } > + } > + else if (CONSTANT_CLASS_P (val)) > val = fold_convert (TREE_TYPE (type), val); > else > {
