]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR rtl-optimization/46585 (ICE: SIGSEGV in vinsn_create (sel-sched-ir...
authorAndrey Belevantsev <abel@ispras.ru>
Thu, 7 Apr 2011 06:56:47 +0000 (10:56 +0400)
committerAndrey Belevantsev <abel@gcc.gnu.org>
Thu, 7 Apr 2011 06:56:47 +0000 (10:56 +0400)
        Backport from mainline
        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.

From-SVN: r172082

gcc/ChangeLog
gcc/sel-sched-ir.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr46585.c [new file with mode: 0644]

index 64abc47f02f0f66476637a6916288f087f91d1b8..5568761922bd6867b8165a61e9e75b771144e9a6 100644 (file)
@@ -1,3 +1,14 @@
+2011-04-07  Andrey Belevantsev  <abel@ispras.ru>
+
+       Backport from mainline
+       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.
+
 2011-04-07  Andrey Belevantsev  <abel@ispras.ru>
 
        Backport from mainline
index 0c40eb539f20b63aefd74482ca872bc9c14ef433..526072604c331b374ed1c0fc0dbed4ed6d96bf8d 100644 (file)
@@ -939,6 +939,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)
@@ -1172,6 +1173,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
@@ -1253,9 +1257,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);
 }
@@ -5624,7 +5631,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);
index da3e64187bbc2e9c904f9192d3095b52ba5f5a2f..b95bbfbf7f44d418f3fd0233401ab8ebc5e9f6a1 100644 (file)
@@ -1,3 +1,11 @@
+2011-04-07  Andrey Belevantsev  <abel@ispras.ru>
+
+       Backport from mainline
+       2010-11-25  Alexander Monakov  <amonakov@ispras.ru>
+
+        PR rtl-optimization/46585
+       * gcc.dg/pr46585.c: New.
+
 2011-04-07  Andrey Belevantsev  <abel@ispras.ru>
 
        Backport from mainline
diff --git a/gcc/testsuite/gcc.dg/pr46585.c b/gcc/testsuite/gcc.dg/pr46585.c
new file mode 100644 (file)
index 0000000..32befdf
--- /dev/null
@@ -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;
+    }
+}