summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJie Zhang <jie@codesourcery.com>2010-03-31 02:44:10 +0000
committerJie Zhang <jiez@gcc.gnu.org>2010-03-31 02:44:10 +0000
commitdc12b70ef2ff960820c183f4911c9d426e34eac3 (patch)
treebdc83c7c76ffc03569d38f8626f441aecbd9e452
parentd500b6cfc85cbd6d7a042796689d796d498fc468 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/caller-save.c8
-rw-r--r--gcc/ira.c3
-rw-r--r--gcc/reload.h3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr43562.c20
-rw-r--r--gcc/toplev.c4
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 ();
}