https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44563
--- Comment #18 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #17) > (In reply to Richard Biener from comment #16) > > callgrind shows the cgraph_edge_hasher quite high in the profile (via > > redirect_all_calls). I suppose as the large main is a single BB walking > > all stmts over-and-over is quite bad. Also hash_pointer isn't inlined!? > > Ah - it's external in libiberty hashtab.c ... - it should transition to > > using/inheriting from pointer_hash. > > > > cgraph_edge * > > cgraph_node::get_edge (gimple call_stmt) > > { > > cgraph_edge *e, *e2; > > int n = 0; > > > > if (call_site_hash) > > return call_site_hash->find_with_hash (call_stmt, > > htab_hash_pointer (call_stmt)); > > > > Btw, for 10000 calls (smaller testcase) we get 100 000 000 calls to > cgraph_edge::redirect_call_stmt_to_callee () (that's from 40000 > redirect_all_calls calls which is from 10000 optimize_inline_calls calls). > > Ah - we do this also for the ENTRY/EXIT block! > > Index: gcc/tree-inline.c > =================================================================== > --- gcc/tree-inline.c (revision 221278) > +++ gcc/tree-inline.c (working copy) > @@ -2802,11 +2802,13 @@ copy_cfg_body (copy_body_data * id, gcov > if (need_debug_cleanup > && bb->index != ENTRY_BLOCK > && bb->index != EXIT_BLOCK) > - maybe_move_debug_stmts_to_successors (id, (basic_block) bb->aux); > - /* Update call edge destinations. This can not be done before loop > - info is updated, because we may split basic blocks. */ > - if (id->transform_call_graph_edges == CB_CGE_DUPLICATE) > - redirect_all_calls (id, (basic_block)bb->aux); > + { > + maybe_move_debug_stmts_to_successors (id, (basic_block) bb->aux); > + /* Update call edge destinations. This can not be done before > loop > + info is updated, because we may split basic blocks. */ > + if (id->transform_call_graph_edges == CB_CGE_DUPLICATE) > + redirect_all_calls (id, (basic_block)bb->aux); > + } > ((basic_block)bb->aux)->aux = NULL; > bb->aux = NULL; > } > > makes sense? Fails to bootstrap :/ But would improve the testcase to only have the inline heuristic issue. /space/rguenther/src/svn/trunk/libstdc++-v3/libsupc++/pbase_type_info.cc: In member function ‘virtual bool __cxxabiv1::__pbase_type_info::__do_catch(const std::type_info*, void**, unsigned int) const’: /space/rguenther/src/svn/trunk/libstdc++-v3/libsupc++/pbase_type_info.cc:32:6: error: reference to dead statement bool __pbase_type_info:: ^ # .MEM = VDEF <.MEM> _30 = OBJ_TYPE_REF(_28;(const struct __pbase_type_info)this_3(D)->6) (this_3(D), thr_type_5(D), thr_obj_9(D), outer_29); _ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj/74 (virtual bool __cxxabiv1::__pbase_type_info::__do_catch(const std::type_info*, void**, unsigned int) const) @0x2aaaac8d3ab8 Type: function definition analyzed Visibility: externally_visible public visibility_specified virtual Address is taken. References: _ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj/34 (addr) (speculative) Referring: _ZTVN10__cxxabiv117__pbase_type_infoE/77 (addr) Availability: overwritable First run: 0 Function flags: body Called by: Calls: strcmp/85 (0.39 per call) __cxa_bad_typeid/83 (can throw external) strcmp/85 (0.61 per call) Indirect call(0.11 per call) (can throw external) Polymorphic indirect call of type const struct __pbase_type_info token:6(speculative) (0.03 per call) (can throw external) of param:0 Outer type (dynamic):struct __pbase_type_info (or a derived type) offset 0 /space/rguenther/src/svn/trunk/libstdc++-v3/libsupc++/pbase_type_info.cc:32:6: internal compiler error: verify_cgraph_node failed 0xa8eebc cgraph_node::verify_node() /space/rguenther/src/svn/trunk/gcc/cgraph.c:3115 0xa8473f symtab_node::verify() /space/rguenther/src/svn/trunk/gcc/symtab.c:1103 0x1025861 optimize_inline_calls(tree_node*) /space/rguenther/src/svn/trunk/gcc/tree-inline.c:4938 > > The estimate_calls_size_and_time portion is quite smaller. > > > > cleanup-cfgs main portion is split_bb_on_noreturn_calls.