Message ID | 20151201094449.GA30663@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
On Tue, Dec 1, 2015 at 10:44 AM, Ilya Enkovich <enkovich.gnu@gmail.com> 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 <enkovich.gnu@gmail.com> > > 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 <enkovich.gnu@gmail.com> > > 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 > {
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 {