re PR rtl-optimization/45352 (ICE: in reset_sched_cycles_in_current_ebb, at sel-sched.c:7058)

PR rtl-optimization/45352
	PR rtl-optimization/46521
	PR rtl-optimization/46522
	* sel-sched.c (reset_sched_cycles_in_current_ebb): Recheck the DFA state
	on the last iteration of the advancing loop.
	(sel_sched_region_1): Propagate the rescheduling bit to the next block
	also for empty blocks.

	* gcc.dg/pr46521.c: New.
	* gcc.dg/pr46522.c: New.

From-SVN: r168164
This commit is contained in:
Andrey Belevantsev 2010-12-22 10:46:53 +03:00 committed by Andrey Belevantsev
parent d7ab2512cd
commit d7f672ecf6
5 changed files with 91 additions and 8 deletions

View file

@ -1,3 +1,13 @@
2010-12-22 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/45352
PR rtl-optimization/46521
PR rtl-optimization/46522
* sel-sched.c (reset_sched_cycles_in_current_ebb): Recheck the DFA state
on the last iteration of the advancing loop.
(sel_sched_region_1): Propagate the rescheduling bit to the next block
also for empty blocks.
2010-12-22 Alexandre Oliva <aoliva@redhat.com>
PR debug/46724

View file

@ -7053,7 +7053,17 @@ reset_sched_cycles_in_current_ebb (void)
&& haifa_cost > 0
&& estimate_insn_cost (insn, curr_state) == 0)
break;
}
/* When the data dependency stall is longer than the DFA stall,
it could be that after the longer stall the insn will again
become unavailable to the DFA restrictions. Looks strange
but happens e.g. on x86-64. So recheck DFA on the last
iteration. */
if (after_stall
&& real_insn
&& haifa_cost == 0)
haifa_cost = estimate_insn_cost (insn, curr_state);
}
haifa_clock += i;
if (sched_verbose >= 2)
@ -7504,21 +7514,23 @@ sel_sched_region_1 (void)
{
basic_block bb = EBB_FIRST_BB (i);
if (sel_bb_empty_p (bb))
{
bitmap_clear_bit (blocks_to_reschedule, bb->index);
continue;
}
if (bitmap_bit_p (blocks_to_reschedule, bb->index))
{
if (! bb_ends_ebb_p (bb))
bitmap_set_bit (blocks_to_reschedule, bb_next_bb (bb)->index);
if (sel_bb_empty_p (bb))
{
bitmap_clear_bit (blocks_to_reschedule, bb->index);
continue;
}
clear_outdated_rtx_info (bb);
if (sel_insn_is_speculation_check (BB_END (bb))
&& JUMP_P (BB_END (bb)))
bitmap_set_bit (blocks_to_reschedule,
BRANCH_EDGE (bb)->dest->index);
}
else if (INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0)
else if (! sel_bb_empty_p (bb)
&& INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0)
bitmap_set_bit (blocks_to_reschedule, bb->index);
}

View file

@ -1,3 +1,11 @@
2010-12-22 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/45352
PR rtl-optimization/46521
PR rtl-optimization/46522
* gcc.dg/pr46521.c: New.
* gcc.dg/pr46522.c: New.
2010-12-21 Ian Lance Taylor <iant@google.com>
* go.test/go-test.exp: Clear runtests around invocation of

View file

@ -0,0 +1,20 @@
/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
/* { dg-options "-Os -fselective-scheduling2 -fsel-sched-pipelining -fprofile-generate -fno-early-inlining" } */
static void bmp_iter_next (int *bi)
{
*bi >>= 1;
}
int bmp_iter_set (int *, int);
void bitmap_clear (void);
void bitmap_initialize_stat (void);
void df_md_alloc (int bi, int bb_index, int bb_info)
{
for (; bmp_iter_set (&bi, bb_index); bmp_iter_next (&bi))
if (bb_info)
bitmap_clear ();
else
bitmap_initialize_stat ();
}

View file

@ -0,0 +1,33 @@
/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
/* { dg-options "-O3 -fkeep-inline-functions -fsel-sched-pipelining -fselective-scheduling2 -funroll-loops" } */
struct S
{
unsigned i, j;
};
static inline void
bar (struct S *s)
{
if (s->i++ == 1)
{
s->i = 0;
s->j++;
}
}
void
foo1 (struct S *s)
{
bar (s);
}
void
foo2 (struct S s1, struct S s2, int i)
{
while (s1.i != s2.i) {
if (i)
*(unsigned *) 0 |= (1U << s1.i);
bar (&s1);
}
}