> Hi.
> 
> There's an example of zero initialized profile_count. Instead I guess we want
> to initialize it to profile_count::zero.
> 
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
> 
> Ready to be installed?
> Martin

> >From 0cb1501005429cc7ef1083bfc279d7be2a6197aa Mon Sep 17 00:00:00 2001
> From: marxin <mli...@suse.cz>
> Date: Wed, 10 Jan 2018 15:30:33 +0100
> Subject: [PATCH] Initialize type_warnings::dyn_count with a default value (PR
>  ipa/83054).
> 
> gcc/ChangeLog:
> 
> 2018-01-10  Martin Liska  <mli...@suse.cz>
> 
>       PR ipa/83054
>       * ipa-devirt.c (final_warning_record::grow_type_warnings):
>       New function.
>       (possible_polymorphic_call_targets): Use it.
>       (ipa_devirt): Likewise.
> 
> gcc/testsuite/ChangeLog:
> 
> 2018-01-10  Martin Liska  <mli...@suse.cz>
> 
>       * g++.dg/warn/pr83054.C: New test.

OK,
thanks!

Honza
> ---
>  gcc/ipa-devirt.c                    | 25 +++++++++++++++++-----
>  gcc/testsuite/g++.dg/warn/pr83054.C | 41 
> +++++++++++++++++++++++++++++++++++++
>  2 files changed, 61 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/warn/pr83054.C
> 
> diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
> index 8de004fef63..cc551d636fd 100644
> --- a/gcc/ipa-devirt.c
> +++ b/gcc/ipa-devirt.c
> @@ -2901,10 +2901,27 @@ struct decl_warn_count
>  
>  struct final_warning_record
>  {
> +  /* If needed grow type_warnings vector and initialize new decl_warn_count
> +     to have dyn_count set to profile_count::zero ().  */
> +  void grow_type_warnings (unsigned newlen);
> +
>    profile_count dyn_count;
>    auto_vec<odr_type_warn_count> type_warnings;
>    hash_map<tree, decl_warn_count> decl_warnings;
>  };
> +
> +void
> +final_warning_record::grow_type_warnings (unsigned newlen)
> +{
> +  unsigned len = type_warnings.length ();
> +  if (newlen > len)
> +    {
> +      type_warnings.safe_grow_cleared (newlen);
> +      for (unsigned i = len; i < newlen; i++)
> +     type_warnings[i].dyn_count = profile_count::zero ();
> +    }
> +}
> +
>  struct final_warning_record *final_warning_records;
>  
>  /* Return vector containing possible targets of polymorphic call of type
> @@ -3176,9 +3193,8 @@ possible_polymorphic_call_targets (tree otr_type,
>                     && warn_suggest_final_types
>                     && !outer_type->derived_types.length ())
>                   {
> -                   if (outer_type->id >= 
> (int)final_warning_records->type_warnings.length ())
> -                     final_warning_records->type_warnings.safe_grow_cleared
> -                       (odr_types.length ());
> +                   final_warning_records->grow_type_warnings
> +                     (outer_type->id);
>                     
> final_warning_records->type_warnings[outer_type->id].count++;
>                     if (!final_warning_records->type_warnings
>                               [outer_type->id].dyn_count.initialized_p ())
> @@ -3545,8 +3561,7 @@ ipa_devirt (void)
>      {
>        final_warning_records = new (final_warning_record);
>        final_warning_records->dyn_count = profile_count::zero ();
> -      final_warning_records->type_warnings.safe_grow_cleared
> -                                              (odr_types.length ());
> +      final_warning_records->grow_type_warnings (odr_types.length ());
>        free_polymorphic_call_targets_hash ();
>      }
>  
> diff --git a/gcc/testsuite/g++.dg/warn/pr83054.C 
> b/gcc/testsuite/g++.dg/warn/pr83054.C
> new file mode 100644
> index 00000000000..506c9609b90
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/warn/pr83054.C
> @@ -0,0 +1,41 @@
> +// PR ipa/83054
> +// { dg-options "-O3 -Wsuggest-final-types" }
> +// { dg-do compile }
> +
> +extern "C" int printf (const char *, ...);
> +struct foo // { dg-warning "final would enable devirtualization of 5 calls" }
> +{
> +  static int count;
> +  void print (int i, int j) { printf ("foo[%d][%d] = %d\n", i, j, x); }
> +  int x;
> +  foo () {
> +    x = count++;
> +    printf("this %d = %x\n", x, (void *)this);
> +  }
> +  virtual ~foo () {
> +    printf("this %d = %x\n", x, (void *)this);
> +    --count;
> +  }
> +};
> +int foo::count;
> +
> +
> +int main ()
> +{
> +  {
> +    foo array[3][3];
> +    for (int i = 0; i < 3; i++)
> +      {
> +     for (int j = 0; j < 3; j++)
> +       {
> +         printf("&a[%d][%d] = %x\n", i, j, (void *)&array[i][j]);
> +       }
> +      }
> +      // The count should be nine, if not, fail the test.
> +      if (foo::count != 9)
> +     return 1;
> +  }
> +  if (foo::count != 0)
> +    return 1;
> +  return 0;
> +}
> -- 
> 2.14.3
> 

Reply via email to