2010-09-09 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Sep 2010 11:29:10 +0000 (11:29 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Sep 2010 11:29:10 +0000 (11:29 +0000)
* config/s390/s390.c (s390_symref_operand_p): Return false for
literal pool references.
(s390_check_qrst_address): Update caller.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164075 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.c

index c50575b..8e05709 100644 (file)
@@ -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
index 56cbac2..32e5197 100644 (file)
@@ -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;
     }