aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-08-08 19:25:16 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-08-08 19:25:16 -0400
commitbeb5a9b86e2cae18089a05b77b818e6649ccc770 (patch)
tree16b9c74e2ac3e971203912e196493901f9c091a1 /gcc/reload.c
parent1d19ceaaea3ea90a4c5b91ca1a126a38d210dda1 (diff)
downloadgcc-beb5a9b86e2cae18089a05b77b818e6649ccc770.zip
gcc-beb5a9b86e2cae18089a05b77b818e6649ccc770.tar.gz
gcc-beb5a9b86e2cae18089a05b77b818e6649ccc770.tar.bz2
(find_reloads): Force reload for paradoxical SUBREG of MEM if
BYTES_BIG_ENDIAN. From-SVN: r7875
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index b1727c8..e48ce28 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -2566,7 +2566,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|| GET_CODE (operand) == PLUS
/* We must force a reload of paradoxical SUBREGs
of a MEM because the alignment of the inner value
- may not be enough to do the outer reference.
+ may not be enough to do the outer reference. On
+ big-endian machines, it may also reference outside
+ the object.
On machines that extend byte operations and we have a
SUBREG where both the inner and outer modes are no wider
@@ -2584,6 +2586,7 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
< BIGGEST_ALIGNMENT)
&& (GET_MODE_SIZE (operand_mode[i])
> GET_MODE_SIZE (GET_MODE (operand))))
+ || (GET_CODE (operand) == MEM && BYTES_BIG_ENDIAN)
#ifdef LOAD_EXTEND_OP
|| (GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD
&& (GET_MODE_SIZE (GET_MODE (operand))