aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-05-22 09:59:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-05-22 09:59:49 +0000
commitc8f49949668ee194ba650ef9099455099afab7cb (patch)
tree2f518f3e212c133ab8e3093440e0b6b8513289a9 /gcc
parenta822564db5c2745e4ea1394cd33aa2079baaec8d (diff)
downloadgcc-c8f49949668ee194ba650ef9099455099afab7cb.zip
gcc-c8f49949668ee194ba650ef9099455099afab7cb.tar.gz
gcc-c8f49949668ee194ba650ef9099455099afab7cb.tar.bz2
tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle BUILT_IN_REALLOC like BUILT_IN_STRDUP.
2014-05-22 Richard Biener <rguenther@suse.de> * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle BUILT_IN_REALLOC like BUILT_IN_STRDUP. (call_may_clobber_ref_p_1): Handle BUILT_IN_REALLOC as allocation and deallocation site. * tree-ssa-structalias.c (find_func_aliases_for_builtin_call): Handle BUILT_IN_REALLOC similar to BUILT_IN_STRDUP with also passing through the incoming points-to set. (handle_lhs_call): Use flags argument instead of recomputing it. (find_func_aliases_for_call): Call handle_lhs_call with proper call return flags. * gcc.dg/tree-ssa/alias-33.c: New testcase. From-SVN: r210802
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/alias-33.c20
-rw-r--r--gcc/tree-ssa-alias.c10
-rw-r--r--gcc/tree-ssa-structalias.c19
5 files changed, 63 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d766a3..ad78d78 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2014-05-22 Richard Biener <rguenther@suse.de>
+
+ * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
+ BUILT_IN_REALLOC like BUILT_IN_STRDUP.
+ (call_may_clobber_ref_p_1): Handle BUILT_IN_REALLOC as allocation
+ and deallocation site.
+ * tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
+ Handle BUILT_IN_REALLOC similar to BUILT_IN_STRDUP with also
+ passing through the incoming points-to set.
+ (handle_lhs_call): Use flags argument instead of recomputing it.
+ (find_func_aliases_for_call): Call handle_lhs_call with proper
+ call return flags.
+
2014-05-22 Jakub Jelinek <jakub@redhat.com>
* tree-streamer-in.c (unpack_ts_real_cst_value_fields): Make sure
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index edbb9c6..0641f59 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-05-22 Richard Biener <rguenther@suse.de>
+
+ * gcc.dg/tree-ssa/alias-33.c: New testcase.
+
2014-05-22 Kostya Serebryany <kcc@google.com>
* c-c++-common/tsan/mutexset1.c: Update the test to match
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-33.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-33.c
new file mode 100644
index 0000000..cbc0812
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-33.c
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-options "-O -fdump-tree-fre1-details" } */
+
+int j;
+int main ()
+{
+ int i = 1;
+ int **p;
+ j = 0;
+ p = __builtin_malloc (sizeof (int *));
+ *p = &i;
+ p = __builtin_realloc (p, 2 * sizeof (int *));
+ **p = 0;
+ if (i != 0)
+ __builtin_abort ();
+ return j;
+}
+
+/* { dg-final { scan-tree-dump "Replaced j with 0" "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 479fa9c..0371070 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -1594,6 +1594,7 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
/* These read memory pointed to by the first argument. */
case BUILT_IN_STRDUP:
case BUILT_IN_STRNDUP:
+ case BUILT_IN_REALLOC:
{
ao_ref dref;
tree size = NULL_TREE;
@@ -1991,6 +1992,15 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
tree ptr = gimple_call_arg (call, 0);
return ptr_deref_may_alias_ref_p_1 (ptr, ref);
}
+ /* Realloc serves both as allocation point and deallocation point. */
+ case BUILT_IN_REALLOC:
+ {
+ tree ptr = gimple_call_arg (call, 0);
+ /* Unix98 specifies that errno is set on allocation failure. */
+ return ((flag_errno_math
+ && targetm.ref_may_alias_errno (ref))
+ || ptr_deref_may_alias_ref_p_1 (ptr, ref));
+ }
case BUILT_IN_GAMMA_R:
case BUILT_IN_GAMMAF_R:
case BUILT_IN_GAMMAL_R:
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 5d3a323..99e97d6 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -3974,7 +3974,6 @@ handle_lhs_call (gimple stmt, tree lhs, int flags, vec<ce_s> rhsc,
/* If the call returns an argument unmodified override the rhs
constraints. */
- flags = gimple_call_return_flags (stmt);
if (flags & ERF_RETURNS_ARG
&& (flags & ERF_RETURN_ARG_MASK) < gimple_call_num_args (stmt))
{
@@ -4299,9 +4298,11 @@ find_func_aliases_for_builtin_call (struct function *fn, gimple t)
return true;
case BUILT_IN_STRDUP:
case BUILT_IN_STRNDUP:
+ case BUILT_IN_REALLOC:
if (gimple_call_lhs (t))
{
- handle_lhs_call (t, gimple_call_lhs (t), gimple_call_flags (t),
+ handle_lhs_call (t, gimple_call_lhs (t),
+ gimple_call_return_flags (t) | ERF_NOALIAS,
vNULL, fndecl);
get_constraint_for_ptr_offset (gimple_call_lhs (t),
NULL_TREE, &lhsc);
@@ -4312,6 +4313,17 @@ find_func_aliases_for_builtin_call (struct function *fn, gimple t)
process_all_all_constraints (lhsc, rhsc);
lhsc.release ();
rhsc.release ();
+ /* For realloc the resulting pointer can be equal to the
+ argument as well. But only doing this wouldn't be
+ correct because with ptr == 0 realloc behaves like malloc. */
+ if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_REALLOC)
+ {
+ get_constraint_for (gimple_call_lhs (t), &lhsc);
+ get_constraint_for (gimple_call_arg (t, 0), &rhsc);
+ process_all_all_constraints (lhsc, rhsc);
+ lhsc.release ();
+ rhsc.release ();
+ }
return true;
}
break;
@@ -4535,7 +4547,8 @@ find_func_aliases_for_call (struct function *fn, gimple t)
else
handle_rhs_call (t, &rhsc);
if (gimple_call_lhs (t))
- handle_lhs_call (t, gimple_call_lhs (t), flags, rhsc, fndecl);
+ handle_lhs_call (t, gimple_call_lhs (t),
+ gimple_call_return_flags (t), rhsc, fndecl);
rhsc.release ();
}
else