Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/gpl3/gcc/dist/gcc Apply upstream revision 175141: s...



details:   https://anonhg.NetBSD.org/src/rev/15efab45b47f
branches:  trunk
changeset: 779770:15efab45b47f
user:      martin <martin%NetBSD.org@localhost>
date:      Sun Jun 17 13:43:30 2012 +0000

description:
Apply upstream revision 175141: setjmp vs. unchanged register values;
should fix PR toolchain/45837.

diffstat:

 external/gpl3/gcc/dist/gcc/ChangeLog |  11 +++++++++++
 external/gpl3/gcc/dist/gcc/reload.c  |   9 +++++++++
 external/gpl3/gcc/dist/gcc/reload1.c |   7 +++++++
 3 files changed, 27 insertions(+), 0 deletions(-)

diffs (57 lines):

diff -r 383e39e17e16 -r 15efab45b47f external/gpl3/gcc/dist/gcc/ChangeLog
--- a/external/gpl3/gcc/dist/gcc/ChangeLog      Sun Jun 17 08:09:29 2012 +0000
+++ b/external/gpl3/gcc/dist/gcc/ChangeLog      Sun Jun 17 13:43:30 2012 +0000
@@ -5,6 +5,17 @@
        * config/pa/pa.h (LEGITIMATE_CONSTANT_P): Return false for
        TLS_MODEL_GLOBAL_DYNAMIC and TLS_MODEL_LOCAL_DYNAMIC symbol references.
 
+2011-06-17  Hans-Peter Nilsson  <hp%axis.com@localhost>
+
+       Backport from mainline
+       2011-06-17  Hans-Peter Nilsson  <hp%axis.com@localhost>
+
+       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-04-28  Release Manager
 
        * GCC 4.5.3 released.
diff -r 383e39e17e16 -r 15efab45b47f external/gpl3/gcc/dist/gcc/reload.c
--- a/external/gpl3/gcc/dist/gcc/reload.c       Sun Jun 17 08:09:29 2012 +0000
+++ b/external/gpl3/gcc/dist/gcc/reload.c       Sun Jun 17 13:43:30 2012 +0000
@@ -6795,6 +6795,15 @@
          || 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
diff -r 383e39e17e16 -r 15efab45b47f external/gpl3/gcc/dist/gcc/reload1.c
--- a/external/gpl3/gcc/dist/gcc/reload1.c      Sun Jun 17 08:09:29 2012 +0000
+++ b/external/gpl3/gcc/dist/gcc/reload1.c      Sun Jun 17 13:43:30 2012 +0000
@@ -4487,6 +4487,13 @@
        {
          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);
        }
     }
 



Home | Main Index | Thread Index | Old Index