aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-23 10:52:25 +0000
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>2016-11-23 10:52:25 +0000
commita5bb8a5ceae1bfb0fa82a58254a6539c8943d4b8 (patch)
tree5a77749307568d49ccaaa49d8f07d74ede803967 /gcc/tree-vrp.c
parente36c1cfe080b1f8150e28eb45ef8e190df1dd6ef (diff)
downloadgcc-a5bb8a5ceae1bfb0fa82a58254a6539c8943d4b8.zip
gcc-a5bb8a5ceae1bfb0fa82a58254a6539c8943d4b8.tar.gz
gcc-a5bb8a5ceae1bfb0fa82a58254a6539c8943d4b8.tar.bz2
re PR tree-optimization/78154 (memcpy et al can be assumed to return non-null)
2016-11-23 Richard Biener <rguenther@suse.de> Prathamesh Kulkarni <prathamesh.kulkarni@linaro.rog> PR tree-optimization/78154 * tree-vrp.c (gimple_stmt_nonzero_warnv_p): Return true if function returns it's argument and the argument is nonnull. * builtin-attrs.def: Define ATTR_RETURNS_NONNULL, ATT_RETNONNULL_NOTHROW_LEAF. * builtins.def (BUILT_IN_MEMPCPY): Change attribute to ATTR_RETNONNULL_NOTHROW_LEAF. (BUILT_IN_STPCPY): Likewise. (BUILT_IN_STPNCPY): Likewise. (BUILT_IN_MEMPCPY_CHK): Likewise. (BUILT_IN_STPCPY_CHK): Likewise. (BUILT_IN_STPNCPY_CHK): Likewise. (BUILT_IN_STRCAT): Change attribute to ATTR_RET1_NOTHROW_NONNULL_LEAF. (BUILT_IN_STRNCAT): Likewise. (BUILT_IN_STRNCPY): Likewise. (BUILT_IN_MEMSET_CHK): Likewise. (BUILT_IN_STRCAT_CHK): Likewise. (BUILT_IN_STRCPY_CHK): Likewise. (BUILT_IN_STRNCAT_CHK): Likewise. (BUILT_IN_STRNCPY_CHK): Likewise. testsuite/ * gcc.dg/tree-ssa/pr78154.c: New test. Co-Authored-By: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> From-SVN: r242745
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index c2a4133..5bd4418 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1097,6 +1097,20 @@ gimple_stmt_nonzero_warnv_p (gimple *stmt, bool *strict_overflow_p)
lookup_attribute ("returns_nonnull",
TYPE_ATTRIBUTES (gimple_call_fntype (stmt))))
return true;
+
+ gcall *call_stmt = as_a<gcall *> (stmt);
+ unsigned rf = gimple_call_return_flags (call_stmt);
+ if (rf & ERF_RETURNS_ARG)
+ {
+ unsigned argnum = rf & ERF_RETURN_ARG_MASK;
+ if (argnum < gimple_call_num_args (call_stmt))
+ {
+ tree arg = gimple_call_arg (call_stmt, argnum);
+ if (SSA_VAR_P (arg)
+ && infer_nonnull_range_by_attribute (stmt, arg))
+ return true;
+ }
+ }
return gimple_alloca_call_p (stmt);
}
default: