From: Jan Hubicka <hubicka@ucw.cz>
To: gcc-patches@gcc.gnu.org, rguenther@suse.de, jason@redhat.com
Subject: Teach vrp that THIS pointer and references are non-zero
Date: Mon, 13 Apr 2015 10:12:00 -0000 [thread overview]
Message-ID: <20150413101249.GB61490@kam.mff.cuni.cz> (raw)
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))))
next reply other threads:[~2015-04-13 10:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-13 10:12 Jan Hubicka [this message]
2015-04-13 10:22 ` Jakub Jelinek
2015-04-13 11:48 ` Richard Biener
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=20150413101249.GB61490@kam.mff.cuni.cz \
--to=hubicka@ucw.cz \
--cc=gcc-patches@gcc.gnu.org \
--cc=jason@redhat.com \
--cc=rguenther@suse.de \
/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).