https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103948

--- Comment #6 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Richard Biener from comment #5)
> I guess that tree-vect-generic.c is not up-to-date with gimple-isel.cc.  We
> should probably somehow factor out relevant pieces.
> 
> Note vector lowering will see
> 
>   _1 = a_2(D) > b_3(D);
>   _4 = VEC_COND_EXPR <_1, { -1, -1 }, { 0, 0 }>;
> 
> and clearly a
> 
>   if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), code))
> 
> that's just type/code based cannot know expanding just a comparison will
> work fine.  It does look like expand_vector_condition from vector lowering
> needs
> some work.  Maybe the following works though:
> 
> diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
> index 6afb6999cd7..5814a71a5bb 100644
> --- a/gcc/tree-vect-generic.c
> +++ b/gcc/tree-vect-generic.c
> @@ -1052,7 +1052,9 @@ expand_vector_condition (gimple_stmt_iterator *gsi,
> bitmap dce_ssa_names)
>         }
>      }
>  
> -  if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), code))
> +  if (expand_vec_cond_expr_p (type, TREE_TYPE (a1), code)
> +      || (integer_all_onesp (b) && integer_zerop (c)
> +         && expand_vec_cmp_expr_p (type, TREE_TYPE (a1), code)))
>      {
>        gcc_assert (TREE_CODE (a) == SSA_NAME || TREE_CODE (a) == VECTOR_CST);
>        return true;
> 
> obviously missing would be the case
> cmp ? { 0, 0 } : { -1, -1 } via code inversion, not sure if we canonicalize
> that way already and not sure if expansion later will pick that up correctly.
> 
> A vector mode with just vec_cmp and not vcond will be good to have to cover
> all this with testcases ... ;)
> 
> If the above works it's pre-approved.

Using the patch from Comment #2, the following testcase from Comment #0 can be
used:

--cut here--
typedef signed char vec __attribute__((vector_size(2)));

vec lt (vec a, vec b) { return a < b; }
--cut here--

vectorizes with -msse4 and fails to vectorize with -msse2.

I'll try your proposed patch from Comment #5 later today and report here.

Reply via email to