On Tue, 27 Oct 2020, Jan Hubicka wrote:

> Hi,
> this patch makes C++ new and delete operators to be handled as
> malloc/free for fnspec.
> 
> I still do not understand why free is ".co " and not ".cO ".
> I do not think we need to invalidate memory referenced to by blockbeing
> freed.
> 
> Bootstrapped/regtested x86_64-linux, OK?

OK.

Richard.

> Honza
> 
> gcc/ChangeLog:
> 
> 2020-10-27  Jan Hubicka  <hubi...@ucw.cz>
> 
>       * gimple.c (gimple_call_fnspec): Handle C++ new and delete.
>       * gimple.h (gimple_call_from_new_or_delete): Constify parameter.
> 
> gcc/testsuite/ChangeLog:
> 
> 2020-10-27  Jan Hubicka  <hubi...@ucw.cz>
> 
>       * g++.dg/ipa/devirt-24.C: Update template.
> 
> diff --git a/gcc/gimple.c b/gcc/gimple.c
> index 469e6f369f3..1afed88e1f1 100644
> --- a/gcc/gimple.c
> +++ b/gcc/gimple.c
> @@ -1510,6 +1510,19 @@ gimple_call_fnspec (const gcall *stmt)
>      }
>    if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
>      return builtin_fnspec (gimple_call_fndecl (stmt));
> +  tree fndecl = gimple_call_fndecl (stmt);
> +  /* If the call is to a replaceable operator delete and results
> +     from a delete expression as opposed to a direct call to
> +     such operator, then we can treat it as free.  */
> +  if (fndecl
> +      && DECL_IS_OPERATOR_DELETE_P (fndecl)
> +      && gimple_call_from_new_or_delete (stmt))
> +    return ".co ";
> +  /* Similarly operator new can be treated as malloc.  */
> +  if (fndecl
> +      && DECL_IS_OPERATOR_NEW_P (fndecl)
> +      && gimple_call_from_new_or_delete (stmt))
> +    return "mC";
>    return "";
>  }
>  
> diff --git a/gcc/gimple.h b/gcc/gimple.h
> index 3c9b9965f5a..fdb00d57b07 100644
> --- a/gcc/gimple.h
> +++ b/gcc/gimple.h
> @@ -3405,7 +3405,7 @@ gimple_call_set_from_new_or_delete (gcall *s, bool 
> from_new_or_delete_p)
>     from a new or delete expression.  */
>  
>  static inline bool
> -gimple_call_from_new_or_delete (gcall *s)
> +gimple_call_from_new_or_delete (const gcall *s)
>  {
>    return (s->subcode & GF_CALL_FROM_NEW_OR_DELETE) != 0;
>  }
> diff --git a/gcc/testsuite/g++.dg/ipa/devirt-24.C 
> b/gcc/testsuite/g++.dg/ipa/devirt-24.C
> index eaef1f5b3f8..7b5b806dd05 100644
> --- a/gcc/testsuite/g++.dg/ipa/devirt-24.C
> +++ b/gcc/testsuite/g++.dg/ipa/devirt-24.C
> @@ -37,4 +37,4 @@ C *b = new (C);
>    }
>  }
>  /* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known 
> target" 1 "inline" { xfail *-*-* } } } */
> -/* { dg-final { scan-ipa-dump-times "Aggregate passed by reference" 1 "cp"  
> } } */
> +/* { dg-final { scan-ipa-dump-times "Aggregate passed by reference" 2 "cp"  
> } } */
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to