On Tue, Oct 16, 2012 at 4:30 PM, Joern Rennecke
<[email protected]> wrote:
> Quoting Zdenek Dvorak <[email protected]>:
>
>> no -- you should also test that latch contains no active insns. I.e.,
>> factorize
>> out whatever forwarder_block_p does except for the test
>> "(dest->loop_father->header == dest)" test,
>
>
> Like this?
ISTR the tree level has a predicate like can_remove_forwarder_block
and forwarder_block_p. I suppose on the RTL level they are merged
for cfgcleanup.
> * basic-block.h (forwarder_block_p_1): Declare.
> * cfgrtl.c (orwarder_block_p_1): New function, factored out of ...
> (orwarder_block_p): ... here.
>
>
>
>
>
>
> --- cfgrtl.c-old 2012-10-16 15:21:06.025532573 +0100
> +++ cfgrtl.c 2012-10-16 15:23:23.135529867 +0100
> @@ -541,10 +541,9 @@ flow_active_insn_p (const_rtx insn)
>
> /* Return true if the block has no effect and only forwards control flow to
> its single destination. */
> -/* FIXME: Make this a cfg hook. */
>
> bool
> -forwarder_block_p (const_basic_block bb)
> +forwarder_block_p_1 (const_basic_block bb)
> {
> rtx insn;
>
> @@ -552,6 +551,24 @@ forwarder_block_p (const_basic_block bb)
> || !single_succ_p (bb))
> return false;
>
> + for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
> + if (INSN_P (insn) && flow_active_insn_p (insn))
> + return false;
> +
> + return (!INSN_P (insn)
> + || (JUMP_P (insn) && simplejump_p (insn))
> + || !flow_active_insn_p (insn));
> +}
> +
> +/* Likewise, but protect loop latches, headers and preheaders. */
> +/* FIXME: Make this a cfg hook. */
> +
> +bool
> +forwarder_block_p (const_basic_block bb)
> +{
> + if (!forwarder_block_p_1 (bb))
> + return false;
> +
> /* Protect loop latches, headers and preheaders. */
> if (current_loops)
> {
> @@ -563,13 +580,7 @@ forwarder_block_p (const_basic_block bb)
> return false;
> }
>
> - for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
> - if (INSN_P (insn) && flow_active_insn_p (insn))
> - return false;
> -
> - return (!INSN_P (insn)
> - || (JUMP_P (insn) && simplejump_p (insn))
> - || !flow_active_insn_p (insn));
> + return true;
> }
>
> /* Return nonzero if we can reach target from src by falling through. */
>