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 <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)