re PR target/65249 (unable to find a register to spill in class 'R0_REGS' when compil...
authorKaz Kojima <kkojima@gcc.gnu.org>
Tue, 3 Mar 2015 23:51:55 +0000 (23:51 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Tue, 3 Mar 2015 23:51:55 +0000 (23:51 +0000)
PR target/65249
* config/sh/sh.md (symGOT_load): Use R0 reg for operands[2] when
  called for __stack_chk_guard symbol.

From-SVN: r221165

gcc/ChangeLog
gcc/config/sh/sh.md

index 10f36fa3558747ceb3b5f4cd36b4c91f239a586a..2108eb0b2dce0410bb6a61a8a343142f5e9fe720 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-03  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/65249
+       * config/sh/sh.md (symGOT_load): Use R0 reg for operands[2] when
+       called for __stack_chk_guard symbol.
+
 2015-03-03  DJ Delorie  <dj@redhat.com>
 
        * config/rl78/rl78-real.md (*addqi_real): Allow SADDR types for
index 2435ec94a029b6d04b8c7dd7514ef1048163ede5..24ddc9e75897dbe6220a264d711bbfcc37094edc 100644 (file)
@@ -10690,10 +10690,26 @@ label:
   ""
 {
   rtx mem;
+  bool stack_chk_guard_p = false;
 
   operands[2] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
   operands[3] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
 
+  if (!TARGET_SHMEDIA
+      && flag_stack_protect
+      && GET_CODE (operands[1]) == CONST
+      && GET_CODE (XEXP (operands[1], 0)) == UNSPEC
+      && GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == SYMBOL_REF
+      && strcmp (XSTR (XVECEXP (XEXP (operands[1], 0), 0, 0), 0),
+                "__stack_chk_guard") == 0)
+    stack_chk_guard_p = true;
+
+  /* Use R0 to avoid long R0 liveness which stack-protector tends to
+     produce.  */
+  if (! sh_lra_flag
+      && stack_chk_guard_p && ! reload_in_progress && ! reload_completed)
+    operands[2] = gen_rtx_REG (Pmode, R0_REG);
+
   if (TARGET_SHMEDIA)
     {
       rtx reg = operands[2];
@@ -10721,13 +10737,7 @@ label:
      insn to avoid combining (set A (plus rX r12)) and (set op0 (mem A))
      when rX is a GOT address for the guard symbol.  Ugly but doesn't
      matter because this is a rare situation.  */
-  if (!TARGET_SHMEDIA
-      && flag_stack_protect
-      && GET_CODE (operands[1]) == CONST
-      && GET_CODE (XEXP (operands[1], 0)) == UNSPEC
-      && GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == SYMBOL_REF
-      && strcmp (XSTR (XVECEXP (XEXP (operands[1], 0), 0, 0), 0),
-                "__stack_chk_guard") == 0)
+  if (stack_chk_guard_p)
     emit_insn (gen_chk_guard_add (operands[3], operands[2]));
   else
     emit_move_insn (operands[3], gen_rtx_PLUS (Pmode, operands[2],