aboutsummaryrefslogtreecommitdiff
path: root/gcc/recog.c
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-05-22 09:21:25 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2013-05-22 09:21:25 +0000
commit98409b518574b9b27d6879b8ade2327fe4a44fd2 (patch)
tree0b4a5011bb6106a2adaa12a48980ed7061ca6006 /gcc/recog.c
parent5951f9dfd2f76609cd8f95177d2740416d753245 (diff)
downloadgcc-98409b518574b9b27d6879b8ade2327fe4a44fd2.zip
gcc-98409b518574b9b27d6879b8ade2327fe4a44fd2.tar.gz
gcc-98409b518574b9b27d6879b8ade2327fe4a44fd2.tar.bz2
recog.c (offsettable_address_addr_space_p): Fix calculation of address mode.
gcc/ * recog.c (offsettable_address_addr_space_p): Fix calculation of address mode. Move pointer mode initialization to the same place. From-SVN: r199188
Diffstat (limited to 'gcc/recog.c')
-rw-r--r--gcc/recog.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/recog.c b/gcc/recog.c
index 5356b8d..0e6277d 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -1953,9 +1953,6 @@ offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y,
(strictp ? strict_memory_address_addr_space_p
: memory_address_addr_space_p);
unsigned int mode_sz = GET_MODE_SIZE (mode);
-#ifdef POINTERS_EXTEND_UNSIGNED
- enum machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
-#endif
if (CONSTANT_ADDRESS_P (y))
return 1;
@@ -1966,6 +1963,13 @@ offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y,
if (mode_dependent_address_p (y, as))
return 0;
+ enum machine_mode address_mode = GET_MODE (y);
+ if (address_mode == VOIDmode)
+ address_mode = targetm.addr_space.address_mode (as);
+#ifdef POINTERS_EXTEND_UNSIGNED
+ enum machine_mode pointer_mode = targetm.addr_space.pointer_mode (as);
+#endif
+
/* ??? How much offset does an offsettable BLKmode reference need?
Clearly that depends on the situation in which it's being used.
However, the current situation in which we test 0xffffffff is
@@ -1981,7 +1985,7 @@ offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y,
int good;
y1 = *y2;
- *y2 = plus_constant (GET_MODE (y), *y2, mode_sz - 1);
+ *y2 = plus_constant (address_mode, *y2, mode_sz - 1);
/* Use QImode because an odd displacement may be automatically invalid
for any wider mode. But it should be valid for a single byte. */
good = (*addressp) (QImode, y, as);
@@ -2002,20 +2006,20 @@ offsettable_address_addr_space_p (int strictp, enum machine_mode mode, rtx y,
if (GET_CODE (y) == LO_SUM
&& mode != BLKmode
&& mode_sz <= GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT)
- z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
- plus_constant (GET_MODE (y), XEXP (y, 1),
+ z = gen_rtx_LO_SUM (address_mode, XEXP (y, 0),
+ plus_constant (address_mode, XEXP (y, 1),
mode_sz - 1));
#ifdef POINTERS_EXTEND_UNSIGNED
/* Likewise for a ZERO_EXTEND from pointer_mode. */
else if (POINTERS_EXTEND_UNSIGNED > 0
&& GET_CODE (y) == ZERO_EXTEND
&& GET_MODE (XEXP (y, 0)) == pointer_mode)
- z = gen_rtx_ZERO_EXTEND (GET_MODE (y),
+ z = gen_rtx_ZERO_EXTEND (address_mode,
plus_constant (pointer_mode, XEXP (y, 0),
mode_sz - 1));
#endif
else
- z = plus_constant (GET_MODE (y), y, mode_sz - 1);
+ z = plus_constant (address_mode, y, mode_sz - 1);
/* Use QImode because an odd displacement may be automatically invalid
for any wider mode. But it should be valid for a single byte. */