On Tue, Nov 5, 2024 at 12:12 PM Martin Jambor <mjam...@suse.cz> wrote: > > Hi, > > the next patch in the series introduces a verifier that prints a > single jump function when it fails with the function introduced in > this one. Because it is a verifier, the risk that it would need to e > reverted are non-zero and because the function can be useful on its > own, this is a special patch to introduce it. > > Bootstrapped and tested on x86_64-linux, the whole patch series has > additionally passed LTO and profiled-LTO bootstrap on the same platform > and a bootstrap and testsuite on ppc64-linux. Aarch64-linux bootstrap > and testing is in progress. OK for master is that passes too?
OK. Richard. > Thanks, > > Martin > > > gcc/ChangeLog: > > 2024-11-01 Martin Jambor <mjam...@suse.cz> > > * ipa-prop.h (ipa_dump_jump_function): Declare. > * ipa-prop.cc (ipa_dump_jump_function): New function. > (ipa_print_node_jump_functions_for_edge): Move printing of > individual jump functions to the new function. > --- > gcc/ipa-prop.cc | 221 +++++++++++++++++++++++++----------------------- > gcc/ipa-prop.h | 2 + > 2 files changed, 116 insertions(+), 107 deletions(-) > > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index 3b24bcbed15..3ff4753653b 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -429,6 +429,117 @@ ipa_print_constant_value (FILE *f, tree val) > } > } > > +/* Print contents of JFUNC to F. If CTX is non-NULL, dump it too. */ > + > +DEBUG_FUNCTION void > +ipa_dump_jump_function (FILE *f, ipa_jump_func *jump_func, > + class ipa_polymorphic_call_context *ctx) > +{ > + enum jump_func_type type = jump_func->type; > + > + if (type == IPA_JF_UNKNOWN) > + fprintf (f, "UNKNOWN\n"); > + else if (type == IPA_JF_CONST) > + { > + fprintf (f, "CONST: "); > + ipa_print_constant_value (f, jump_func->value.constant.value); > + fprintf (f, "\n"); > + } > + else if (type == IPA_JF_PASS_THROUGH) > + { > + fprintf (f, "PASS THROUGH: "); > + fprintf (f, "%d, op %s", > + jump_func->value.pass_through.formal_id, > + get_tree_code_name(jump_func->value.pass_through.operation)); > + if (jump_func->value.pass_through.operation != NOP_EXPR) > + { > + fprintf (f, " "); > + print_generic_expr (f, jump_func->value.pass_through.operand); > + } > + if (jump_func->value.pass_through.agg_preserved) > + fprintf (f, ", agg_preserved"); > + if (jump_func->value.pass_through.refdesc_decremented) > + fprintf (f, ", refdesc_decremented"); > + fprintf (f, "\n"); > + } > + else if (type == IPA_JF_ANCESTOR) > + { > + fprintf (f, "ANCESTOR: "); > + fprintf (f, "%d, offset " HOST_WIDE_INT_PRINT_DEC, > + jump_func->value.ancestor.formal_id, > + jump_func->value.ancestor.offset); > + if (jump_func->value.ancestor.agg_preserved) > + fprintf (f, ", agg_preserved"); > + if (jump_func->value.ancestor.keep_null) > + fprintf (f, ", keep_null"); > + fprintf (f, "\n"); > + } > + > + if (jump_func->agg.items) > + { > + struct ipa_agg_jf_item *item; > + int j; > + > + fprintf (f, " Aggregate passed by %s:\n", > + jump_func->agg.by_ref ? "reference" : "value"); > + FOR_EACH_VEC_ELT (*jump_func->agg.items, j, item) > + { > + fprintf (f, " offset: " HOST_WIDE_INT_PRINT_DEC ", ", > + item->offset); > + fprintf (f, "type: "); > + print_generic_expr (f, item->type); > + fprintf (f, ", "); > + if (item->jftype == IPA_JF_PASS_THROUGH) > + fprintf (f, "PASS THROUGH: %d,", > + item->value.pass_through.formal_id); > + else if (item->jftype == IPA_JF_LOAD_AGG) > + { > + fprintf (f, "LOAD AGG: %d", > + item->value.pass_through.formal_id); > + fprintf (f, " [offset: " HOST_WIDE_INT_PRINT_DEC ", by %s],", > + item->value.load_agg.offset, > + item->value.load_agg.by_ref ? "reference" > + : "value"); > + } > + > + if (item->jftype == IPA_JF_PASS_THROUGH > + || item->jftype == IPA_JF_LOAD_AGG) > + { > + fprintf (f, " op %s", > + get_tree_code_name > (item->value.pass_through.operation)); > + if (item->value.pass_through.operation != NOP_EXPR) > + { > + fprintf (f, " "); > + print_generic_expr (f, item->value.pass_through.operand); > + } > + } > + else if (item->jftype == IPA_JF_CONST) > + { > + fprintf (f, "CONST: "); > + ipa_print_constant_value (f, item->value.constant); > + } > + else if (item->jftype == IPA_JF_UNKNOWN) > + fprintf (f, "UNKNOWN: " HOST_WIDE_INT_PRINT_DEC " bits", > + tree_to_uhwi (TYPE_SIZE (item->type))); > + fprintf (f, "\n"); > + } > + } > + > + if (ctx && !ctx->useless_p ()) > + { > + fprintf (f, " Context: "); > + ctx->dump (dump_file); > + } > + > + if (jump_func->m_vr) > + { > + jump_func->m_vr->dump (f); > + fprintf (f, "\n"); > + } > + else > + fprintf (f, " Unknown VR\n"); > +} > + > /* Print the jump functions associated with call graph edge CS to file F. */ > > static void > @@ -439,116 +550,12 @@ ipa_print_node_jump_functions_for_edge (FILE *f, > struct cgraph_edge *cs) > > for (int i = 0; i < count; i++) > { > - struct ipa_jump_func *jump_func; > - enum jump_func_type type; > - > - jump_func = ipa_get_ith_jump_func (args, i); > - type = jump_func->type; > - > - fprintf (f, " param %d: ", i); > - if (type == IPA_JF_UNKNOWN) > - fprintf (f, "UNKNOWN\n"); > - else if (type == IPA_JF_CONST) > - { > - fprintf (f, "CONST: "); > - ipa_print_constant_value (f, jump_func->value.constant.value); > - fprintf (f, "\n"); > - } > - else if (type == IPA_JF_PASS_THROUGH) > - { > - fprintf (f, "PASS THROUGH: "); > - fprintf (f, "%d, op %s", > - jump_func->value.pass_through.formal_id, > - > get_tree_code_name(jump_func->value.pass_through.operation)); > - if (jump_func->value.pass_through.operation != NOP_EXPR) > - { > - fprintf (f, " "); > - print_generic_expr (f, jump_func->value.pass_through.operand); > - } > - if (jump_func->value.pass_through.agg_preserved) > - fprintf (f, ", agg_preserved"); > - if (jump_func->value.pass_through.refdesc_decremented) > - fprintf (f, ", refdesc_decremented"); > - fprintf (f, "\n"); > - } > - else if (type == IPA_JF_ANCESTOR) > - { > - fprintf (f, "ANCESTOR: "); > - fprintf (f, "%d, offset " HOST_WIDE_INT_PRINT_DEC, > - jump_func->value.ancestor.formal_id, > - jump_func->value.ancestor.offset); > - if (jump_func->value.ancestor.agg_preserved) > - fprintf (f, ", agg_preserved"); > - if (jump_func->value.ancestor.keep_null) > - fprintf (f, ", keep_null"); > - fprintf (f, "\n"); > - } > - > - if (jump_func->agg.items) > - { > - struct ipa_agg_jf_item *item; > - int j; > - > - fprintf (f, " Aggregate passed by %s:\n", > - jump_func->agg.by_ref ? "reference" : "value"); > - FOR_EACH_VEC_ELT (*jump_func->agg.items, j, item) > - { > - fprintf (f, " offset: " HOST_WIDE_INT_PRINT_DEC ", ", > - item->offset); > - fprintf (f, "type: "); > - print_generic_expr (f, item->type); > - fprintf (f, ", "); > - if (item->jftype == IPA_JF_PASS_THROUGH) > - fprintf (f, "PASS THROUGH: %d,", > - item->value.pass_through.formal_id); > - else if (item->jftype == IPA_JF_LOAD_AGG) > - { > - fprintf (f, "LOAD AGG: %d", > - item->value.pass_through.formal_id); > - fprintf (f, " [offset: " HOST_WIDE_INT_PRINT_DEC ", by > %s],", > - item->value.load_agg.offset, > - item->value.load_agg.by_ref ? "reference" > - : "value"); > - } > - > - if (item->jftype == IPA_JF_PASS_THROUGH > - || item->jftype == IPA_JF_LOAD_AGG) > - { > - fprintf (f, " op %s", > - get_tree_code_name (item->value.pass_through.operation)); > - if (item->value.pass_through.operation != NOP_EXPR) > - { > - fprintf (f, " "); > - print_generic_expr (f, > item->value.pass_through.operand); > - } > - } > - else if (item->jftype == IPA_JF_CONST) > - { > - fprintf (f, "CONST: "); > - ipa_print_constant_value (f, item->value.constant); > - } > - else if (item->jftype == IPA_JF_UNKNOWN) > - fprintf (f, "UNKNOWN: " HOST_WIDE_INT_PRINT_DEC " bits", > - tree_to_uhwi (TYPE_SIZE (item->type))); > - fprintf (f, "\n"); > - } > - } > - > + struct ipa_jump_func *jump_func = ipa_get_ith_jump_func (args, i); > class ipa_polymorphic_call_context *ctx > = ipa_get_ith_polymorhic_call_context (args, i); > - if (ctx && !ctx->useless_p ()) > - { > - fprintf (f, " Context: "); > - ctx->dump (dump_file); > - } > > - if (jump_func->m_vr) > - { > - jump_func->m_vr->dump (f); > - fprintf (f, "\n"); > - } > - else > - fprintf (f, " Unknown VR\n"); > + fprintf (f, " param %d: ", i); > + ipa_dump_jump_function (f, jump_func, ctx); > } > } > > diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h > index 7a05c169c42..3215395286b 100644 > --- a/gcc/ipa-prop.h > +++ b/gcc/ipa-prop.h > @@ -1247,6 +1247,8 @@ void ipa_push_agg_values_from_jfunc (ipa_node_params > *info, cgraph_node *node, > unsigned dst_index, > vec<ipa_argagg_value> *res); > void ipa_dump_param (FILE *, class ipa_node_params *info, int i); > +void ipa_dump_jump_function (FILE *f, ipa_jump_func *jfunc, > + class ipa_polymorphic_call_context *ctx = NULL); > void ipa_release_body_info (struct ipa_func_body_info *); > tree ipa_get_callee_param_type (struct cgraph_edge *e, int i); > bool ipcp_get_parm_bits (tree, tree *, widest_int *); > -- > 2.47.0 >