Message ID | 20151029134205.GA18424@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
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 --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