re PR rtl-optimization/55719 (ICE: Segmentation fault)
authorAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 11 Jan 2013 16:43:49 +0000 (16:43 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 11 Jan 2013 16:43:49 +0000 (16:43 +0000)
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  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

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

From-SVN: r195109

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

index ea6987d4a2b3af573bf1480b9db1925e7e06ae5e..238ec2f4b1dd2fca81109397077e4c5f207f01e7 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 621f1bc4490da957a5b3074bacff0a1cbf06fd7c..7e87dcd547d2ffa6cfdf241707189bf21a8dd738 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 df0378f1d123a834de99021781c097a0b76f8a29..2d463399120a8ea0346c1df7d84c85c8611ce0dc 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.