public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <rguenther@suse.de>
To: Jan Hubicka <hubicka@ucw.cz>
Cc: gcc-patches@gcc.gnu.org, jason@redhat.com
Subject: Re: Teach vrp that THIS pointer and references are non-zero
Date: Mon, 13 Apr 2015 11:48:00 -0000	[thread overview]
Message-ID: <alpine.LSU.2.11.1504131348340.6786@zhemvz.fhfr.qr> (raw)
In-Reply-To: <20150413101249.GB61490@kam.mff.cuni.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)

  parent reply	other threads:[~2015-04-13 11:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-13 10:12 Jan Hubicka
2015-04-13 10:22 ` Jakub Jelinek
2015-04-13 11:48 ` Richard Biener [this message]
2015-04-13 12:17   ` Jan Hubicka
2015-04-13 12:18     ` Richard Biener
2015-04-15 13:07       ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LSU.2.11.1504131348340.6786@zhemvz.fhfr.qr \
    --to=rguenther@suse.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hubicka@ucw.cz \
    --cc=jason@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).