s390.c (s390_preferred_reload_class): Return NO_REGS for invalid symbolic addresses.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 24 Mar 2011 16:38:24 +0000 (16:38 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 24 Mar 2011 16:38:24 +0000 (16:38 +0000)
2011-03-24  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: r171405

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

index 20181f70c1247432593a88e51854d9165c8f2ebb..64e26a09d552310410cd7230c2709994bb35609b 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-24  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-24  Eric Botcazou  <ebotcazou@adacore.com>
 
        * fold-const.c (fold_ternary_loc): Preserve the location (if any) of
index 2a299c2aa5a12b5d48aa6008fb72f9b056f78451..7e84ff1fc273618788b79be0ad246174f5006db9 100644 (file)
@@ -2974,12 +2974,16 @@ s390_preferred_reload_class (rtx op, reg_class_t 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;
 
@@ -3097,12 +3101,16 @@ s390_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
 
   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);