The following is step number one to make BLOCK_ABSTRACT_ORIGIN behave similar to DECL_ABSTRACT_ORIGIN, namely point to the ultimate origin. I've audited all uses and they all are interested in the ultimate origin only (well, most do not bother to look at DECL_ORIGIN of the FUNCTION_DECL they eventually run into).
Bootstrap and regtest is in progress on x86_64-unknown-linux-gnu, if you have any objection speak up quickly ;) Further experiment will see whether I can make it really ultimate (it's a single place where for the inline BLOCK we have to assign DECL_ORIGIN (fn) instead of fn). Richard. 2018-09-28 Richard Biener <rguent...@suse.de> * tree.h (BLOCK_ORIGIN): New. * omp-expand.c (grid_expand_target_grid_body): Assign BLOCK_ORIGIN to BLOCK_ABSTRACT_ORIGIN. * tree-inline.c (remap_block): Likewise. * auto-profile.c (get_function_decl_from_block): Simplify by eliding the BLOCK_ABSTRACT_ORIGIN chasing. * langhooks.c (lhd_print_error_function): Likewise. * optinfo-emit-json.cc (optrecord_json_writer::inlining_chain_to): Likewise. * tree-ssa-live.c (remove_unused_scope_block_p): Likewise. * tree.c (block_nonartificial_location): Likewise. (block_ultimate_origin): Likewise. * tree-pretty-print.c (percent_K_format): Likewise. Remove no longer needed LTO case. cp/ * error.c (cp_print_error_function): Simplify by eliding the BLOCK_ABSTRACT_ORIGIN chasing. Index: gcc/auto-profile.c =================================================================== --- gcc/auto-profile.c (revision 264686) +++ gcc/auto-profile.c (working copy) @@ -354,17 +354,10 @@ get_combined_location (location_t loc, t static tree get_function_decl_from_block (tree block) { - tree decl; - - if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) == UNKNOWN_LOCATION) + if (!inlined_function_outer_scope_p (block)) return NULL_TREE; - for (decl = BLOCK_ABSTRACT_ORIGIN (block); - decl && (TREE_CODE (decl) == BLOCK); - decl = BLOCK_ABSTRACT_ORIGIN (decl)) - if (TREE_CODE (decl) == FUNCTION_DECL) - break; - return decl; + return BLOCK_ABSTRACT_ORIGIN (block); } /* Store inline stack for STMT in STACK. */ Index: gcc/cp/error.c =================================================================== --- gcc/cp/error.c (revision 264686) +++ gcc/cp/error.c (working copy) @@ -3339,10 +3339,6 @@ cp_print_error_function (diagnostic_cont if (abstract_origin) { ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin); - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); gcc_assert (TREE_CODE (ao) == FUNCTION_DECL); fndecl = ao; } @@ -3364,12 +3360,6 @@ cp_print_error_function (diagnostic_cont && BLOCK_ABSTRACT_ORIGIN (block)) { ao = BLOCK_ABSTRACT_ORIGIN (block); - - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); - if (TREE_CODE (ao) == FUNCTION_DECL) { fndecl = ao; Index: gcc/langhooks.c =================================================================== --- gcc/langhooks.c (revision 264686) +++ gcc/langhooks.c (working copy) @@ -385,10 +385,6 @@ lhd_print_error_function (diagnostic_con if (abstract_origin) { ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin); - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); gcc_assert (TREE_CODE (ao) == FUNCTION_DECL); fndecl = ao; } @@ -416,12 +412,6 @@ lhd_print_error_function (diagnostic_con && BLOCK_ABSTRACT_ORIGIN (block)) { ao = BLOCK_ABSTRACT_ORIGIN (block); - - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); - if (TREE_CODE (ao) == FUNCTION_DECL) { fndecl = ao; Index: gcc/omp-expand.c =================================================================== --- gcc/omp-expand.c (revision 264686) +++ gcc/omp-expand.c (working copy) @@ -7629,7 +7629,7 @@ grid_expand_target_grid_body (struct omp SET_DECL_ASSEMBLER_NAME (kern_fndecl, DECL_NAME (kern_fndecl)); tree tgtblock = gimple_block (tgt_stmt); tree fniniblock = make_node (BLOCK); - BLOCK_ABSTRACT_ORIGIN (fniniblock) = tgtblock; + BLOCK_ABSTRACT_ORIGIN (fniniblock) = BLOCK_ORIGIN (tgtblock); BLOCK_SOURCE_LOCATION (fniniblock) = BLOCK_SOURCE_LOCATION (tgtblock); BLOCK_SOURCE_END_LOCATION (fniniblock) = BLOCK_SOURCE_END_LOCATION (tgtblock); BLOCK_SUPERCONTEXT (fniniblock) = kern_fndecl; Index: gcc/optinfo-emit-json.cc =================================================================== --- gcc/optinfo-emit-json.cc (revision 264686) +++ gcc/optinfo-emit-json.cc (working copy) @@ -299,12 +299,6 @@ optrecord_json_writer::inlining_chain_to && BLOCK_ABSTRACT_ORIGIN (block)) { tree ao = BLOCK_ABSTRACT_ORIGIN (block); - - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); - if (TREE_CODE (ao) == FUNCTION_DECL) { fndecl = ao; Index: gcc/tree-inline.c =================================================================== --- gcc/tree-inline.c (revision 264686) +++ gcc/tree-inline.c (working copy) @@ -704,7 +704,7 @@ remap_block (tree *block, copy_body_data old_block = *block; new_block = make_node (BLOCK); TREE_USED (new_block) = TREE_USED (old_block); - BLOCK_ABSTRACT_ORIGIN (new_block) = old_block; + BLOCK_ABSTRACT_ORIGIN (new_block) = BLOCK_ORIGIN (old_block); BLOCK_SOURCE_LOCATION (new_block) = BLOCK_SOURCE_LOCATION (old_block); BLOCK_NONLOCALIZED_VARS (new_block) = vec_safe_copy (BLOCK_NONLOCALIZED_VARS (old_block)); Index: gcc/tree-pretty-print.c =================================================================== --- gcc/tree-pretty-print.c (revision 264686) +++ gcc/tree-pretty-print.c (working copy) @@ -3976,35 +3976,11 @@ percent_K_format (text_info *text, locat gcc_assert (pp_ti_abstract_origin (text) != NULL); *pp_ti_abstract_origin (text) = NULL; - if (in_lto_p) - { - /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those - representing the outermost block of an inlined function. - So walk the BLOCK tree until we hit such a scope. */ - while (block - && TREE_CODE (block) == BLOCK) - { - if (inlined_function_outer_scope_p (block)) - { - *pp_ti_abstract_origin (text) = block; - break; - } - block = BLOCK_SUPERCONTEXT (block); - } - return; - } - while (block && TREE_CODE (block) == BLOCK && BLOCK_ABSTRACT_ORIGIN (block)) { tree ao = BLOCK_ABSTRACT_ORIGIN (block); - - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); - if (TREE_CODE (ao) == FUNCTION_DECL) { *pp_ti_abstract_origin (text) = block; Index: gcc/tree-ssa-live.c =================================================================== --- gcc/tree-ssa-live.c (revision 264686) +++ gcc/tree-ssa-live.c (working copy) @@ -561,12 +561,7 @@ remove_unused_scope_block_p (tree scope, will not be emitted properly. */ if (inlined_function_outer_scope_p (scope)) { - tree ao = scope; - - while (ao - && TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); + tree ao = BLOCK_ORIGIN (scope); if (ao && TREE_CODE (ao) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (ao) Index: gcc/tree.c =================================================================== --- gcc/tree.c (revision 264686) +++ gcc/tree.c (working copy) @@ -11964,12 +11964,6 @@ block_nonartificial_location (tree block && BLOCK_ABSTRACT_ORIGIN (block)) { tree ao = BLOCK_ABSTRACT_ORIGIN (block); - - while (TREE_CODE (ao) == BLOCK - && BLOCK_ABSTRACT_ORIGIN (ao) - && BLOCK_ABSTRACT_ORIGIN (ao) != ao) - ao = BLOCK_ABSTRACT_ORIGIN (ao); - if (TREE_CODE (ao) == FUNCTION_DECL) { /* If AO is an artificial inline, point RET to the @@ -12150,16 +12144,7 @@ block_ultimate_origin (const_tree block) return NULL_TREE; else { - tree ret_val; - tree lookahead = immediate_origin; - - do - { - ret_val = lookahead; - lookahead = (TREE_CODE (ret_val) == BLOCK - ? BLOCK_ABSTRACT_ORIGIN (ret_val) : NULL); - } - while (lookahead != NULL && lookahead != ret_val); + tree ret_val = immediate_origin; /* The block's abstract origin chain may not be the *ultimate* origin of the block. It could lead to a DECL that has an abstract origin set. Index: gcc/tree.h =================================================================== --- gcc/tree.h (revision 264686) +++ gcc/tree.h (working copy) @@ -1789,6 +1789,8 @@ extern tree maybe_wrap_with_location (tr #define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext) #define BLOCK_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.chain) #define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin) +#define BLOCK_ORIGIN(NODE) \ + (BLOCK_ABSTRACT_ORIGIN(NODE) ? BLOCK_ABSTRACT_ORIGIN(NODE) : (NODE)) #define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag) #define BLOCK_DIE(NODE) (BLOCK_CHECK (NODE)->block.die)