diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-05-18 11:35:52 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-05-18 11:35:52 +0200 |
commit | 1307793110d6fc2949011a498e289d817d817426 (patch) | |
tree | 16f026244017619e95770568d2e9f72008491e8f /gcc/var-tracking.c | |
parent | 02540df4e6b7c030012c1c5d1383dc03a41f6f8e (diff) | |
download | gcc-1307793110d6fc2949011a498e289d817d817426.zip gcc-1307793110d6fc2949011a498e289d817d817426.tar.gz gcc-1307793110d6fc2949011a498e289d817d817426.tar.bz2 |
re PR debug/41371 (var-tracking is slow and memory hungry)
PR debug/41371
* var-tracking.c (find_loc_in_1pdv): Add a few checks from
rtx_equal_p inline.
From-SVN: r159528
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index b2c828a..0c41312 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -2484,6 +2484,7 @@ static location_chain find_loc_in_1pdv (rtx loc, variable var, htab_t vars) { location_chain node; + enum rtx_code loc_code; if (!var) return NULL; @@ -2495,28 +2496,41 @@ find_loc_in_1pdv (rtx loc, variable var, htab_t vars) gcc_assert (var->var_part[0].offset == 0); + loc_code = GET_CODE (loc); for (node = var->var_part[0].loc_chain; node; node = node->next) - if (rtx_equal_p (loc, node->loc)) - return node; - else if (GET_CODE (node->loc) == VALUE - && !VALUE_RECURSED_INTO (node->loc)) - { - decl_or_value dv = dv_from_value (node->loc); - variable var = (variable) - htab_find_with_hash (vars, dv, dv_htab_hash (dv)); + { + if (GET_CODE (node->loc) != loc_code) + { + if (GET_CODE (node->loc) != VALUE) + continue; + } + else if (loc == node->loc) + return node; + else if (loc_code != VALUE) + { + if (rtx_equal_p (loc, node->loc)) + return node; + continue; + } + if (!VALUE_RECURSED_INTO (node->loc)) + { + decl_or_value dv = dv_from_value (node->loc); + variable var = (variable) + htab_find_with_hash (vars, dv, dv_htab_hash (dv)); - if (var) - { - location_chain where; - VALUE_RECURSED_INTO (node->loc) = true; - if ((where = find_loc_in_1pdv (loc, var, vars))) - { - VALUE_RECURSED_INTO (node->loc) = false; - return where; - } - VALUE_RECURSED_INTO (node->loc) = false; - } - } + if (var) + { + location_chain where; + VALUE_RECURSED_INTO (node->loc) = true; + if ((where = find_loc_in_1pdv (loc, var, vars))) + { + VALUE_RECURSED_INTO (node->loc) = false; + return where; + } + VALUE_RECURSED_INTO (node->loc) = false; + } + } + } return NULL; } |