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.