aboutsummaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-05-18 11:35:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-05-18 11:35:52 +0200
commit1307793110d6fc2949011a498e289d817d817426 (patch)
tree16f026244017619e95770568d2e9f72008491e8f /gcc/var-tracking.c
parent02540df4e6b7c030012c1c5d1383dc03a41f6f8e (diff)
downloadgcc-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.c54
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;
}