> It'd be good to expand on this comment a bit.  What kind of COND are you
> anticipating?  A COND with the neutral op as the else value, so that the
> PLUS_EXPR (or whatever) can remain unconditional?  If so, it would be
> good to sketch briefly how that happens, and why it's better than using
> the conditional PLUS_EXPR.
> 
> If that's the reason, perhaps we want a single-use check as well.
> It's possible that OP1 is used elsewhere in the loop body, in a
> context that would prefer a different else value.

Would something like the following on top work?

-  /* If possible try to create an IFN_COND_ADD instead of a COND_EXPR and
-     a PLUS_EXPR.  Don't do this if the reduction def operand itself is
+  /* If possible create a COND_OP instead of a COND_EXPR and an OP_EXPR.
+     The COND_OP will have a neutral_op else value.
+
+     This allows re-using the mask directly in a masked reduction instead
+     of creating a vector merge (or similar) and then an unmasked reduction.
+
+     Don't do this if the reduction def operand itself is
      a vectorizable call as we can create a COND version of it directly.  */

   if (ifn != IFN_LAST
       && vectorized_internal_fn_supported_p (ifn, TREE_TYPE (lhs))
-      && try_cond_op && !swap)
+      && use_cond_op && !swap && has_single_use (op1))

Regards
 Robin

Reply via email to