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.