aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-04-13 16:16:41 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2015-04-13 14:16:41 +0000
commit10706779287de8fffd80b7968baaa1ba45c15a85 (patch)
tree706cd9ad1492a7ecff6bd5bb390144df2d0690c5
parent95d81ba561d69d63c65ac00c059555ce33d6e77a (diff)
downloadgcc-10706779287de8fffd80b7968baaa1ba45c15a85.zip
gcc-10706779287de8fffd80b7968baaa1ba45c15a85.tar.gz
gcc-10706779287de8fffd80b7968baaa1ba45c15a85.tar.bz2
nonzero-3.C: New testcase.
* 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. From-SVN: r222054
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/nonzero-3.C22
-rw-r--r--gcc/tree-vrp.c15
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9dcdea6..fe22835 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2015-04-12 Jan Hubicka <hubicka@ucw.cz>
+ * tree-vrp.c (nonnull_arg_p): THIS pointers and references are non-zero.
+ (gimple_stmt_nonzero_warnv_p): Reference return values are non-zero.
+
+2015-04-12 Jan Hubicka <hubicka@ucw.cz>
+
* ipa-profie.c (ipa_profile): Check number of parameters
and possible polymorphic call targets before
devirtualizing.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 377f5d9..18ce31c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-04-12 Jan Hubicka <hubicka@ucw.cz>
+
+ * g++.dg/tree-ssa/nonzero-3.C: New testcase.
+
2015-04-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/65204
diff --git a/gcc/testsuite/g++.dg/tree-ssa/nonzero-3.C b/gcc/testsuite/g++.dg/tree-ssa/nonzero-3.C
new file mode 100644
index 0000000..eaad3e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/nonzero-3.C
@@ -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" } } */
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 9556ede..23e48b1 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -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, bool *strict_overflow_p)
&& DECL_IS_OPERATOR_NEW (fndecl)
&& !TREE_NOTHROW (fndecl))
return true;
+ /* References are always 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))))