]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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:55:24 +0000 (23:55 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Tue, 3 Mar 2015 23:55:24 +0000 (23:55 +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: r221166

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

index ba28a0c4058cb218eb11c8410e18c6fa43be13a2..4f9ce5cccecac3cf10c60b74387ebaf914d9bde0 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  Georg-Johann Lay  <avr@gjlay.de>
 
        PR target/64331
index 40e7d45f11b34a7990cc410029dd457495be5e14..9327c20030a093aabe1a98c97517f9360a3c4da4 100644 (file)
@@ -10164,10 +10164,25 @@ 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 (stack_chk_guard_p && ! reload_in_progress && ! reload_completed)
+    operands[2] = gen_rtx_REG (Pmode, R0_REG);
+
   if (TARGET_SHMEDIA)
     {
       rtx reg = operands[2];
@@ -10195,13 +10210,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],