re PR rtl-optimization/48235 (ICE: SIGSEGV in has_dependence_p (sel-sched-ir.c:3263...
authorDmitry Melnik <dm@ispras.ru>
Fri, 8 Apr 2011 11:58:23 +0000 (11:58 +0000)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 8 Apr 2011 11:58:23 +0000 (15:58 +0400)
PR rtl-optimization/48235
* sel-sched.c (code_motion_process_successors): Recompute the last
insn in basic block if control flow changed.
(code_motion_path_driver): Ditto.  Recompute the first insn as well.
Update condition for ilist_remove.

testsuite:
* gcc.dg/pr48235.c: New.

From-SVN: r172177

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

index b5248e07fe1d1e466fdda23094599a1083f09744..75ebe6f71193f04af89ce450d334c60a2210d8e6 100644 (file)
@@ -1,3 +1,11 @@
+2011-04-08  Dmitry Melnik  <dm@ispras.ru>
+
+       PR rtl-optimization/48235
+       * sel-sched.c (code_motion_process_successors): Recompute the last
+       insn in basic block if control flow changed.
+       (code_motion_path_driver): Ditto.  Recompute the first insn as well.
+       Update condition for ilist_remove.
+
 2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/48302
index 48fb2e0134d3d3b33c9e96abe46863806aa3a01a..f409c4fa2ccb14acf48a493144910a0a0bfc681c 100644 (file)
@@ -6369,7 +6369,10 @@ code_motion_process_successors (insn_t insn, av_set_t orig_ops,
          the iterator becomes invalid.  We need to try again.  */
       if (BLOCK_FOR_INSN (insn)->index != old_index
           || EDGE_COUNT (bb->succs) != old_succs)
-        goto rescan;
+        {
+          insn = sel_bb_end (BLOCK_FOR_INSN (insn));
+          goto rescan;
+        }
     }
 
 #ifdef ENABLE_CHECKING
@@ -6587,21 +6590,37 @@ code_motion_path_driver (insn_t insn, av_set_t orig_ops, ilist_t path,
   if (!expr)
     {
       int res;
+      rtx last_insn = PREV_INSN (insn);
+      bool added_to_path;
 
       gcc_assert (insn == sel_bb_end (bb));
 
       /* Add bb tail to PATH (but it doesn't make any sense if it's a bb_head -
         it's already in PATH then).  */
       if (insn != first_insn)
-       ilist_add (&path, insn);
+       {
+         ilist_add (&path, insn);
+         added_to_path = true;
+       }
+      else
+        added_to_path = false;
 
       /* Process_successors should be able to find at least one
         successor for which code_motion_path_driver returns TRUE.  */
       res = code_motion_process_successors (insn, orig_ops,
                                             path, static_params);
 
+      /* Jump in the end of basic block could have been removed or replaced
+         during code_motion_process_successors, so recompute insn as the
+         last insn in bb.  */
+      if (NEXT_INSN (last_insn) != insn)
+        {
+          insn = sel_bb_end (bb);
+          first_insn = sel_bb_head (bb);
+        }
+
       /* Remove bb tail from path.  */
-      if (insn != first_insn)
+      if (added_to_path)
        ilist_remove (&path);
 
       if (res != 1)
index 762558c34f860e797ef9cc6debb5c97a93f511e0..65440e2b2d933180df4064075a0e5c09b5f0a3b6 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-08  Dmitry Melnik  <dm@ispras.ru>
+
+       PR rtl-optimization/48235
+       * gcc.dg/pr48235.c: New.
+
 2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/48302
diff --git a/gcc/testsuite/gcc.dg/pr48235.c b/gcc/testsuite/gcc.dg/pr48235.c
new file mode 100644 (file)
index 0000000..8ec5edb
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O -fno-guess-branch-probability -fpeel-loops -freorder-blocks-and-partition -fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2" } */
+struct intC
+{
+  short x;
+  short y;
+};
+
+int size_x;
+
+static inline int
+TileDiffXY (int x, int y)
+{
+  return (y * size_x) + x;
+}
+
+struct HangarTileTable
+{
+  struct intC ti;
+  int hangar_num;
+};
+
+struct AirportSpec
+{
+  struct HangarTileTable *depot_table;
+  int size;
+};
+
+void Get ();
+struct AirportSpec dummy;
+
+static inline int
+GetRotatedTileFromOffset (int *a, struct intC tidc)
+{
+  if (!*a)
+    Get ();
+  switch (*a)
+    {
+    case 0:
+      return (tidc.y << size_x) + tidc.x;
+    case 1:
+      return TileDiffXY (tidc.y, dummy.size - tidc.x);
+    case 2:
+      return TileDiffXY (tidc.x, dummy.size - tidc.y);
+    case 3:
+      return TileDiffXY (dummy.size - 1, tidc.x);
+    }
+}
+
+int
+GetHangarNum (int *a)
+{
+       int i;
+  for (i = 0; i < dummy.size; i++)
+    if (GetRotatedTileFromOffset (a, dummy.depot_table[i].ti))
+      return dummy.depot_table[i].hangar_num;
+}