aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDmitry Melnik <dm@ispras.ru>2011-04-08 11:58:23 +0000
committerAlexander Monakov <amonakov@gcc.gnu.org>2011-04-08 15:58:23 +0400
commit7c1f0b40206bed9fc4b62a04ca9f49c8b9cea4dc (patch)
tree1fa6f7e96f6d0620dc73960c0139cec0127e43c0 /gcc
parentea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72 (diff)
downloadgcc-7c1f0b40206bed9fc4b62a04ca9f49c8b9cea4dc.zip
gcc-7c1f0b40206bed9fc4b62a04ca9f49c8b9cea4dc.tar.gz
gcc-7c1f0b40206bed9fc4b62a04ca9f49c8b9cea4dc.tar.bz2
re PR rtl-optimization/48235 (ICE: SIGSEGV in has_dependence_p (sel-sched-ir.c:3263) with -fselective-scheduling2 and custom flags)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/sel-sched.c25
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr48235.c57
4 files changed, 92 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5248e0..75ebe6f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 48fb2e0..f409c4f 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 762558c..65440e2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8ec5edb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr48235.c
@@ -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;
+}