On Tue, 1 Feb 2022, Jakub Jelinek wrote:

> 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.

Ah, OK.  Sure, pushing the stmt multiple times looks bogus and indeed
if we see we'll visit it a second time for a rhs{2,3} use there's
no point in pushing it in the first place.

> 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.

Yes, I think so.

> 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.

No, I think the change is fine with the second loop adjusted.

Thanks,
Richard.

Reply via email to