This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Teach vrp that THIS pointer and references are non-zero
- From: Richard Biener <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, jason at redhat dot com
- Date: Mon, 13 Apr 2015 13:48:54 +0200 (CEST)
- Subject: Re: Teach vrp that THIS pointer and references are non-zero
- Authentication-results: sourceware.org; auth=none
- References: <20150413101249 dot GB61490 at kam dot mff dot cuni dot cz>
On Mon, 13 Apr 2015, Jan Hubicka wrote:
> Hi,
> with multiple inheritance compiling the testcase bellow, the first call always
> leads to call with offseted pointer, while the other call results in if
> conditoinal testing if parameter is non-NULL.
>
> This patch teach VRP that THIS pointers and references are non-zero. I hope
> this is true also for fortran and ada, but I think both languages do not really
> have NULL.
>
> I think VRP could basically assume all reference pointers to be non-zero, but
> I am not sure how to do that with GIMPLE useless conversion rules.
>
> Bootstrapped/regtested x86_64-linux, OK?
Hmm - doesn't ESRA remove unused this eventually so this falls apart?
Thanks,
Richard.
> Honza
>
> * g++.dg/tree-ssa/nonzero-3.C: New testcase.
> * tree-vrp.c (nonnull_arg_p): THIS pointers and references are non-zero.
> (gimple_stmt_nonzero_warnv_p): Reference return values are non-zero.
> Index: testsuite/g++.dg/tree-ssa/nonzero-3.C
> ===================================================================
> --- testsuite/g++.dg/tree-ssa/nonzero-3.C (revision 0)
> +++ testsuite/g++.dg/tree-ssa/nonzero-3.C (working copy)
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks" } */
> +struct A {int a;};
> +struct B {int b;};
> +struct C:A,B {int c;
> + void bar();};
> +
> +void foo (struct B *);
> +void C::bar ()
> +{
> + struct C *d = this;
> + foo(this);
> + foo(d);
> +}
> +void bar (struct C &c)
> +{
> + struct C *d = &c;
> + foo(&c);
> + foo(d);
> +}
> +/* { dg-final { scan-tree-dump-not "if \\(" "vrp1"} } */
> +/* { dg-final { cleanup-tree-dump "vrp1" } } */
> Index: tree-vrp.c
> ===================================================================
> --- tree-vrp.c (revision 222016)
> +++ tree-vrp.c (working copy)
> @@ -393,6 +393,17 @@ nonnull_arg_p (const_tree arg)
> if (arg == cfun->static_chain_decl)
> return true;
>
> + /* THIS argument of method is always non-NULL. */
> + if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE
> + && arg == DECL_ARGUMENTS (current_function_decl)
> + && flag_delete_null_pointer_checks)
> + return true;
> +
> + /* Values passed by reference are always non-NULL. */
> + if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE
> + && flag_delete_null_pointer_checks)
> + return true;
> +
> fntype = TREE_TYPE (current_function_decl);
> for (attrs = TYPE_ATTRIBUTES (fntype); attrs; attrs = TREE_CHAIN (attrs))
> {
> @@ -1216,6 +1227,10 @@ gimple_stmt_nonzero_warnv_p (gimple stmt
> && DECL_IS_OPERATOR_NEW (fndecl)
> && !TREE_NOTHROW (fndecl))
> return true;
> + /* Referneces are alwyas non-NULL. */
> + if (flag_delete_null_pointer_checks
> + && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
> + return true;
> if (flag_delete_null_pointer_checks &&
> lookup_attribute ("returns_nonnull",
> TYPE_ATTRIBUTES (gimple_call_fntype (stmt))))
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild,
Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)