Disable bounds checking for edge iterators in release compiler

Richard Guenther richard.guenther@gmail.com
Tue Jun 8 09:48:00 GMT 2010


On Tue, Jun 8, 2010 at 9:17 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> oprofile shows as one of highest sample count the following sanity check:
>               :/* Advance the iterator to the next element.  */
>               :static inline void
>               :ei_next (edge_iterator *i)
>               :{
>  6578  0.4915 :  gcc_assert (i->index < EDGE_COUNT (ei_container (*i)));
>   201  0.0150 :  i->index++;
>               :}
>
> I guess it is mostly cache miss that would be later attributed elsewhere, but
> it also seems to me that this kind of bounds checking is something we want to
> omit in release compiler (same was as we disable VEC range checking and such).
> The probability that we will get useful error here is relatively low compared
> to amount of checks we spread across compiler by inlining the function.
>
> I tested the attached patch.  It reduce size of stripped cc1 binary (with WHOPR
> build) from 11944192 to 11939616 bytes (4.5KB) and time needed to build cc1
> binary from 10m29s to 10m19s. With non-WHOPR this should be more effective
> since we are worse on optimizing out unnecesary checks, but I didn't verified.
>
> Bootstrapped/regtested x86_64-linux. If this seems to make sense, I will look at the
> other inline functions sanity checks.  I think in gimple.h we also have few quite
> good candidates for ENABLE_CHECKING.

I thought I've gone over gimple.h at some point ...

Ok.

Thanks,
Richard.

> Honza
>
>        * basic-block.h (single_succ_edge, single_pred_edge, ei_container,
>        ei_next, ei_prev): Do sanity checking with ENABLE_CHECKING only.
> Index: basic-block.h
> ===================================================================
> --- basic-block.h       (revision 160382)
> +++ basic-block.h       (working copy)
> @@ -554,7 +554,9 @@ single_pred_p (const_basic_block bb)
>  static inline edge
>  single_succ_edge (const_basic_block bb)
>  {
> +#ifdef ENABLE_CHECKING
>   gcc_assert (single_succ_p (bb));
> +#endif
>   return EDGE_SUCC (bb, 0);
>  }
>
> @@ -564,7 +566,9 @@ single_succ_edge (const_basic_block bb)
>  static inline edge
>  single_pred_edge (const_basic_block bb)
>  {
> +#ifdef ENABLE_CHECKING
>   gcc_assert (single_pred_p (bb));
> +#endif
>   return EDGE_PRED (bb, 0);
>  }
>
> @@ -596,7 +600,9 @@ typedef struct {
>  static inline VEC(edge,gc) *
>  ei_container (edge_iterator i)
>  {
> +#ifdef ENABLE_CHECKING
>   gcc_assert (i.container);
> +#endif
>   return *i.container;
>  }
>
> @@ -647,7 +653,9 @@ ei_one_before_end_p (edge_iterator i)
>  static inline void
>  ei_next (edge_iterator *i)
>  {
> +#ifdef ENABLE_CHECKING
>   gcc_assert (i->index < EDGE_COUNT (ei_container (*i)));
> +#endif
>   i->index++;
>  }
>
> @@ -655,7 +663,9 @@ ei_next (edge_iterator *i)
>  static inline void
>  ei_prev (edge_iterator *i)
>  {
> +#ifdef ENABLE_CHECKING
>   gcc_assert (i->index > 0);
> +#endif
>   i->index--;
>  }
>
>



More information about the Gcc-patches mailing list