diff options
author | Jie Zhang <jie@codesourcery.com> | 2010-03-31 02:44:10 +0000 |
---|---|---|
committer | Jie Zhang <jiez@gcc.gnu.org> | 2010-03-31 02:44:10 +0000 |
commit | dc12b70ef2ff960820c183f4911c9d426e34eac3 (patch) | |
tree | bdc83c7c76ffc03569d38f8626f441aecbd9e452 | |
parent | d500b6cfc85cbd6d7a042796689d796d498fc468 (diff) | |
download | gcc-dc12b70ef2ff960820c183f4911c9d426e34eac3.tar.gz |
re PR other/43562 (GCC ICE on optimize attribute)
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.
From-SVN: r157849
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/caller-save.c | 8 | ||||
-rw-r--r-- | gcc/ira.c | 3 | ||||
-rw-r--r-- | gcc/reload.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr43562.c | 20 | ||||
-rw-r--r-- | gcc/toplev.c | 4 |
7 files changed, 52 insertions, 2 deletions
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 <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 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 <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 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 (); } |