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