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? 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))))