]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/48542 (unchanged variables in code which calls setjmp may...
authorHans-Peter Nilsson <hp@axis.com>
Fri, 17 Jun 2011 11:20:01 +0000 (11:20 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Fri, 17 Jun 2011 11:20:01 +0000 (11:20 +0000)
PR rtl-optimization/48542
* reload.c (find_equiv_reg): Stop looking when finding a
setjmp-type call.
* reload1.c (reload_as_needed): Invalidate all reload
registers when crossing a setjmp-type call.

From-SVN: r175144

gcc/ChangeLog
gcc/reload.c
gcc/reload1.c

index 8d79502068b0b66b62a387038cba85eee48249f7..09164bed7a370542866d3fd65f2da6e58f19d6bd 100644 (file)
@@ -1,3 +1,14 @@
+2011-06-17  Hans-Peter Nilsson  <hp@axis.com>
+
+       Backport from mainline
+       2011-06-17  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR rtl-optimization/48542
+       * reload.c (find_equiv_reg): Stop looking when finding a
+       setjmp-type call.
+       * reload1.c (reload_as_needed): Invalidate all reload
+       registers when crossing a setjmp-type call.
+
 2011-06-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.md (return_internal): Adjust 'length' attribute.
index d188233e5049cbda8a23a31583036eb68a633332..eadaa50b335d11b76d88a14bee53b67b3f3b6ae6 100644 (file)
@@ -6731,6 +6731,15 @@ find_equiv_reg (rtx goal, rtx insn, enum reg_class rclass, int other,
          || num > PARAM_VALUE (PARAM_MAX_RELOAD_SEARCH_INSNS))
        return 0;
 
+      /* Don't reuse register contents from before a setjmp-type
+        function call; on the second return (from the longjmp) it
+        might have been clobbered by a later reuse.  It doesn't
+        seem worthwhile to actually go and see if it is actually
+        reused even if that information would be readily available;
+        just don't reuse it across the setjmp call.  */
+      if (CALL_P (p) && find_reg_note (p, REG_SETJMP, NULL_RTX))
+       return 0;
+
       if (NONJUMP_INSN_P (p)
          /* If we don't want spill regs ...  */
          && (! (reload_reg_p != 0
index d579dc51885dcb5810b617b7ae2b9086536044b3..070ffeee209d11ea486fd546f18d9cdaa52a32e5 100644 (file)
@@ -4428,6 +4428,13 @@ reload_as_needed (int live_known)
        {
          AND_COMPL_HARD_REG_SET (reg_reloaded_valid, call_used_reg_set);
          AND_COMPL_HARD_REG_SET (reg_reloaded_valid, reg_reloaded_call_part_clobbered);
+
+         /* If this is a call to a setjmp-type function, we must not
+            reuse any reload reg contents across the call; that will
+            just be clobbered by other uses of the register in later
+            code, before the longjmp.  */
+         if (find_reg_note (insn, REG_SETJMP, NULL_RTX))
+           CLEAR_HARD_REG_SET (reg_reloaded_valid);
        }
     }