aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2013-10-09 15:03:13 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2013-10-09 13:03:13 +0000
commit826cacfe24c4643799d85f07b25d15a0d3b76bc0 (patch)
treeca712605143da33b695da4c91076aa641b7f23d3 /gcc/tree-vrp.c
parent378f8976f26a17a53c5c306f7277971e8e7a6aa7 (diff)
downloadgcc-826cacfe24c4643799d85f07b25d15a0d3b76bc0.zip
gcc-826cacfe24c4643799d85f07b25d15a0d3b76bc0.tar.gz
gcc-826cacfe24c4643799d85f07b25d15a0d3b76bc0.tar.bz2
re PR c/20318 (RFE: add attribute to specify that a function never returns NULL)
2013-10-09 Marc Glisse <marc.glisse@inria.fr> PR tree-optimization/20318 gcc/c-family/ * c-common.c (handle_returns_nonnull_attribute): New function. (c_common_attribute_table): Add returns_nonnull. gcc/ * doc/extend.texi (returns_nonnull): New function attribute. * fold-const.c (tree_expr_nonzero_warnv_p): Look for returns_nonnull attribute. * tree-vrp.c (gimple_stmt_nonzero_warnv_p): Likewise. (stmt_interesting_for_vrp): Accept all GIMPLE_CALL. gcc/testsuite/ * c-c++-common/pr20318.c: New file. * gcc.dg/tree-ssa/pr20318.c: New file. From-SVN: r203316
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 156a58f..4cd2f2a 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1038,7 +1038,7 @@ gimple_assign_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
}
}
-/* Return true if STMT is know to to compute a non-zero value.
+/* Return true if STMT is known to compute a non-zero value.
If the return value is based on the assumption that signed overflow is
undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
*STRICT_OVERFLOW_P.*/
@@ -1058,6 +1058,10 @@ gimple_stmt_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
&& DECL_IS_OPERATOR_NEW (fndecl)
&& !TREE_NOTHROW (fndecl))
return true;
+ if (flag_delete_null_pointer_checks &&
+ lookup_attribute ("returns_nonnull",
+ TYPE_ATTRIBUTES (gimple_call_fntype (stmt))))
+ return true;
return gimple_alloca_call_p (stmt);
}
default:
@@ -6536,10 +6540,7 @@ stmt_interesting_for_vrp (gimple stmt)
if (lhs && TREE_CODE (lhs) == SSA_NAME
&& (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
|| POINTER_TYPE_P (TREE_TYPE (lhs)))
- && ((is_gimple_call (stmt)
- && gimple_call_fndecl (stmt) != NULL_TREE
- && (DECL_BUILT_IN (gimple_call_fndecl (stmt))
- || DECL_IS_OPERATOR_NEW (gimple_call_fndecl (stmt))))
+ && (is_gimple_call (stmt)
|| !gimple_vuse (stmt)))
return true;
}