diff options
author | Dmitry Melnik <dm@ispras.ru> | 2011-04-08 11:58:23 +0000 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2011-04-08 15:58:23 +0400 |
commit | 7c1f0b40206bed9fc4b62a04ca9f49c8b9cea4dc (patch) | |
tree | 1fa6f7e96f6d0620dc73960c0139cec0127e43c0 /gcc | |
parent | ea4d630fef8a13e6fa4a1db99b1d1057a0bd7a72 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/sel-sched.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr48235.c | 57 |
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; +} |