cgraph_remove_node still slow
Richard Guenther
rguenth@tat.physik.uni-tuebingen.de
Sat Mar 5 22:26:00 GMT 2005
Hi!
For a tramp3d -O2 compile we still have
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
5.10 4.53 4.53 129961 0.00 0.00 cgraph_remove_node
2.93 7.13 2.60 28401225 0.00 0.00 ggc_alloc_stat
1.65 8.60 1.47 11131801 0.00 0.00
splay_tree_splay_helper
1.38 9.83 1.23 17375270 0.00 0.00 get_stmt_operands
1.34 11.02 1.19 13906935 0.00 0.00
htab_find_slot_with_hash
with is probably the loop(s) over all clones in cgraph_remove_node which
results in all this being O(n^2) inlining all of the clones.
The obvious fix for the first loop, the removal of the node from the
clones list, is to make this list doubly-linked, there is another loop
just a few lines below with the same complexity:
for (n = *slot; n; n = n->next_clone)
if (n->global.inlined_to
|| (!n->global.inlined_to
&& !TREE_ASM_WRITTEN (n->decl) &&
!DECL_EXTERNAL (n->decl)))
break;
if (!n && !dump_enabled_p (TDI_tree_all))
{
DECL_SAVED_TREE (node->decl) = NULL;
DECL_STRUCT_FUNCTION (node->decl) = NULL;
DECL_INITIAL (node->decl) = error_mark_node;
}
which checks if we still need the function body. Why is this loop there
in the first place? Wouldn't it be enough to check this if the node is
the last clone? Why do we need the list of clones anyway? It looks
like its purpose can be achieved with some reference counting, too?
Any ideas how to fix this remaining O(N^2) complexity for 4.0?
Thanks,
Richard.
More information about the Gcc
mailing list