aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2010-09-09 11:29:10 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2010-09-09 11:29:10 +0000
commit98635b04ce12838412d2216a1f55d152346c9ff0 (patch)
tree8975493229ad3b4e861bc37ba57e660ca479cb8d
parent06f29237d759b49656326add6d7c8e1c2c34049a (diff)
downloadgcc-98635b04ce12838412d2216a1f55d152346c9ff0.zip
gcc-98635b04ce12838412d2216a1f55d152346c9ff0.tar.gz
gcc-98635b04ce12838412d2216a1f55d152346c9ff0.tar.bz2
s390.c (s390_symref_operand_p): Return false for literal pool references.
2010-09-09 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> * config/s390/s390.c (s390_symref_operand_p): Return false for literal pool references. (s390_check_qrst_address): Update caller. From-SVN: r164075
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/s390/s390.c14
2 files changed, 15 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c50575b..8e05709 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-09-09 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_symref_operand_p): Return false for
+ literal pool references.
+ (s390_check_qrst_address): Update caller.
+
2010-09-09 Uros Bizjak <ubizjak@gmail.com>
* config/i386/predicates.md (ext_register_operand): Check that
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 56cbac2..32e5197 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -2092,7 +2092,8 @@ s390_legitimate_address_without_index_p (rtx op)
/* Return true if ADDR is of kind symbol_ref or symbol_ref + const_int
and return these parts in SYMREF and ADDEND. You can pass NULL in
- SYMREF and/or ADDEND if you are not interested in these values. */
+ SYMREF and/or ADDEND if you are not interested in these values.
+ Literal pool references are *not* considered symbol references. */
static bool
s390_symref_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
@@ -2105,6 +2106,7 @@ s390_symref_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
if (GET_CODE (addr) == PLUS)
{
if (GET_CODE (XEXP (addr, 0)) == SYMBOL_REF
+ && !CONSTANT_POOL_ADDRESS_P (XEXP (addr, 0))
&& CONST_INT_P (XEXP (addr, 1)))
{
tmpaddend = INTVAL (XEXP (addr, 1));
@@ -2114,7 +2116,7 @@ s390_symref_operand_p (rtx addr, rtx *symref, HOST_WIDE_INT *addend)
return false;
}
else
- if (GET_CODE (addr) != SYMBOL_REF)
+ if (GET_CODE (addr) != SYMBOL_REF || CONSTANT_POOL_ADDRESS_P (addr))
return false;
if (symref)
@@ -2140,12 +2142,14 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
/* This check makes sure that no symbolic address (except literal
pool references) are accepted by the R or T constraints. */
if (s390_symref_operand_p (op, NULL, NULL))
+ return 0;
+
+ /* Ensure literal pool references are only accepted if LIT_POOL_OK. */
+ if (!lit_pool_ok)
{
- if (!lit_pool_ok)
- return 0;
if (!s390_decompose_address (op, &addr))
return 0;
- if (!addr.literal_pool)
+ if (addr.literal_pool)
return 0;
decomposed = true;
}