From 2a964ec63acf074dc570dafdb77b3b2bd89bcf47 Mon Sep 17 00:00:00 2001 From: hjl Date: Mon, 11 Sep 2006 21:30:07 +0000 Subject: [PATCH] 2006-09-11 Alexandre Oliva PR target/28672 * var-tracking.c (dump_dataflow_set): Start dumping at register zero. (clobber_variable_part): Kill only the variable part in registers holding it, leaving other variables alone. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116859 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/var-tracking.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 71ef415341b..b1a92ec5edc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-09-11 Alexandre Oliva + + PR target/28672 + * var-tracking.c (dump_dataflow_set): Start dumping at + register zero. + (clobber_variable_part): Kill only the variable part in + registers holding it, leaving other variables alone. + 2006-09-11 Josh Triplett * doc/extend.texi (Other Builtins): Actually use the macro diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index e33950e87b5..815facae182 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -1960,7 +1960,7 @@ dump_dataflow_set (dataflow_set *set) fprintf (dump_file, "Stack adjustment: " HOST_WIDE_INT_PRINT_DEC "\n", set->stack_adjust); - for (i = 1; i < FIRST_PSEUDO_REGISTER; i++) + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) { if (set->regs[i]) { @@ -2212,8 +2212,32 @@ clobber_variable_part (dataflow_set *set, rtx loc, tree decl, for (node = next; node; node = next) { next = node->next; - if (REG_P (node->loc) && node->loc != loc) - var_reg_delete (set, node->loc, false); + if (node->loc != loc) + { + if (REG_P (node->loc)) + { + attrs anode, anext; + attrs *anextp; + + /* Remove the variable part from the register's + list, but preserve any other variable parts + that might be regarded as live in that same + register. */ + anextp = &set->regs[REGNO (node->loc)]; + for (anode = *anextp; anode; anode = anext) + { + anext = anode->next; + if (anode->decl == decl + && anode->offset == offset) + { + pool_free (attrs_pool, anode); + *anextp = anext; + } + } + } + + delete_variable_part (set, node->loc, decl, offset); + } } } } -- 2.11.4.GIT