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....@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); + } + + return gimplify_build2 (gsi, code, stype, a, b); } /* Expand vector addition to scalars. This does bit twiddling