haifa-sched.c (recompute_todo_spec): Simplify and correct the code checking for a clobber of a condition register...

* haifa-sched.c (recompute_todo_spec): Simplify and correct the
	code checking for a clobber of a condition register when deciding
	whether to predicate.

From-SVN: r181806
This commit is contained in:
Bernd Schmidt 2011-11-29 15:58:05 +00:00 committed by Bernd Schmidt
parent 4d5ae4eadc
commit 89ff14c265
2 changed files with 19 additions and 26 deletions

View File

@ -1,3 +1,9 @@
2011-11-29 Bernd Schmidt <bernds@codesourcery.com>
* haifa-sched.c (recompute_todo_spec): Simplify and correct the
code checking for a clobber of a condition register when deciding
whether to predicate.
2011-11-29 Diego Novillo <dnovillo@google.com>
* gimple.c (gimple_call_set_cannot_inline): Move from gimple.h.

View File

@ -1178,33 +1178,20 @@ recompute_todo_spec (rtx next)
regno = REGNO (XEXP (cond, 0));
/* Find the last scheduled insn that modifies the condition register.
If we have a true dependency on it, it sets it to the correct value,
otherwise it must be a later insn scheduled in-between that clobbers
the condition. */
FOR_EACH_VEC_ELT_REVERSE (rtx, scheduled_insns, i, prev)
{
sd_iterator_def sd_it;
dep_t dep;
HARD_REG_SET t;
bool found;
We can stop looking once we find the insn we depend on through the
REG_DEP_CONTROL; if the condition register isn't modified after it,
we know that it still has the right value. */
if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
FOR_EACH_VEC_ELT_REVERSE (rtx, scheduled_insns, i, prev)
{
HARD_REG_SET t;
find_all_hard_reg_sets (prev, &t);
if (!TEST_HARD_REG_BIT (t, regno))
continue;
found = false;
FOR_EACH_DEP (next, SD_LIST_RES_BACK, sd_it, dep)
{
if (DEP_PRO (dep) == prev && DEP_TYPE (dep) == REG_DEP_TRUE)
{
found = true;
break;
}
}
if (!found)
return HARD_DEP;
break;
}
find_all_hard_reg_sets (prev, &t);
if (TEST_HARD_REG_BIT (t, regno))
return HARD_DEP;
if (prev == pro)
break;
}
if (ORIG_PAT (next) == NULL_RTX)
{
ORIG_PAT (next) = PATTERN (next);