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
This commit is contained in:
parent
ea4d630fef
commit
7c1f0b4020
|
@ -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>
|
2011-04-08 Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
|
||||||
PR rtl-optimization/48302
|
PR rtl-optimization/48302
|
||||||
|
|
|
@ -6369,8 +6369,11 @@ code_motion_process_successors (insn_t insn, av_set_t orig_ops,
|
||||||
the iterator becomes invalid. We need to try again. */
|
the iterator becomes invalid. We need to try again. */
|
||||||
if (BLOCK_FOR_INSN (insn)->index != old_index
|
if (BLOCK_FOR_INSN (insn)->index != old_index
|
||||||
|| EDGE_COUNT (bb->succs) != old_succs)
|
|| EDGE_COUNT (bb->succs) != old_succs)
|
||||||
|
{
|
||||||
|
insn = sel_bb_end (BLOCK_FOR_INSN (insn));
|
||||||
goto rescan;
|
goto rescan;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_CHECKING
|
#ifdef ENABLE_CHECKING
|
||||||
/* Here, RES==1 if original expr was found at least for one of the
|
/* Here, RES==1 if original expr was found at least for one of the
|
||||||
|
@ -6587,21 +6590,37 @@ code_motion_path_driver (insn_t insn, av_set_t orig_ops, ilist_t path,
|
||||||
if (!expr)
|
if (!expr)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
rtx last_insn = PREV_INSN (insn);
|
||||||
|
bool added_to_path;
|
||||||
|
|
||||||
gcc_assert (insn == sel_bb_end (bb));
|
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 -
|
/* Add bb tail to PATH (but it doesn't make any sense if it's a bb_head -
|
||||||
it's already in PATH then). */
|
it's already in PATH then). */
|
||||||
if (insn != first_insn)
|
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
|
/* Process_successors should be able to find at least one
|
||||||
successor for which code_motion_path_driver returns TRUE. */
|
successor for which code_motion_path_driver returns TRUE. */
|
||||||
res = code_motion_process_successors (insn, orig_ops,
|
res = code_motion_process_successors (insn, orig_ops,
|
||||||
path, static_params);
|
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. */
|
/* Remove bb tail from path. */
|
||||||
if (insn != first_insn)
|
if (added_to_path)
|
||||||
ilist_remove (&path);
|
ilist_remove (&path);
|
||||||
|
|
||||||
if (res != 1)
|
if (res != 1)
|
||||||
|
|
|
@ -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>
|
2011-04-08 Alexander Monakov <amonakov@ispras.ru>
|
||||||
|
|
||||||
PR rtl-optimization/48302
|
PR rtl-optimization/48302
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue