diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2010-01-14 22:39:25 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-01-14 23:39:25 +0100 |
commit | 7d2a845248174754046207cb2e634b64aea86b01 (patch) | |
tree | 0fef3d11083df82ef7728ddeae8320963203acfc /gcc | |
parent | d17af1478964cba0792df8436a8ae839626bdb19 (diff) | |
download | gcc-7d2a845248174754046207cb2e634b64aea86b01.zip gcc-7d2a845248174754046207cb2e634b64aea86b01.tar.gz gcc-7d2a845248174754046207cb2e634b64aea86b01.tar.bz2 |
var-tracking.c (var_reg_delete): Don't delete the association between REGs and values or one-part variables if...
* var-tracking.c (var_reg_delete): Don't delete the association
between REGs and values or one-part variables if the register
isn't clobbered.
From-SVN: r155918
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/var-tracking.c | 22 |
2 files changed, 20 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8584183..ce49f36 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-14 Alexandre Oliva <aoliva@redhat.com> + + * var-tracking.c (var_reg_delete): Don't delete the association + between REGs and values or one-part variables if the register + isn't clobbered. + 2010-01-14 Jakub Jelinek <jakub@redhat.com> PR debug/42657 diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 0822fec..e5f95d9 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -1401,14 +1401,15 @@ var_reg_delete_and_set (dataflow_set *set, rtx loc, bool modify, var_reg_set (set, loc, initialized, set_src); } -/* Delete current content of register LOC in dataflow set SET. If - CLOBBER is true, also delete any other live copies of the same - variable part. */ +/* Delete the association of register LOC in dataflow set SET with any + variables that aren't onepart. If CLOBBER is true, also delete any + other live copies of the same variable part, and delete the + association with onepart dvs too. */ static void var_reg_delete (dataflow_set *set, rtx loc, bool clobber) { - attrs *reg = &set->regs[REGNO (loc)]; + attrs *nextp = &set->regs[REGNO (loc)]; attrs node, next; if (clobber) @@ -1421,13 +1422,18 @@ var_reg_delete (dataflow_set *set, rtx loc, bool clobber) clobber_variable_part (set, NULL, dv_from_decl (decl), offset, NULL); } - for (node = *reg; node; node = next) + for (node = *nextp; node; node = next) { next = node->next; - delete_variable_part (set, node->loc, node->dv, node->offset); - pool_free (attrs_pool, node); + if (clobber || !dv_onepart_p (node->dv)) + { + delete_variable_part (set, node->loc, node->dv, node->offset); + pool_free (attrs_pool, node); + *nextp = next; + } + else + nextp = &node->next; } - *reg = NULL; } /* Delete content of register with number REGNO in dataflow set SET. */ |