Bug 41264 - [4.5 Regression] variable-tracking unbelievably slow
Summary: [4.5 Regression] variable-tracking unbelievably slow
Status: RESOLVED DUPLICATE of bug 41371
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.5.0
: P1 normal
Target Milestone: 4.5.0
Assignee: Alexandre Oliva
URL:
Keywords: compile-time-hog, memory-hog
Depends on:
Blocks:
 
Reported: 2009-09-04 13:50 UTC by Richard Biener
Modified: 2009-12-13 22:18 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-10-03 22:49:10


Attachments
testcase (55.39 KB, text/plain)
2009-09-04 13:53 UTC, Richard Biener
Details
pr41264-test.c (354 bytes, text/plain)
2009-10-03 22:50 UTC, Michael Matz
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2009-09-04 13:50:45 UTC
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
Comment 1 Richard Biener 2009-09-04 13:53:58 UTC
Created attachment 18494 [details]
testcase
Comment 2 Richard Biener 2009-09-04 14:02:13 UTC
Memory usage doubles.
Comment 3 Michael Matz 2009-10-03 22:49:10 UTC
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.
Comment 4 Michael Matz 2009-10-03 22:50:36 UTC
Created attachment 18699 [details]
pr41264-test.c

Compile this with
% ./cc1 -O2 -g pr41264-test.c
and cry.
Comment 5 Michael Matz 2009-10-03 23:22:34 UTC
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.
Comment 6 Alexandre Oliva 2009-10-06 04:38:43 UTC
The patch that introduces debug temps fixes this problem:
http://gcc.gnu.org/ml/gcc-patches/2009-10/msg00112.html
Comment 7 Alexandre Oliva 2009-10-12 18:59:04 UTC
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

Comment 8 Alexandre Oliva 2009-10-12 20:01:23 UTC
Fixed
Comment 9 Richard Biener 2009-10-13 12:07:42 UTC
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.
Comment 10 Alexandre Oliva 2009-10-13 20:08:24 UTC
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.
Comment 11 Alexandre Oliva 2009-10-14 05:01:50 UTC
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

Comment 12 Michael Matz 2009-10-14 06:14:42 UTC
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.
Comment 13 Richard Biener 2009-12-13 22:18:37 UTC
Mark as dup of a single "vartracking is slow with VTA" bug.

*** This bug has been marked as a duplicate of 41371 ***