diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2000-08-09 05:17:12 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2000-08-09 05:17:12 +0000 |
commit | 2696f6a43d6cb8810564ed9d7d38518676608fb5 (patch) | |
tree | 2da01318328791fb33a611fc5a9c1b622ecc3487 /gcc/caller-save.c | |
parent | e50d29325290fcdeb23a690511ae61c9e89802f1 (diff) | |
download | gcc-2696f6a43d6cb8810564ed9d7d38518676608fb5.zip gcc-2696f6a43d6cb8810564ed9d7d38518676608fb5.tar.gz gcc-2696f6a43d6cb8810564ed9d7d38518676608fb5.tar.bz2 |
caller-save.c (mark_referenced_regs): Mark partially-overwritten multi-word registers.
* caller-save.c (mark_referenced_regs): Mark partially-overwritten
multi-word registers.
From-SVN: r35579
Diffstat (limited to 'gcc/caller-save.c')
-rw-r--r-- | gcc/caller-save.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/caller-save.c b/gcc/caller-save.c index f939de7..8a411e1 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -512,7 +512,14 @@ mark_referenced_regs (x) x = SET_DEST (x); code = GET_CODE (x); if (code == REG || code == PC || code == CC0 - || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG)) + || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG + /* If we're setting only part of a multi-word register, + we shall mark it as referenced, because the words + that are not being set should be restored. */ + && ((GET_MODE_SIZE (GET_MODE (x)) + >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) + || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) + <= UNITS_PER_WORD)))) return; } if (code == MEM || code == SUBREG) |