On 08/23/2018 01:18 PM, Richard Biener wrote:
> This removes verify_no_unreachable_blocks and implements checking
> for unreachable blocks in inverted_post_order_compute by simply
> looking if we reach a block without predecessors that is not the
> entry block.
> 

I think that doesn't detect unreachable cyles: say you have blocks A and
B, and A -> B -> A.

> This solves a problem I ran into when (ab-)using BB_REACHABLE
> in a pass and I got comparison failues because of -fchecking vs.
> -fno-checking.  It also should speed up checking builds.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> Tom, does this make sense?
> 

The intent of the check I added was to verify the assumption stated in
the comment. I don't know how serious it is if the assumption is violated.

Thanks,
- Tom

> Thanks,
> Richard.
> 
> 2018-08-23  Richard Biener  <rguent...@suse.de>
> 
>       * cfganal.h (verify_no_unreachable_blocks): Remove.
>       * cfganal.c (verify_no_unreachable_blocks): Likewise.
>       (inverted_post_order_compute): Do not call verify_no_unreachable_blocks
>       instead assert when we reach a block without predecessor that is not
>       the entry block.
> 
> diff --git a/gcc/cfganal.c b/gcc/cfganal.c
> index 3b80758e8f2..baf9f0562f9 100644
> --- a/gcc/cfganal.c
> +++ b/gcc/cfganal.c
> @@ -186,18 +186,6 @@ find_unreachable_blocks (void)
>    free (worklist);
>  }
>  
> -/* Verify that there are no unreachable blocks in the current function.  */
> -
> -void
> -verify_no_unreachable_blocks (void)
> -{
> -  find_unreachable_blocks ();
> -
> -  basic_block bb;
> -  FOR_EACH_BB_FN (bb, cfun)
> -    gcc_assert ((bb->flags & BB_REACHABLE) != 0);
> -}
> -
>  
>  /* Functions to access an edge list with a vector representation.
>     Enough data is kept such that given an index number, the
> @@ -800,9 +788,6 @@ inverted_post_order_compute (vec<int> *post_order,
>    basic_block bb;
>    post_order->reserve_exact (n_basic_blocks_for_fn (cfun));
>  
> -  if (flag_checking)
> -    verify_no_unreachable_blocks ();
> -
>    /* Allocate stack for back-tracking up CFG.  */
>    auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (cfun) + 1);
>  
> @@ -866,7 +851,10 @@ inverted_post_order_compute (vec<int> *post_order,
>                     time, check its predecessors.  */
>               stack.quick_push (ei_start (pred->preds));
>                else
> -             post_order->quick_push (pred->index);
> +             {
> +               gcc_assert (pred->index == ENTRY_BLOCK);
> +               post_order->quick_push (pred->index);
> +             }
>              }
>            else
>              {
> diff --git a/gcc/cfganal.h b/gcc/cfganal.h
> index 122c665f7f6..ac3fe8f4617 100644
> --- a/gcc/cfganal.h
> +++ b/gcc/cfganal.h
> @@ -50,7 +50,6 @@ private:
>  
>  extern bool mark_dfs_back_edges (void);
>  extern void find_unreachable_blocks (void);
> -extern void verify_no_unreachable_blocks (void);
>  struct edge_list * create_edge_list (void);
>  void free_edge_list (struct edge_list *);
>  void print_edge_list (FILE *, struct edge_list *);
> 

Reply via email to