haifa-sched.c (has_edge_p, [...]): Remove maintenance overhead.

* haifa-sched.c (has_edge_p, prev_non_location_insn, check_cfg):
	Remove maintenance overhead.
	(haifa_sched_init, sched_finish): Update.

From-SVN: r178987
This commit is contained in:
Maxim Kuvyrkov 2011-09-19 21:26:26 +00:00 committed by Maxim Kuvyrkov
parent b5344bf45d
commit 4ec5affac9
2 changed files with 6 additions and 142 deletions

View File

@ -1,3 +1,9 @@
2011-09-19 Maxim Kuvyrkov <maxim@codesourcery.com>
* haifa-sched.c (has_edge_p, prev_non_location_insn, check_cfg):
Remove maintenance overhead.
(haifa_sched_init, sched_finish): Update.
2011-09-19 Uros Bizjak <ubizjak@gmail.com>
* config/i386/mmx.md (*mov<mode>_internal_rex64): Use if_then_else RTX

View File

@ -717,10 +717,6 @@ static void sched_remove_insn (rtx);
static void clear_priorities (rtx, rtx_vec_t *);
static void calc_priorities (rtx_vec_t);
static void add_jump_dependencies (rtx, rtx);
#ifdef ENABLE_CHECKING
static int has_edge_p (VEC(edge,gc) *, int);
static void check_cfg (rtx, rtx);
#endif
#endif /* INSN_SCHEDULING */
@ -4303,13 +4299,6 @@ haifa_sched_init (void)
sched_create_empty_bb = sched_create_empty_bb_1;
haifa_recovery_bb_ever_added_p = false;
#ifdef ENABLE_CHECKING
/* This is used preferably for finding bugs in check_cfg () itself.
We must call sched_bbs_init () before check_cfg () because check_cfg ()
assumes that the last insn in the last bb has a non-null successor. */
check_cfg (0, 0);
#endif
nr_begin_data = nr_begin_control = nr_be_in_data = nr_be_in_control = 0;
before_recovery = 0;
after_recovery = 0;
@ -4378,12 +4367,6 @@ sched_finish (void)
regstat_free_calls_crossed ();
dfa_finish ();
#ifdef ENABLE_CHECKING
/* After reload ia64 backend clobbers CFG, so can't check anything. */
if (!reload_completed)
check_cfg (0, 0);
#endif
}
/* Free all delay_pair structures that were recorded. */
@ -5970,131 +5953,6 @@ bb_note (basic_block bb)
return note;
}
#ifdef ENABLE_CHECKING
/* Helper function for check_cfg.
Return nonzero, if edge vector pointed to by EL has edge with TYPE in
its flags. */
static int
has_edge_p (VEC(edge,gc) *el, int type)
{
edge e;
edge_iterator ei;
FOR_EACH_EDGE (e, ei, el)
if (e->flags & type)
return 1;
return 0;
}
/* Search back, starting at INSN, for an insn that is not a
NOTE_INSN_VAR_LOCATION. Don't search beyond HEAD, and return it if
no such insn can be found. */
static inline rtx
prev_non_location_insn (rtx insn, rtx head)
{
while (insn != head && NOTE_P (insn)
&& NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION)
insn = PREV_INSN (insn);
return insn;
}
/* Check few properties of CFG between HEAD and TAIL.
If HEAD (TAIL) is NULL check from the beginning (till the end) of the
instruction stream. */
static void
check_cfg (rtx head, rtx tail)
{
rtx next_tail;
basic_block bb = 0;
int not_first = 0, not_last;
if (head == NULL)
head = get_insns ();
if (tail == NULL)
tail = get_last_insn ();
next_tail = NEXT_INSN (tail);
do
{
not_last = head != tail;
if (not_first)
gcc_assert (NEXT_INSN (PREV_INSN (head)) == head);
if (not_last)
gcc_assert (PREV_INSN (NEXT_INSN (head)) == head);
if (LABEL_P (head)
|| (NOTE_INSN_BASIC_BLOCK_P (head)
&& (!not_first
|| (not_first && !LABEL_P (PREV_INSN (head))))))
{
gcc_assert (bb == 0);
bb = BLOCK_FOR_INSN (head);
if (bb != 0)
gcc_assert (BB_HEAD (bb) == head);
else
/* This is the case of jump table. See inside_basic_block_p (). */
gcc_assert (LABEL_P (head) && !inside_basic_block_p (head));
}
if (bb == 0)
{
gcc_assert (!inside_basic_block_p (head));
head = NEXT_INSN (head);
}
else
{
gcc_assert (inside_basic_block_p (head)
|| NOTE_P (head));
gcc_assert (BLOCK_FOR_INSN (head) == bb);
if (LABEL_P (head))
{
head = NEXT_INSN (head);
gcc_assert (NOTE_INSN_BASIC_BLOCK_P (head));
}
else
{
if (control_flow_insn_p (head))
{
gcc_assert (prev_non_location_insn (BB_END (bb), head)
== head);
if (any_uncondjump_p (head))
gcc_assert (EDGE_COUNT (bb->succs) == 1
&& BARRIER_P (NEXT_INSN (head)));
else if (any_condjump_p (head))
gcc_assert (/* Usual case. */
(EDGE_COUNT (bb->succs) > 1
&& !BARRIER_P (NEXT_INSN (head)))
/* Or jump to the next instruction. */
|| (EDGE_COUNT (bb->succs) == 1
&& (BB_HEAD (EDGE_I (bb->succs, 0)->dest)
== JUMP_LABEL (head))));
}
if (BB_END (bb) == head)
{
if (EDGE_COUNT (bb->succs) > 1)
gcc_assert (control_flow_insn_p (prev_non_location_insn
(head, BB_HEAD (bb)))
|| has_edge_p (bb->succs, EDGE_COMPLEX));
bb = 0;
}
head = NEXT_INSN (head);
}
}
not_first = 1;
}
while (head != next_tail);
gcc_assert (bb == 0);
}
#endif /* ENABLE_CHECKING */
/* Extend data structures for logical insn UID. */
void
sched_extend_luids (void)