> Hi.
> 
> Following patch adds new sanitization checks for profile_quality.
> Problem is that zero initialization of a struct with profile_count will
> lead to an invalid counter. This can help to catch them.
> 
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
> 
> Ready to be installed?
OK,
thanks!
Honza
> Martin

> >From edec114cf1dd29bb571855a80e1b45ae040da200 Mon Sep 17 00:00:00 2001
> From: marxin <mli...@suse.cz>
> Date: Wed, 10 Jan 2018 14:46:08 +0100
> Subject: [PATCH] Add new verification for profile-count.h.
> 
> gcc/ChangeLog:
> 
> 2018-01-12  Martin Liska  <mli...@suse.cz>
> 
>       * profile-count.h (enum profile_quality): Use 0 as invalid
>       enum value of profile_quality.
> ---
>  gcc/profile-count.h | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/gcc/profile-count.h b/gcc/profile-count.h
> index 3c5f720ee81..7a43917ebbc 100644
> --- a/gcc/profile-count.h
> +++ b/gcc/profile-count.h
> @@ -30,27 +30,27 @@ enum profile_quality {
>       or may not match reality.  It is local to function and can not be 
> compared
>       inter-procedurally.  Never used by probabilities (they are always 
> local).
>     */
> -  profile_guessed_local = 0,
> +  profile_guessed_local = 1,
>    /* Profile was read by feedback and was 0, we used local heuristics to 
> guess
>       better.  This is the case of functions not run in profile fedback.
>       Never used by probabilities.  */
> -  profile_guessed_global0 = 1,
> +  profile_guessed_global0 = 2,
>  
>    /* Same as profile_guessed_global0 but global count is adjusted 0.  */
> -  profile_guessed_global0adjusted = 2,
> +  profile_guessed_global0adjusted = 3,
>  
>    /* Profile is based on static branch prediction heuristics.  It may or may
>       not reflect the reality but it can be compared interprocedurally
>       (for example, we inlined function w/o profile feedback into function
>        with feedback and propagated from that).
>       Never used by probablities.  */
> -  profile_guessed = 3,
> +  profile_guessed = 4,
>    /* Profile was determined by autofdo.  */
> -  profile_afdo = 4,
> +  profile_afdo = 5,
>    /* Profile was originally based on feedback but it was adjusted
>       by code duplicating optimization.  It may not precisely reflect the
>       particular code path.  */
> -  profile_adjusted = 5,
> +  profile_adjusted = 6,
>    /* Profile was read from profile feedback or determined by accurate static
>       method.  */
>    profile_precise = 7
> @@ -505,6 +505,8 @@ public:
>    /* Return false if profile_probability is bogus.  */
>    bool verify () const
>      {
> +      gcc_checking_assert (profile_guessed_local <= m_quality
> +                        && m_quality <= profile_precise);
>        if (m_val == uninitialized_probability)
>       return m_quality == profile_guessed;
>        else if (m_quality < profile_guessed)
> @@ -784,6 +786,8 @@ public:
>    /* Return false if profile_count is bogus.  */
>    bool verify () const
>      {
> +      gcc_checking_assert (profile_guessed_local <= m_quality
> +                        && m_quality <= profile_precise);
>        return m_val != uninitialized_count || m_quality == 
> profile_guessed_local;
>      }
>  
> -- 
> 2.14.3
> 

Reply via email to