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

--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 16 Mar 2016, ienkovich at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70251
> 
> --- Comment #2 from Ilya Enkovich <ienkovich at gcc dot gnu.org> ---
> Here is a responsible match.pd pattern:
> 
> /* A + (B vcmp C ? 1 : 0) -> A - (B vcmp C), since vector comparisons
>    return all-1 or all-0 results.  */
> /* ??? We could instead convert all instances of the vec_cond to negate,
>    but that isn't necessarily a win on its own.  */
> (simplify
>  (plus:c @3 (view_convert? (vec_cond @0 integer_each_onep@1 integer_zerop@2)))
>  (if (VECTOR_TYPE_P (type)
>       && TYPE_VECTOR_SUBPARTS (type) == TYPE_VECTOR_SUBPARTS (TREE_TYPE (@0))
>       && (TYPE_MODE (TREE_TYPE (type))
>           == TYPE_MODE (TREE_TYPE (TREE_TYPE (@0)))))
>   (minus @3 (view_convert @0))))
> 
> I propose this patch:
> 
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 112deb3..7245ff4 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -1759,6 +1759,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>  (simplify
>   (plus:c @3 (view_convert? (vec_cond @0 integer_each_onep@1 
> integer_zerop@2)))
>   (if (VECTOR_TYPE_P (type)
> +      && VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (@0)))
>        && TYPE_VECTOR_SUBPARTS (type) == TYPE_VECTOR_SUBPARTS (TREE_TYPE (@0))
>        && (TYPE_MODE (TREE_TYPE (type))
>            == TYPE_MODE (TREE_TYPE (TREE_TYPE (@0)))))
> @@ -1768,6 +1769,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>  (simplify
>   (minus @3 (view_convert? (vec_cond @0 integer_each_onep@1 integer_zerop@2)))
>   (if (VECTOR_TYPE_P (type)
> +      && VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (@0)))
>        && TYPE_VECTOR_SUBPARTS (type) == TYPE_VECTOR_SUBPARTS (TREE_TYPE (@0))
>        && (TYPE_MODE (TREE_TYPE (type))
>            == TYPE_MODE (TREE_TYPE (TREE_TYPE (@0)))))

Looks good to me.

Reply via email to