S/390 Fix secondary reload issue with store/load relative operands.
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 May 2015 14:49:35 +0000 (14:49 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
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.

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

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

index 2f3b230..8ae08e6 100644 (file)
@@ -1,5 +1,10 @@
 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
        alternative_mask to uint64_t.
 
index e9a4e70..2c83c00 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:                                                 \