===================================================================
@@ -1180,33 +1180,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;
-
- find_all_hard_reg_sets (prev, &t);
- if (!TEST_HARD_REG_BIT (t, regno))
- continue;
+ 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;
- 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);