diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2010-09-09 11:29:10 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2010-09-09 11:29:10 +0000 |
commit | 98635b04ce12838412d2216a1f55d152346c9ff0 (patch) | |
tree | 8975493229ad3b4e861bc37ba57e660ca479cb8d /gcc | |
parent | 06f29237d759b49656326add6d7c8e1c2c34049a (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 14 |
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; } |