diff mbox

[PR,middle-end/68595] Fix invariant boolean vector generation

Message ID 20151201094449.GA30663@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Dec. 1, 2015, 9:44 a.m. UTC
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?

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.

Comments

Richard Biener Dec. 1, 2015, 10:54 a.m. UTC | #1
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 mbox

Patch

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
 	    {