aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2010-11-25 13:05:00 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2010-11-25 13:05:00 +0300
commit9ef1bf719b91f4409273912c50162b722ae89b66 (patch)
tree1c3f871216986df312c309d8e8c8af7acfa667b4 /gcc
parentd787f788f8ac10ab768befcb5b2d4b0c4b288286 (diff)
downloadgcc-9ef1bf719b91f4409273912c50162b722ae89b66.zip
gcc-9ef1bf719b91f4409273912c50162b722ae89b66.tar.gz
gcc-9ef1bf719b91f4409273912c50162b722ae89b66.tar.bz2
re PR rtl-optimization/46585 (ICE: SIGSEGV in vinsn_create (sel-sched-ir.c:1189) with -fno-dce -fschedule-insns -fselective-scheduling)
PR rtl-optimization/46585 * sel-sched-ir.c (return_regset_to_pool): Verify that RS is not NULL. (vinsn_init): Skip initialization of dependencies for local NOPs. (vinsn_delete): Don't try to free regsets for local NOPs. (setup_nop_and_exit_insns): Change definition of nop_pattern. testsuite: * gcc.dg/pr46585.c: New. From-SVN: r167141
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/sel-sched-ir.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr46585.c11
4 files changed, 35 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c92812b..c01dd54 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2010-11-25 Alexander Monakov <amonakov@ispras.ru>
+ PR rtl-optimization/46585
+ * sel-sched-ir.c (return_regset_to_pool): Verify that RS is not NULL.
+ (vinsn_init): Skip computation of dependencies for local NOPs.
+ (vinsn_delete): Don't try to free regsets for local NOPs.
+ (setup_nop_and_exit_insns): Change definition of nop_pattern.
+
+2010-11-25 Alexander Monakov <amonakov@ispras.ru>
+
PR rtl-optimization/46602
* sel-sched-ir.c (maybe_tidy_empty_bb): Move checking ...
(tidy_control_flow): Here.
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index 231358b..7956cd8 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -942,6 +942,7 @@ get_clear_regset_from_pool (void)
void
return_regset_to_pool (regset rs)
{
+ gcc_assert (rs);
regset_pool.diff--;
if (regset_pool.n == regset_pool.s)
@@ -1175,6 +1176,9 @@ vinsn_init (vinsn_t vi, insn_t insn, bool force_unique_p)
VINSN_COUNT (vi) = 0;
vi->cost = -1;
+ if (INSN_NOP_P (insn))
+ return;
+
if (DF_INSN_UID_SAFE_GET (INSN_UID (insn)) != NULL)
init_id_from_df (VINSN_ID (vi), insn, force_unique_p);
else
@@ -1256,9 +1260,12 @@ vinsn_delete (vinsn_t vi)
{
gcc_assert (VINSN_COUNT (vi) == 0);
- return_regset_to_pool (VINSN_REG_SETS (vi));
- return_regset_to_pool (VINSN_REG_USES (vi));
- return_regset_to_pool (VINSN_REG_CLOBBERS (vi));
+ if (!INSN_NOP_P (VINSN_INSN_RTX (vi)))
+ {
+ return_regset_to_pool (VINSN_REG_SETS (vi));
+ return_regset_to_pool (VINSN_REG_USES (vi));
+ return_regset_to_pool (VINSN_REG_CLOBBERS (vi));
+ }
free (vi);
}
@@ -5607,7 +5614,7 @@ setup_nop_and_exit_insns (void)
gcc_assert (nop_pattern == NULL_RTX
&& exit_insn == NULL_RTX);
- nop_pattern = gen_nop ();
+ nop_pattern = constm1_rtx;
start_sequence ();
emit_insn (nop_pattern);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index efe68e9..37c5b45 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-25 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/46585
+ * gcc.dg/pr46585.c: New.
+
2010-11-24 Richard Henderson <rth@redhat.com>
* lib/target-supports.exp (vect_widen_sum_hi_to_si_pattern,
diff --git a/gcc/testsuite/gcc.dg/pr46585.c b/gcc/testsuite/gcc.dg/pr46585.c
new file mode 100644
index 0000000..32befdf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr46585.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-fno-dce -fschedule-insns -fselective-scheduling" } */
+void
+foo (void)
+{
+ switch (0)
+ {
+ default:
+ break;
+ }
+}