S/390 Fix secondary reload issue with store/load relative operands.
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Tue, 19 May 2015 14:49:35 +0000 (14:49 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 19 May 2015 14:49:35 +0000 (14:49 +0000)
We need a scratch register for loading from or storing to a symbolic
memory reference where we cannot use the load/store relative
instructions for.  However, the check currently fails to handle
floating point modes in GPRs correctly.

gcc/
* config/s390/s390.c (s390_secondary_reload): Fix check for
          load/store relative.

From-SVN: r223368

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

index 2f3b2303c39f922238c14aed1a38f303624d75b5..8ae08e6dc70d4e1c29dccec49ff9e3347cb931c7 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
+
+       * config/s390/s390.c (s390_secondary_reload): Fix check for
+       load/store relative.
+
 2015-05-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * recog.h: Increase MAX_RECOG_ALTERNATIVES.  Change type of
index e9a4e70856c5b366ce253e762453bba641e80a8f..2c83c00582d6e8f78dd5a288c5daadd703c88533 100644 (file)
@@ -3141,17 +3141,15 @@ s390_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
        sri->icode = ((mode == DImode) ? CODE_FOR_reloaddi_larl_odd_addend_z10
                      : CODE_FOR_reloadsi_larl_odd_addend_z10);
 
-      /* On z10 we need a scratch register when moving QI, TI or floating
-        point mode values from or to a memory location with a SYMBOL_REF
-        or if the symref addend of a SI or DI move is not aligned to the
-        width of the access.  */
+      /* Handle all the (mem (symref)) accesses we cannot use the z10
+        instructions for.  */
       if (MEM_P (x)
          && s390_loadrelative_operand_p (XEXP (x, 0), NULL, NULL)
-         && (mode == QImode || mode == TImode || FLOAT_MODE_P (mode)
-             || (!TARGET_ZARCH && mode == DImode)
-             || ((mode == HImode || mode == SImode || mode == DImode)
-                 && (!s390_check_symref_alignment (XEXP (x, 0),
-                                                   GET_MODE_SIZE (mode))))))
+         && (mode == QImode
+             || !reg_classes_intersect_p (GENERAL_REGS, rclass)
+             || GET_MODE_SIZE (mode) > UNITS_PER_WORD
+             || !s390_check_symref_alignment (XEXP (x, 0),
+                                              GET_MODE_SIZE (mode))))
        {
 #define __SECONDARY_RELOAD_CASE(M,m)                                   \
          case M##mode:                                                 \