From 4e4c89ecdf082d0ea8a21af9c78b969a989cf62d Mon Sep 17 00:00:00 2001 From: jiez Date: Wed, 31 Mar 2010 02:44:10 +0000 Subject: [PATCH] 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. 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 | 11 +++++++++++ gcc/caller-save.c | 8 ++++++++ gcc/ira.c | 3 +++ gcc/reload.h | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr43562.c | 20 ++++++++++++++++++++ gcc/toplev.c | 4 ++-- 7 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr43562.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 503e8b701e5..bd218210652 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2010-03-31 Jie Zhang + + 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 PR debug/42977 diff --git a/gcc/caller-save.c b/gcc/caller-save.c index dbfd42aa793..7a00dbd72ae 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -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, diff --git a/gcc/ira.c b/gcc/ira.c index b4397c884f3..ce0f0da0fcd 100644 --- 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; diff --git a/gcc/reload.h b/gcc/reload.h index 5d8375b9589..883d1416ee3 100644 --- a/gcc/reload.h +++ b/gcc/reload.h @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 818dbdefb0e..70ab74b81c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-31 Jie Zhang + + PR 43562 + * gcc.dg/pr43562.c: New test. + 2010-03-30 Jason Merrill PR c++/43076 diff --git a/gcc/testsuite/gcc.dg/pr43562.c b/gcc/testsuite/gcc.dg/pr43562.c new file mode 100644 index 00000000000..352c107a935 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr43562.c @@ -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 (); + } + } +} diff --git a/gcc/toplev.c b/gcc/toplev.c index a789383cfdc..68a1b8c15ed 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -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 (); } -- 2.11.0