This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][RFC] Handle realloc in PTA and alias analysis


PR56955 prompted me to handle BUILT_IN_REALLOC just the same
way we already handle BUILT_IN_STR[N]DUP.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Now this will disambiguate *p and *q for p = realloc (q, n)
for any value of n (including those that don't actually
trigger re-allocation and thus where p == q after the call).
I don't think that any such use would be valid - but I can
certainly play safer here and implement the points-to part
as a pass-through (that is, make p point to what q points).
That's of course less optimization.

I can't quite find language that specifies that the
object can no longer accessed via the pointer argument q
(at least if p didn't return NULL and size was not NULL).
The C99 standard explicitely mentions that p may have
the same pointer value as q though.

Thoughts?

Thanks,
Richard.

2014-05-21  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): Likewise.
	* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
	Likewise.
	(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.

Index: gcc/tree-ssa-alias.c
===================================================================
*** gcc/tree-ssa-alias.c.orig	2014-05-21 14:38:57.841133822 +0200
--- gcc/tree-ssa-alias.c	2014-05-21 14:39:05.954133263 +0200
*************** ref_maybe_used_by_call_p_1 (gimple call,
*** 1594,1599 ****
--- 1594,1600 ----
  	/* 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;
*************** call_may_clobber_ref_p_1 (gimple call, a
*** 1958,1963 ****
--- 1959,1965 ----
  	case BUILT_IN_MALLOC:
  	case BUILT_IN_ALIGNED_ALLOC:
  	case BUILT_IN_CALLOC:
+ 	case BUILT_IN_REALLOC:
  	case BUILT_IN_STRDUP:
  	case BUILT_IN_STRNDUP:
  	  /* Unix98 specifies that errno is set on allocation failure.  */
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c.orig	2014-05-21 14:38:57.844133822 +0200
--- gcc/tree-ssa-structalias.c	2014-05-21 14:45:50.896105384 +0200
*************** handle_lhs_call (gimple stmt, tree lhs,
*** 3974,3980 ****
  
    /* 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))
      {
--- 3974,3979 ----
*************** find_func_aliases_for_builtin_call (stru
*** 4299,4307 ****
  	return true;
        case BUILT_IN_STRDUP:
        case BUILT_IN_STRNDUP:
  	if (gimple_call_lhs (t))
  	  {
! 	    handle_lhs_call (t, gimple_call_lhs (t), gimple_call_flags (t),
  			     vNULL, fndecl);
  	    get_constraint_for_ptr_offset (gimple_call_lhs (t),
  					   NULL_TREE, &lhsc);
--- 4298,4308 ----
  	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_return_flags (t) | ERF_NOALIAS,
  			     vNULL, fndecl);
  	    get_constraint_for_ptr_offset (gimple_call_lhs (t),
  					   NULL_TREE, &lhsc);
*************** find_func_aliases_for_call (struct funct
*** 4535,4541 ****
        else
  	handle_rhs_call (t, &rhsc);
        if (gimple_call_lhs (t))
! 	handle_lhs_call (t, gimple_call_lhs (t), flags, rhsc, fndecl);
        rhsc.release ();
      }
    else
--- 4536,4543 ----
        else
  	handle_rhs_call (t, &rhsc);
        if (gimple_call_lhs (t))
! 	handle_lhs_call (t, gimple_call_lhs (t),
! 			 gimple_call_return_flags (t), rhsc, fndecl);
        rhsc.release ();
      }
    else
Index: gcc/testsuite/gcc.dg/tree-ssa/alias-33.c
===================================================================
*** /dev/null	1970-01-01 00:00:00.000000000 +0000
--- gcc/testsuite/gcc.dg/tree-ssa/alias-33.c	2014-05-21 14:39:06.003133260 +0200
***************
*** 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" } } */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]