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

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #5)
> (In reply to Jakub Jelinek from comment #4)
> > I'd add this regressed with r229128, and indeed before that change reassoc
> > has been able to optimize the comparisons, but now it is not.  So, either we
> > defer the creation of vec_cond_expr until later time, or need to teach at
> > least reassoc pass about COND_EXPRs and VEC_COND_EXPRs.
> 
> More than that, vec_cond_expr for non x86_64 AVX targets here is useless and
> makes it harder to optimize otherwise.
> 
> Why again do we need the vec_cond_expr for those expressions again?

The same reason you need a conversion to do int i = a < b; in gimple.
Comparisons have a boolean type.

Btw, the patch from comment #1 would also help

int f(int x, int y)
{
 return (x<y?-1:0) | (x==y?-1:0);
}

thus code with COND_EXPRs.  Ok, that gets gimplified to if-then-else and
we don't optimize that either.

The allowed constants / bit operations can be extended to more cases as well I
guess.

Index: gcc/gimplify.c
===================================================================
--- gcc/gimplify.c      (revision 232261)
+++ gcc/gimplify.c      (working copy)
@@ -10723,8 +10723,22 @@ gimplify_expr (tree *expr_p, gimple_seq
            goto expr_2;
          }

-       case FMA_EXPR:
        case VEC_COND_EXPR:
+         {
+           enum gimplify_status r0, r1, r2;
+
+           r0 = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
+                               post_p, is_gimple_condexpr, fb_rvalue);
+           r1 = gimplify_expr (&TREE_OPERAND (*expr_p, 1), pre_p,
+                               post_p, is_gimple_val, fb_rvalue);
+           r2 = gimplify_expr (&TREE_OPERAND (*expr_p, 2), pre_p,
+                               post_p, is_gimple_val, fb_rvalue);
+
+           ret = MIN (MIN (r0, r1), r2);
+           break;
+         }
+
+       case FMA_EXPR:
        case VEC_PERM_EXPR:
          /* Classified as tcc_expression.  */
          goto expr_3;

helps gimplification to keep the condition inside the VEC_COND_EXPR:

f (vec x, vec y)
{
  vec D.1765;
  vector(4) int D.1766;
  vector(4) int D.1767;

  D.1766 = VEC_COND_EXPR <x < y, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>;
  D.1767 = VEC_COND_EXPR <x == y, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>;
  D.1765 = D.1766 | D.1767;
  return D.1765;
}

forwprop is also supposed to re-store this.

Reply via email to