2013-01-11 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Jan 2013 16:43:49 +0000 (16:43 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Jan 2013 16:43:49 +0000 (16:43 +0000)
PR target/55719
* config/s390/s390.c (s390_preferred_reload_class): Do not return
NO_REGS for larl operands.
(s390_reload_larl_operand): Use s390_load_address instead of
emit_move_insn.

2013-01-11  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

PR target/55719
* gcc.target/s390/pr55719.c: New testcase.

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

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

index ea6987d..238ec2f 100644 (file)
@@ -1,3 +1,11 @@
+2013-01-11  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       PR target/55719
+       * config/s390/s390.c (s390_preferred_reload_class): Do not return
+       NO_REGS for larl operands.
+       (s390_reload_larl_operand): Use s390_load_address instead of
+       emit_move_insn.
+
 2013-01-11  Richard Biener  <rguenther@suse.de>
 
        * tree-cfg.c (verify_node_sharing_1): Split out from ...
index 621f1bc..7e87dcd 100644 (file)
@@ -2978,9 +2978,23 @@ 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 CONST:
+       /* A larl operand with odd addend will get fixed via secondary
+          reload.  So don't request it to be pushed into literal
+          pool.  */
+       if (TARGET_CPU_ZARCH
+           && GET_CODE (XEXP (op, 0)) == PLUS
+           && GET_CODE (XEXP (XEXP(op, 0), 0)) == SYMBOL_REF
+           && GET_CODE (XEXP (XEXP(op, 0), 1)) == CONST_INT)
+         {
+           if (reg_class_subset_p (ADDR_REGS, rclass))
+             return ADDR_REGS;
+           else
+             return NO_REGS;
+         }
+       /* fallthrough */
       case LABEL_REF:
       case SYMBOL_REF:
-      case CONST:
        if (!legitimate_reload_constant_p (op))
           return NO_REGS;
        /* fallthrough */
@@ -3061,7 +3075,7 @@ s390_reload_larl_operand (rtx reg, rtx addr, rtx scratch)
        emit_move_insn (scratch, symref);
 
       /* Increment the address using la in order to avoid clobbering cc.  */
-      emit_move_insn (reg, gen_rtx_PLUS (Pmode, scratch, const1_rtx));
+      s390_load_address (reg, gen_rtx_PLUS (Pmode, scratch, const1_rtx));
     }
 }
 
index df0378f..2d46339 100644 (file)
@@ -1,4 +1,9 @@
-2012-01-11  Richard Guenther  <rguenther@suse.de>
+2013-01-11  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       PR target/55719
+       * gcc.target/s390/pr55719.c: New testcase.
+
+2013-01-11  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/44061
        * gcc.dg/pr44061.c: New testcase.