The testcase from PR12392 (I'll attach it again momentarily) now has at -O -g variable tracking : 469.04 (89%) usr 0.96 (41%) sys 470.21 (89%) wall 170235 kB (26%) ggc the worst-case out of several testcases that show significant compile-time increases with -O -g. See http://gcc.opensuse.org/c++bench/random/random-summary.txt-5-0.html
Created attachment 18494 [details] testcase
Memory usage doubles.
Found a nice testcase for exponential explosion. It's reduced from tree.c (make_vector_type) when building with -fprofile-generate. The testcase needs simply "-O2 -g" and takes a ridiculous amount of > 4GB RAM. It's the tree-ssa-sink pass that triggers this in this case (with slight variations in the testcase I can also make it blow up in RTL fwprop). This means btw. that profiledbootstrap is broken.
Created attachment 18699 [details] pr41264-test.c Compile this with % ./cc1 -O2 -g pr41264-test.c and cry.
Hmpf, sorry, I think this bug report might be about something else. The exponential explosion is actually tracked in PR41343. I've attached the testcase there.
The patch that introduces debug temps fixes this problem: http://gcc.gnu.org/ml/gcc-patches/2009-10/msg00112.html
Subject: Bug 41264 Author: aoliva Date: Mon Oct 12 18:58:38 2009 New Revision: 152681 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=152681 Log: gcc/ChangeLog: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * tree.def (DEBUG_EXPR_DECL): New. * rtl.def (DEBUG_EXPR): New. * gengtype.c (adjust_field_rtx_def): Handle it. * tree-ssa.c (propagate_var_def_into_debug_stmts): Rename to... (insert_debug_temp_for_var_def): ... this. Drop support for moving. Take iterator for def stmt; insert debug stmt before it. Scan early for use count and kind in debug stmts. (propagate_defs_into_debug_stmts): Rename to... (insert_debug_temps_for_defs): ... this. Likewise. * tree.h (DEBUG_TEMP_UID): New. * tree.c (next_debug_decl_uid): New. (make_node_stat): Count debug decls separately. (copy_node_stat): Likewise. * cfgexpand.c (expand_debug_expr): Handle DEBUG_EXPR_DECL. * var-tracking.c (dv_is_decl_p): Recognize it. (VALUE_RECURSED_INTO): Apply to DEBUG_EXPRs too. (track_expr_p): Track expanded DEBUG_EXPR_DECLs. (vt_expand_loc_callback): Expand DEBUG_EXPRs. (emit_note_insn_var_location): Don't emit notes for DEBUG_EXPR_DECLs. * cselib.c (rtx_equal_for_cselib_p): Handle DEBUG_EXPR. (cselib_hash_rtx): Likewise. (cselib_expand_value_rtx_1): Use callback for DEBUG_EXPR. * tree-ssa-operands.c (get_expr_operands): Skip DEBUG_EXPR_DECLs in debug bind stmts. * emit-rtl.c (verify_rtx_sharing): Handle DEBUG_EXPR and VALUE. (copy_rtx_if_shared_1, reset_used_flags, set_used_flags): Likewise. * rtl.c (copy_rtx): Likewise. (rtx_equal_p_cb, rtx_equal_p): Handle DEBUG_EXPR. * print-rtl.c (print_rtx): Likewise. * sched-vis.c (print_value): Likewise. (print_insn): Handle DEBUG_EXPR_DECL. * tree-dump.c (dequeue_and_dump): Likewise. * tree-pretty-print.c (dump_decl_name, dump_generic_node): Likewise. * gimple-iterator (gsi_replace): Check for same lhs. (gsi_remove): Insert debug temps. * tree-ssa-loop-im.c (rewrite_reciprocal): Replace with same lhs. (move_computations_stmt): Drop explicit propagation into debug stmts. (rewrite_bittest): Likewise. Use gsi_remove for propagation. * tree-ssa-reassoc.c (rewrite_expr_tree, linearize_expr): Likewise. * tree-ssa-sink.c (statement_sink_location): Likewise. * tree-ssa-forwprop (forward_propagate_addr_expr): Likewise. * tree-ssanames.c (release_ssa_name): Adjust for rename. * tree-flow.h: Likewise. * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Don't mark debug temps without values. (eliminate_unnecessary_stmts): Don't discard just-inserted debug stmts. gcc/testsuite/ChangeLog: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * gcc.dg/guality/pr41447-1.c: New. * gcc.dg/debug/pr41264-1.c: New. * gcc.dg/debug/pr41343-1.c: New. Added: trunk/gcc/testsuite/gcc.dg/debug/pr41264-1.c trunk/gcc/testsuite/gcc.dg/debug/pr41343-1.c trunk/gcc/testsuite/gcc.dg/guality/pr41447-1.c Modified: trunk/gcc/ChangeLog trunk/gcc/cfgexpand.c trunk/gcc/cselib.c trunk/gcc/emit-rtl.c trunk/gcc/gengtype.c trunk/gcc/gimple-iterator.c trunk/gcc/print-rtl.c trunk/gcc/rtl.c trunk/gcc/rtl.def trunk/gcc/sched-vis.c trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-dump.c trunk/gcc/tree-flow.h trunk/gcc/tree-pretty-print.c trunk/gcc/tree-ssa-dce.c trunk/gcc/tree-ssa-forwprop.c trunk/gcc/tree-ssa-loop-im.c trunk/gcc/tree-ssa-operands.c trunk/gcc/tree-ssa-reassoc.c trunk/gcc/tree-ssa-sink.c trunk/gcc/tree-ssa.c trunk/gcc/tree-ssanames.c trunk/gcc/tree.c trunk/gcc/tree.def trunk/gcc/tree.h trunk/gcc/var-tracking.c
Fixed
It's not fixed. variable tracking : 480.87 (90%) usr 1.42 (54%) sys 482.57 (90%) wall 22699 kB ( 5%) ggc it's even got slower.
This means the testcase labeled pr41264-test.c was totally unrelated to the original bug report :-( Oh well... I'll add the other testcase to my ongoing efforts to speed up var-tracking. I'm working on that on two fronts: 1. speed up dataflow analysis while reducing memory use, by chaining and partially-sharing variable hash tables, and speeding up lookups with bit-fields. 2. speed up emission of notes by caching the results of expanding location expressions, rather than repeatedly expanding then and often throwing the results away I'm afraid both of these are lower priority than wrong debug-info introduced in the scheduler, as in bug 41535.
Subject: Bug 41264 Author: aoliva Date: Wed Oct 14 05:01:24 2009 New Revision: 152749 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=152749 Log: PR debug/41343 PR debug/41447 PR debug/41264 PR debug/41338 * tree.c (tree_node_structure_for_code): DEBUG_EXPR_DECL uses decl with rtl. (tree_code_size): Likewise. Modified: trunk/gcc/ChangeLog trunk/gcc/tree.c
Yeah, I'm sorry, I attached the testcase to the wrong bug report as said in comment #5. It was about combinatoric explosion not about slow var-tracking. I should probably have deleted the attachment from here.
Mark as dup of a single "vartracking is slow with VTA" bug. *** This bug has been marked as a duplicate of 41371 ***