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