diff options
| author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-14 22:39:25 +0000 |
|---|---|---|
| committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-14 22:39:25 +0000 |
| commit | e25fd7987ba4c9d293b4e4e9715ef4a1e1b98ad9 (patch) | |
| tree | 0fef3d11083df82ef7728ddeae8320963203acfc | |
| parent | e066716049672ad18c664157f2762b3e06dbd32a (diff) | |
| download | ppe42-gcc-e25fd7987ba4c9d293b4e4e9715ef4a1e1b98ad9.tar.gz ppe42-gcc-e25fd7987ba4c9d293b4e4e9715ef4a1e1b98ad9.zip | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155918 138bc75d-0d04-0410-961f-82ee72b054a4
| -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 85841837fc5..ce49f3683a6 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 0822fecab34..e5f95d97fcf 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. */ |

