diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/reload1.c | 21 |
2 files changed, 25 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6576cb..a2439de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Sat Feb 6 10:31:35 1999 Jeffrey A Law (law@cygnus.com) + + * reload1.c (reload_combine_note_store): Be more careful with + STRICT_LOW_PART, ZERO_EXTRACT and SIGN_EXTRACT. + (move2add_note_store): Likewise. + Sat Feb 6 10:18:01 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * cppfiles.c (read_and_prescan): Cast the result of `xrealloc' to diff --git a/gcc/reload1.c b/gcc/reload1.c index cfacc78..f2cb20d 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -9732,9 +9732,15 @@ reload_combine_note_store (dst, set) if (GET_CODE (dst) != REG) return; regno += REGNO (dst); + /* note_stores might have stripped a STRICT_LOW_PART, so we have to be - careful with registers / register parts that are not full words. */ - if (size < (unsigned) UNITS_PER_WORD) + careful with registers / register parts that are not full words. + + Similarly for ZERO_EXTRACT and SIGN_EXTRACT. */ + if (GET_CODE (set) != SET + || GET_CODE (SET_DEST (set)) == ZERO_EXTRACT + || GET_CODE (SET_DEST (set)) == SIGN_EXTRACT + || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART) { reg_state[regno].use_index = -1; reg_state[regno].store_ruid = reload_combine_ruid; @@ -10056,6 +10062,17 @@ move2add_note_store (dst, set) { rtx src = SET_SRC (set); + /* Indicate that this register has been recently written to, + but the exact contents are not available. */ + if (GET_CODE (SET_DEST (set)) == ZERO_EXTRACT + || GET_CODE (SET_DEST (set)) == SIGN_EXTRACT + || GET_CODE (SET_DEST (set)) == STRICT_LOW_PART) + { + reg_set_luid[regno] = move2add_luid; + reg_offset[regno] = dst; + return; + } + reg_mode[regno] = mode; switch (GET_CODE (src)) { |
