From 7d2a845248174754046207cb2e634b64aea86b01 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 14 Jan 2010 22:39:25 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/var-tracking.c | 22 ++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85841837fc5a..ce49f3683a6b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-14 Alexandre Oliva + + * 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 PR debug/42657 diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 0822fecab34a..e5f95d97fcfb 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. */ -- 2.47.2