diff options
author | Daniel Jacobowitz <dan@debian.org> | 2004-08-20 16:53:49 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@gcc.gnu.org> | 2004-08-20 16:53:49 +0000 |
commit | d64d5e80857fae533c75dc6474ebe67970dd78ca (patch) | |
tree | 41df9f07c283c3818b38dd40a4cc059bc62bd5c4 | |
parent | af75a7ea828d60f103de52f79e2d3f78e315d519 (diff) | |
download | gcc-d64d5e80857fae533c75dc6474ebe67970dd78ca.zip gcc-d64d5e80857fae533c75dc6474ebe67970dd78ca.tar.gz gcc-d64d5e80857fae533c75dc6474ebe67970dd78ca.tar.bz2 |
regrename.c (kill_value_one_regno): Renamed from kill_value_regno.
* regrename.c (kill_value_one_regno): Renamed from kill_value_regno.
(kill_value_regno): New function, derived from kill_value.
(kill_value): Update.
(copyprop_hardreg_forward_1): Update call to kill_value_regno.
From-SVN: r86332
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/regrename.c | 67 |
2 files changed, 49 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1ec6811..cd27484 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-08-20 Daniel Jacobowitz <dan@debian.org> + + * regrename.c (kill_value_one_regno): Renamed from kill_value_regno. + (kill_value_regno): New function, derived from kill_value. + (kill_value): Update. + (copyprop_hardreg_forward_1): Update call to kill_value_regno. + 2004-08-20 Daniel Berlin <dberlin@dberlin.org> Fix PR tree-optimization/17111 diff --git a/gcc/regrename.c b/gcc/regrename.c index 80cbcaa..9350b19 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -1010,7 +1010,8 @@ struct value_data unsigned int max_value_regs; }; -static void kill_value_regno (unsigned, struct value_data *); +static void kill_value_one_regno (unsigned, struct value_data *); +static void kill_value_regno (unsigned, unsigned, struct value_data *); static void kill_value (rtx, struct value_data *); static void set_value_regno (unsigned, enum machine_mode, struct value_data *); static void init_value_data (struct value_data *); @@ -1035,11 +1036,13 @@ extern void debug_value_data (struct value_data *); static void validate_value_data (struct value_data *); #endif -/* Kill register REGNO. This involves removing it from any value lists, - and resetting the value mode to VOIDmode. */ +/* Kill register REGNO. This involves removing it from any value + lists, and resetting the value mode to VOIDmode. This is only a + helper function; it does not handle any hard registers overlapping + with REGNO. */ static void -kill_value_regno (unsigned int regno, struct value_data *vd) +kill_value_one_regno (unsigned int regno, struct value_data *vd) { unsigned int i, next; @@ -1066,7 +1069,39 @@ kill_value_regno (unsigned int regno, struct value_data *vd) #endif } -/* Kill X. This is a convenience function for kill_value_regno +/* Kill the value in register REGNO for NREGS, and any other registers + whose values overlap. */ + +static void +kill_value_regno (regno, nregs, vd) + unsigned int regno; + unsigned int nregs; + struct value_data *vd; +{ + unsigned int j; + + /* Kill the value we're told to kill. */ + for (j = 0; j < nregs; ++j) + kill_value_one_regno (regno + j, vd); + + /* Kill everything that overlapped what we're told to kill. */ + if (regno < vd->max_value_regs) + j = 0; + else + j = regno - vd->max_value_regs; + for (; j < regno; ++j) + { + unsigned int i, n; + if (vd->e[j].mode == VOIDmode) + continue; + n = hard_regno_nregs[j][vd->e[j].mode]; + if (j + n > regno) + for (i = 0; i < n; ++i) + kill_value_one_regno (j + i, vd); + } +} + +/* Kill X. This is a convenience function wrapping kill_value_regno so that we mind the mode the register is in. */ static void @@ -1084,26 +1119,8 @@ kill_value (rtx x, struct value_data *vd) { unsigned int regno = REGNO (x); unsigned int n = hard_regno_nregs[regno][GET_MODE (x)]; - unsigned int i, j; - - /* Kill the value we're told to kill. */ - for (i = 0; i < n; ++i) - kill_value_regno (regno + i, vd); - /* Kill everything that overlapped what we're told to kill. */ - if (regno < vd->max_value_regs) - j = 0; - else - j = regno - vd->max_value_regs; - for (; j < regno; ++j) - { - if (vd->e[j].mode == VOIDmode) - continue; - n = hard_regno_nregs[j][vd->e[j].mode]; - if (j + n > regno) - for (i = 0; i < n; ++i) - kill_value_regno (j + i, vd); - } + kill_value_regno (regno, n, vd); } } @@ -1703,7 +1720,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) if (CALL_P (insn)) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)) - kill_value_regno (i, vd); + kill_value_regno (i, 1, vd); /* Notice stores. */ note_stores (PATTERN (insn), kill_set_value, vd); |