]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390.c (s390_preferred_reload_class): Return NO_REGS for invalid symbolic addresses.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Tue, 29 Mar 2011 15:20:55 +0000 (15:20 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 29 Mar 2011 15:20:55 +0000 (15:20 +0000)
2011-03-29  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_preferred_reload_class): Return NO_REGS
for invalid symbolic addresses.
(s390_secondary_reload): Don't use s390_check_symref_alignment for
larl operands.

From-SVN: r171676

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

index b254c3308f7bdecb8fb265ceca3c7788c7cc43c9..8d900a01b7ac022656de008a79792a963456d030 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-29  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_preferred_reload_class): Return NO_REGS
+       for invalid symbolic addresses.
+       (s390_secondary_reload): Don't use s390_check_symref_alignment for
+       larl operands.
+
 2011-03-28  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR target/47553
index c18845e617968b8749d48fbbbf8ac12202a7358e..9c8a3600689f1a671ec36d1aeb76f2e10228d2cc 100644 (file)
@@ -2830,12 +2830,16 @@ s390_preferred_reload_class (rtx op, enum reg_class rclass)
         it is most likely being used as an address, so
         prefer ADDR_REGS.  If 'class' is not a superset
         of ADDR_REGS, e.g. FP_REGS, reject this reload.  */
-      case PLUS:
       case LABEL_REF:
       case SYMBOL_REF:
       case CONST:
+       if (!legitimate_reload_constant_p (op))
+          return NO_REGS;
+       /* fallthrough */
+      case PLUS:
+       /* load address will be used.  */
        if (reg_class_subset_p (ADDR_REGS, rclass))
-          return ADDR_REGS;
+         return ADDR_REGS;
        else
          return NO_REGS;
 
@@ -2951,12 +2955,16 @@ s390_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
 
   if (TARGET_Z10)
     {
+      HOST_WIDE_INT offset;
+      rtx symref;
+
       /* On z10 several optimizer steps may generate larl operands with
         an odd addend.  */
       if (in_p
-         && s390_symref_operand_p (x, NULL, NULL)
+         && s390_symref_operand_p (x, &symref, &offset)
          && mode == Pmode
-         && !s390_check_symref_alignment (x, 2))
+         && !SYMBOL_REF_ALIGN1_P (symref)
+         && (offset & 1) == 1)
        sri->icode = ((mode == DImode) ? CODE_FOR_reloaddi_larl_odd_addend_z10
                      : CODE_FOR_reloadsi_larl_odd_addend_z10);