aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2018-07-11 15:30:51 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2018-07-11 15:30:51 +0000
commit288aaa5f852b6f93078e15b7ac17af3b4930decd (patch)
tree774a14ad8d1ed095e9895cd329d92655d84195e0
parentdff2abcbee65dbb4b7ca3ade0f7622ffdc0af391 (diff)
downloadgcc-288aaa5f852b6f93078e15b7ac17af3b4930decd.zip
gcc-288aaa5f852b6f93078e15b7ac17af3b4930decd.tar.gz
gcc-288aaa5f852b6f93078e15b7ac17af3b4930decd.tar.bz2
vr-values.c (gimple_stmt_nonzero_p): Abstract common code to...
* vr-values.c (gimple_stmt_nonzero_p): Abstract common code to... * gimple.c (gimple_call_nonnull_result_p): ...here... (gimple_call_nonnull_arg): ...and here. * gimple.h (gimple_call_nonnull_result_p): New. (gimple_call_nonnull_arg): New. From-SVN: r262557
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimple.c51
-rw-r--r--gcc/gimple.h2
-rw-r--r--gcc/vr-values.c32
4 files changed, 64 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7ba0cd1..d239863 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2018-07-11 Aldy Hernandez <aldyh@redhat.com>
+
+ * vr-values.c (gimple_stmt_nonzero_p): Abstract common code to...
+ * gimple.c (gimple_call_nonnull_result_p): ...here...
+ (gimple_call_nonnull_arg): ...and here.
+ * gimple.h (gimple_call_nonnull_result_p): New.
+ (gimple_call_nonnull_arg): New.
+
2018-07-11 Richard Earnshaw <rearnsha@arm.com>
* config/arm/arm-cpus.in: Move information from fpu field of each
diff --git a/gcc/gimple.c b/gcc/gimple.c
index afdf583..8d56a96 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -1548,6 +1548,57 @@ gimple_call_return_flags (const gcall *stmt)
}
+/* Return true if call STMT is known to return a non-zero result. */
+
+bool
+gimple_call_nonnull_result_p (gcall *call)
+{
+ tree fndecl = gimple_call_fndecl (call);
+ if (!fndecl)
+ return false;
+ if (flag_delete_null_pointer_checks && !flag_check_new
+ && 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 (call))))
+ return true;
+ return gimple_alloca_call_p (call);
+}
+
+
+/* If CALL returns a non-null result in an argument, return that arg. */
+
+tree
+gimple_call_nonnull_arg (gcall *call)
+{
+ tree fndecl = gimple_call_fndecl (call);
+ if (!fndecl)
+ return NULL_TREE;
+
+ unsigned rf = gimple_call_return_flags (call);
+ if (rf & ERF_RETURNS_ARG)
+ {
+ unsigned argnum = rf & ERF_RETURN_ARG_MASK;
+ if (argnum < gimple_call_num_args (call))
+ {
+ tree arg = gimple_call_arg (call, argnum);
+ if (SSA_VAR_P (arg)
+ && infer_nonnull_range_by_attribute (call, arg))
+ return arg;
+ }
+ }
+ return NULL_TREE;
+}
+
+
/* Return true if GS is a copy assignment. */
bool
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 32e1908..a5dda93 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1488,6 +1488,8 @@ bool gimple_call_same_target_p (const gimple *, const gimple *);
int gimple_call_flags (const gimple *);
int gimple_call_arg_flags (const gcall *, unsigned);
int gimple_call_return_flags (const gcall *);
+bool gimple_call_nonnull_result_p (gcall *);
+tree gimple_call_nonnull_arg (gcall *);
bool gimple_assign_copy_p (gimple *);
bool gimple_assign_ssa_name_copy_p (gimple *);
bool gimple_assign_unary_nop_p (gimple *);
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 32f64e0..bba170f 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -313,35 +313,9 @@ gimple_stmt_nonzero_p (gimple *stmt)
return gimple_assign_nonzero_p (stmt);
case GIMPLE_CALL:
{
- tree fndecl = gimple_call_fndecl (stmt);
- if (!fndecl) return false;
- if (flag_delete_null_pointer_checks && !flag_check_new
- && 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))))
- 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);
+ gcall *call_stmt = as_a<gcall *> (stmt);
+ return (gimple_call_nonnull_result_p (call_stmt)
+ || gimple_call_nonnull_arg (call_stmt));
}
default:
gcc_unreachable ();