aboutsummaryrefslogtreecommitdiff
path: root/gcc/caller-save.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2000-08-09 05:17:12 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-08-09 05:17:12 +0000
commit2696f6a43d6cb8810564ed9d7d38518676608fb5 (patch)
tree2da01318328791fb33a611fc5a9c1b622ecc3487 /gcc/caller-save.c
parente50d29325290fcdeb23a690511ae61c9e89802f1 (diff)
downloadgcc-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.c9
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)