diff mbox

Fix c-c++-common/torture/vector-compare-1.c on powerpc

Message ID 20151029134205.GA18424@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich Oct. 29, 2015, 1:42 p.m. UTC
Hi,

This patches powerpc fails for c-c++-common/torture/vector-compare-1.c test.  The problem is that vector comparison lowering produces vector of 0s and 1s instead of 0s and -1s.  It doesn't matter if it usage is also lowered (like happens on ARM and i386 with -mno-sse) byt on powerpc we may have comparison of doubles be lowered but following VEC_COND_EXPR not lowered.  It causes wrong VEC_COND_EXPR result.  i checked this patch fixes the test.  Full regression testing on powerpc64le-unknown-linux-gnu is in progress.  OK if no regression?

Thanks,
Ilya
--
gcc/

2015-10-29  Ilya Enkovich  <enkovich.gnu@gmail.com>

	* tree-vect-generic.c (do_compare): Use -1 for true
	result instead of 1.

Comments

Richard Biener Oct. 29, 2015, 2:29 p.m. UTC | #1
On Thu, Oct 29, 2015 at 2:42 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> Hi,
>
> This patches powerpc fails for c-c++-common/torture/vector-compare-1.c test.  The problem is that vector comparison lowering produces vector of 0s and 1s instead of 0s and -1s.  It doesn't matter if it usage is also lowered (like happens on ARM and i386 with -mno-sse) byt on powerpc we may have comparison of doubles be lowered but following VEC_COND_EXPR not lowered.  It causes wrong VEC_COND_EXPR result.  i checked this patch fixes the test.  Full regression testing on powerpc64le-unknown-linux-gnu is in progress.  OK if no regression?
>
> Thanks,
> Ilya
> --
> gcc/
>
> 2015-10-29  Ilya Enkovich  <enkovich.gnu@gmail.com>
>
>         * tree-vect-generic.c (do_compare): Use -1 for true
>         result instead of 1.
>
>
> diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
> index d0a4e0f..0b60b15 100644
> --- a/gcc/tree-vect-generic.c
> +++ b/gcc/tree-vect-generic.c
> @@ -161,10 +161,27 @@ static tree
>  do_compare (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
>             tree bitpos, tree bitsize, enum tree_code code, tree type)
>  {
> +  tree stype = TREE_TYPE (type);
> +
>    a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
>    b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
>
> -  return gimplify_build2 (gsi, code, TREE_TYPE (type), a, b);
> +  if (TYPE_PRECISION (stype) > 1)
> +    {
> +      tree cst_false = build_zero_cst (stype);
> +      tree cst_true;
> +      tree cmp;
> +
> +      if (TYPE_UNSIGNED (stype))
> +       cst_true = TYPE_MAXVAL (stype);
> +      else
> +       cst_true = build_minus_one_cst (stype);
> +
> +      cmp = build2 (code, boolean_type_node, a, b);
> +      return gimplify_build3 (gsi, COND_EXPR, stype, cmp, cst_true, cst_false);
> +    }

I think this should unconditionally produce the COND_EXPR and
build cst_true using build_all_ones_cst (stype).

Ok with that change.

Thanks,
Richard.

> +
> +  return gimplify_build2 (gsi, code, stype, a, b);
>  }
>
>  /* Expand vector addition to scalars.  This does bit twiddling
diff mbox

Patch

diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index d0a4e0f..0b60b15 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -161,10 +161,27 @@  static tree
 do_compare (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
 	    tree bitpos, tree bitsize, enum tree_code code, tree type)
 {
+  tree stype = TREE_TYPE (type);
+
   a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
   b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
 
-  return gimplify_build2 (gsi, code, TREE_TYPE (type), a, b);
+  if (TYPE_PRECISION (stype) > 1)
+    {
+      tree cst_false = build_zero_cst (stype);
+      tree cst_true;
+      tree cmp;
+
+      if (TYPE_UNSIGNED (stype))
+	cst_true = TYPE_MAXVAL (stype);
+      else
+	cst_true = build_minus_one_cst (stype);
+
+      cmp = build2 (code, boolean_type_node, a, b);
+      return gimplify_build3 (gsi, COND_EXPR, stype, cmp, cst_true, cst_false);
+    }
+
+  return gimplify_build2 (gsi, code, stype, a, b);
 }
 
 /* Expand vector addition to scalars.  This does bit twiddling