On Tue, Feb 01, 2022 at 10:29:03AM +0100, Richard Biener wrote:
> So I think it's all fine besides the handling of VEC_COND_EXPRs where
> the use is in rhs1 and rhs2 and/or rhs3 - I don't really understand
> your worry here but shouldn't the stmt end up on the vector at least
> once?  You can use gimple_assign_rhs1_ptr to see whether the

My worry is that
  FOR_EACH_IMM_USE_FAST (use_p, iterator, lhs)
    uses.safe_push (USE_STMT (use_p));
for a stmt with multiple uses of lhs pushes the same
stmt multiple times.
And then
      if (a_is_comparison)
        a = gimplify_build2 (gsi, code, type, a1, a2);
      a1 = gimplify_build2 (gsi, BIT_AND_EXPR, type, a, b);
      a2 = gimplify_build1 (gsi, BIT_NOT_EXPR, type, a);
      a2 = gimplify_build2 (gsi, BIT_AND_EXPR, type, a2, c);
      a = gimplify_build2 (gsi, BIT_IOR_EXPR, type, a1, a2);
      gimple_assign_set_rhs_from_tree (gsi, a);
      update_stmt (gsi_stmt (*gsi));
will modify it (though the above at least will not remove the
stmt and update it in place I think) and then it won't be
a VEC_COND_EXPR anymore.
To me the non-cond uses in VEC_COND_EXPR conceptually look like
any other unhandled uses that the second loop clears
vec_cond_expr_only on.  But I don't have a testcase, dunno if it is even
possible.

> use is the rhs1 use comparing that with USE_PTR IIRC.  Btw, if you
> never push VEC_COND_EXPRs with such double-use it's not necessary
> to check again in the second loop?

I was just trying to be extra cautious in case expand_vector_comparison
modifies some other stmts, but maybe it is just expand_vector_comparison
in veclower and no other function that modifies anything but the
current stmt (+ pushes some new preparation statements and follow-up
statements).
So perhaps indeed:
+  if (vec_cond_expr_only)
+    for (gimple *use : uses)
+      {
+       gimple_stmt_iterator it = gsi_for_stmt (use);
+       if (!expand_vector_condition (&it, dce_ssa_names))
+         {
+           vec_cond_expr_only = false;
+           break;
+         }
+      }
for the second loop is enough.

But sure, if you prefer all I can do:
   FOR_EACH_IMM_USE_FAST (use_p, iterator, lhs)
-    uses.safe_push (USE_STMT (use_p));
+    if (!is_gimple_debug (USE_STMT (use_p)))
+      uses.safe_push (USE_STMT (use_p));

and keep the rest for GCC 13.

        Jakub

Reply via email to