diff options
author | Gavin Romig-Koch <gavin@cygnus.com> | 1999-08-25 19:29:43 +0000 |
---|---|---|
committer | Gavin Romig-Koch <gavin@gcc.gnu.org> | 1999-08-25 19:29:43 +0000 |
commit | 57cf50a4640c0e19b20f3c77028b3d1542b6fb53 (patch) | |
tree | 429fe5fec82339cb4e279f1ef8644202e5c7a46f /gcc | |
parent | 95c5608516d4ecccc04099e7b18e11190547bcff (diff) | |
download | gcc-57cf50a4640c0e19b20f3c77028b3d1542b6fb53.zip gcc-57cf50a4640c0e19b20f3c77028b3d1542b6fb53.tar.gz gcc-57cf50a4640c0e19b20f3c77028b3d1542b6fb53.tar.bz2 |
combine.c (nonzero_bits): Allow single-ly set registers to be anywere in the function only if...
* combine.c (nonzero_bits) : Allow single-ly set registers to be
anywere in the function only if they are pseudos and set before
being used (not live at the start of the function).
(num_sign_bit_copies) : Same.
(get_last_value_validate) : Same.
(get_last_value) : Same.
From-SVN: r28871
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/combine.c | 39 |
2 files changed, 37 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 30a31f2..a5ea729 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Wed Aug 25 15:27:22 1999 Gavin Romig-Koch <gavin@cygnus.com> + + * combine.c (nonzero_bits) : Allow single-ly set registers to be + anywere in the function only if they are pseudos and set before + being used (not live at the start of the function). + (num_sign_bit_copies) : Same. + (get_last_value_validate) : Same. + (get_last_value) : Same. + Wed Aug 25 11:13:29 1999 Richard Henderson <rth@cygnus.com> * loop.c (express_from): Try harder to unify (* c N) and (* c M) diff --git a/gcc/combine.c b/gcc/combine.c index b2c3f50..dcd60c2 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7521,8 +7521,11 @@ nonzero_bits (x, mode) if (reg_last_set_value[REGNO (x)] != 0 && reg_last_set_mode[REGNO (x)] == mode - && (REG_N_SETS (REGNO (x)) == 1 - || reg_last_set_label[REGNO (x)] == label_tick) + && (reg_last_set_label[REGNO (x)] == label_tick + || (REGNO (x) >= FIRST_PSEUDO_REGISTER + && REG_N_SETS (REGNO (x)) == 1 + && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, + REGNO (x)))) && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) return reg_last_set_nonzero_bits[REGNO (x)]; @@ -7911,8 +7914,11 @@ num_sign_bit_copies (x, mode) if (reg_last_set_value[REGNO (x)] != 0 && reg_last_set_mode[REGNO (x)] == mode - && (REG_N_SETS (REGNO (x)) == 1 - || reg_last_set_label[REGNO (x)] == label_tick) + && (reg_last_set_label[REGNO (x)] == label_tick + || (REGNO (x) >= FIRST_PSEUDO_REGISTER + && REG_N_SETS (REGNO (x)) == 1 + && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, + REGNO (x)))) && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) return reg_last_set_sign_bit_copies[REGNO (x)]; @@ -10734,9 +10740,11 @@ get_last_value_validate (loc, insn, tick, replace) for (j = regno; j < endregno; j++) if (reg_last_set_invalid[j] - /* If this is a pseudo-register that was only set once, it is - always valid. */ - || (! (regno >= FIRST_PSEUDO_REGISTER && REG_N_SETS (regno) == 1) + /* If this is a pseudo-register that was only set once and not + live at the beginning of the function, it is always valid. */ + || (! (regno >= FIRST_PSEUDO_REGISTER + && REG_N_SETS (regno) == 1 + && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno)) && reg_last_set_label[j] > tick)) { if (replace) @@ -10795,12 +10803,21 @@ get_last_value (x) regno = REGNO (x); value = reg_last_set_value[regno]; - /* If we don't have a value or if it isn't for this basic block, - return 0. */ + /* If we don't have a value, or if it isn't for this basic block and + it's either a hard register, set more than once, or it's a live + at the beginning of the function, return 0. + + Because if it's not live at the beginnning of the function then the reg + is always set before being used (is never used without being set). + And, if it's set only once, and it's always set before use, then all + uses must have the same last value, even if it's not from this basic + block. */ if (value == 0 - || (REG_N_SETS (regno) != 1 - && reg_last_set_label[regno] != label_tick)) + || (reg_last_set_label[regno] != label_tick + && (regno < FIRST_PSEUDO_REGISTER + || REG_N_SETS (regno) != 1 + || REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno)))) return 0; /* If the value was set in a later insn than the ones we are processing, |