OSDN Git Service

PR 43562
authorjiez <jiez@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 02:44:10 +0000 (02:44 +0000)
committerjiez <jiez@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 02:44:10 +0000 (02:44 +0000)
* reload.h (caller_save_initialized_p): Declare.
* toplev.c (backend_init_target): Don't call
init_caller_save but set caller_save_initialized_p
to false.
* caller-save.c (caller_save_initialized_p): Define.
(init_caller_save): Check caller_save_initialized_p.
* ira.c (ira): Call init_caller_save if flag_caller_saves.

testsuite/
PR 43562
* gcc.dg/pr43562.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157849 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/caller-save.c
gcc/ira.c
gcc/reload.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr43562.c [new file with mode: 0644]
gcc/toplev.c

index 503e8b7..bd21821 100644 (file)
@@ -1,3 +1,14 @@
+2010-03-31  Jie Zhang  <jie@codesourcery.com>
+
+       PR 43562
+       * reload.h (caller_save_initialized_p): Declare.
+       * toplev.c (backend_init_target): Don't call
+       init_caller_save but set caller_save_initialized_p
+       to false.
+       * caller-save.c (caller_save_initialized_p): Define.
+       (init_caller_save): Check caller_save_initialized_p.
+       * ira.c (ira): Call init_caller_save if flag_caller_saves.
+
 2010-03-30  Alexandre Oliva  <aoliva@redhat.com>
 
        PR debug/42977
index dbfd42a..7a00dbd 100644 (file)
@@ -40,6 +40,9 @@ along with GCC; see the file COPYING3.  If not see
 #include "df.h"
 #include "ggc.h"
 
+/* True if caller-save has been initialized.  */
+bool caller_save_initialized_p;
+
 /* Call used hard registers which can not be saved because there is no
    insn for this.  */
 HARD_REG_SET no_caller_save_reg_set;
@@ -208,6 +211,11 @@ init_caller_save (void)
   rtx address;
   int i, j;
 
+  if (caller_save_initialized_p)
+    return;
+
+  caller_save_initialized_p = true;
+
   CLEAR_HARD_REG_SET (no_caller_save_reg_set);
   /* First find all the registers that we need to deal with and all
      the modes that they can have.  If we can't find a mode to use,
index b4397c8..ce0f0da 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3127,6 +3127,9 @@ ira (FILE *f)
 
   timevar_push (TV_IRA);
 
+  if (flag_caller_saves)
+    init_caller_save ();
+
   if (flag_ira_verbose < 10)
     {
       internal_flag_ira_verbose = flag_ira_verbose;
index 5d8375b..883d141 100644 (file)
@@ -349,6 +349,9 @@ extern bool elimination_target_reg_p (rtx);
 /* Deallocate the reload register used by reload number R.  */
 extern void deallocate_reload_reg (int r);
 
+/* True if caller-save has been reinitialized.  */
+extern bool caller_save_initialized_p;
+
 /* Functions in caller-save.c:  */
 
 /* Initialize for caller-save.  */
index 818dbde..70ab74b 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-31  Jie Zhang  <jie@codesourcery.com>
+
+       PR 43562
+       * gcc.dg/pr43562.c: New test.
+
 2010-03-30  Jason Merrill  <jason@redhat.com>
 
        PR c++/43076
diff --git a/gcc/testsuite/gcc.dg/pr43562.c b/gcc/testsuite/gcc.dg/pr43562.c
new file mode 100644 (file)
index 0000000..352c107
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-options "-O0" } */
+/* { dg-do compile } */
+
+extern unsigned foo (void);
+extern void bar (void);
+
+__attribute__ ((optimize ("O2")))
+void bak ()
+{
+  unsigned a;
+  while (1)
+    {
+      a = foo ();
+      while (a)
+       {
+         a &= 1;
+         bar ();
+       }
+    }
+}
index a789383..68a1b8c 100644 (file)
@@ -2191,8 +2191,8 @@ backend_init_target (void)
 
   /* We may need to recompute regno_save_code[] and regno_restore_code[]
      after a mode change as well.  */
-  if (flag_caller_saves)
-    init_caller_save ();
+  caller_save_initialized_p = false;
+
   expand_dummy_function_end ();
 }