RFA: patch cheking dangerous insns in sched-ebb.c
Richard Henderson
rth@redhat.com
Sun Feb 23 03:06:00 GMT 2003
On Sat, Feb 22, 2003 at 11:00:29AM -0500, Vladimir N. Makarov wrote:
> The function may add at most one dependency for insn to a jump (because the
> nested loop contains break when the dependency has been found). The loop is
> really not necessary for all insn except PFREE_CANDIDATE.
I see.
> Meanwhile, I improved the code (made loop explicitly only for
> PFREE_CANDIDATEs) and attached it.
That is clearer, thanks.
> It can be improved more by creating and
> modifying an additional structure (containing all preceding blocks and
> adding a loop through the blocks in block_has_similiar_load. The algorithm
> will be still potentially n**2 but faster).
This seems easy enough to accomplish. Untested, but...
> + static void
> + add_deps_for_risky_insns (head, tail)
> + rtx head, tail;
> + {
> + rtx insn, prev;
> + int class;
> + rtx last_jump = NULL_RTX;
> + rtx prev_head = PREV_INSN (head);
> + rtx next_tail = NEXT_INSN (tail);
basic_block last_block = NULL, bb;
> +
> + for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
> + if (GET_CODE (insn) == JUMP_INSN)
{
bb = BLOCK_FOR_INSN (insn);
bb->aux = last_block;
last_block = bb;
> + last_jump = insn;
}
> + else if (INSN_P (insn) && last_jump != NULL_RTX)
> + {
> + class = haifa_classify_insn (insn);
switch (class)
{
case PFREE_CANDIDATE:
if (flag_schedule_speculative_load)
{
for (bb = last_block; bb ; bb = bb->aux)
if (!block_has_similiar_load (bb, insn))
break;
if (!bb)
break;
prev = bb->end;
}
/* FALLTHRU */
case TRAP_RISKY:
case IRISKY:
case PRISKY_CANDIDATE:
> + /* ??? We could implement better checking PRISKY_CANDIATEs
> + analogous to sched-rgn.c. */
> + /* We can not change the mode of the backward
> + dependency because REG_DEP_ANTI has the lowest
> + rank. */
> + if (add_dependence (insn, last_jump, REG_DEP_ANTI))
> + add_forward_dependence (last_jump, insn, REG_DEP_ANTI);
break;
default:
break;
> + }
> + }
/* Maintain the invariant that bb->aux is clear after use. */
while (last_block)
{
bb = last_block->aux;
last_block->aux = NULL;
last_block = bb;
}
> + }
> +
Seem good?
r~
More information about the Gcc-patches
mailing list