diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-05-25 18:27:03 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-05-25 18:27:03 +0200 |
commit | bb9862c6d963a989e659b971a47a2f77d8f9677f (patch) | |
tree | 613332034c8bc4624b1d2ad80329e1ca9bea1be0 /gcc | |
parent | 6bb0a66a9932e8f03e43edb007cb407ac45dbcbd (diff) | |
download | gcc-bb9862c6d963a989e659b971a47a2f77d8f9677f.zip gcc-bb9862c6d963a989e659b971a47a2f77d8f9677f.tar.gz gcc-bb9862c6d963a989e659b971a47a2f77d8f9677f.tar.bz2 |
re PR debug/41371 (var-tracking is slow and memory hungry)
PR debug/41371
* var-tracking.c (find_loc_in_1pdv): Guard asserts with
ENABLE_CHECKING.
(intersect_loc_chains): Walk the s2var's loc_chain together
with s1node chain as long as the locations are equal, don't
call find_loc_in_1pdv in that case.
From-SVN: r159829
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/var-tracking.c | 31 |
2 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 371bba7..e109180 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2010-05-25 Jakub Jelinek <jakub@redhat.com> + PR debug/41371 + * var-tracking.c (find_loc_in_1pdv): Guard asserts with + ENABLE_CHECKING. + (intersect_loc_chains): Walk the s2var's loc_chain together + with s1node chain as long as the locations are equal, don't + call find_loc_in_1pdv in that case. + PR debug/42801 * tree-inline.c (remap_decls): Remap DECL_VALUE_EXPR here... (copy_bind_expr): ... instead of here. diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index b585393..7548d6b 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -2490,12 +2490,16 @@ find_loc_in_1pdv (rtx loc, variable var, htab_t vars) if (!var) return NULL; +#ifdef ENABLE_CHECKING gcc_assert (dv_onepart_p (var->dv)); +#endif if (!var->n_var_parts) return NULL; +#ifdef ENABLE_CHECKING gcc_assert (var->var_part[0].offset == 0); +#endif loc_code = GET_CODE (loc); for (node = var->var_part[0].loc_chain; node; node = node->next) @@ -2590,6 +2594,33 @@ intersect_loc_chains (rtx val, location_chain *dest, struct dfset_merge *dsm, dataflow_set *s2set = dsm->src; location_chain found; + if (s2var) + { + location_chain s2node; + +#ifdef ENABLE_CHECKING + gcc_assert (dv_onepart_p (s2var->dv)); +#endif + + if (s2var->n_var_parts) + { +#ifdef ENABLE_CHECKING + gcc_assert (s2var->var_part[0].offset == 0); +#endif + s2node = s2var->var_part[0].loc_chain; + + for (; s1node && s2node; + s1node = s1node->next, s2node = s2node->next) + if (s1node->loc != s2node->loc) + break; + else if (s1node->loc == val) + continue; + else + insert_into_intersection (dest, s1node->loc, + MIN (s1node->init, s2node->init)); + } + } + for (; s1node; s1node = s1node->next) { if (s1node->loc == val) |