re PR tree-optimization/43008 (Attribute malloc not handled correctly)

2010-02-09  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/43008
	* tree-ssa-structalias.c (handle_lhs_call): Pass in the fndecl,
	make HEAP variables initialized from global memory if they
	are not known builtin functions.
	(find_func_aliases): Adjust.

	* gcc.c-torture/execute/pr43008.c: New testcase.

From-SVN: r156628
This commit is contained in:
Richard Guenther 2010-02-09 16:11:34 +00:00 committed by Richard Biener
parent 44e7145eb9
commit 72d182d3d2
4 changed files with 44 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43008
* tree-ssa-structalias.c (handle_lhs_call): Pass in the fndecl,
make HEAP variables initialized from global memory if they
are not known builtin functions.
(find_func_aliases): Adjust.
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43000

View File

@ -1,3 +1,8 @@
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43008
* gcc.c-torture/execute/pr43008.c: New testcase.
2010-02-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/43000

View File

@ -0,0 +1,23 @@
int i;
struct X {
int *p;
};
struct X * __attribute__((malloc))
my_alloc (void)
{
struct X *p = __builtin_malloc (sizeof (struct X));
p->p = &i;
return p;
}
extern void abort (void);
int main()
{
struct X *p, *q;
p = my_alloc ();
q = my_alloc ();
*(p->p) = 1;
*(q->p) = 0;
if (*(p->p) != 0)
abort ();
return 0;
}

View File

@ -3482,7 +3482,7 @@ handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
the LHS point to global and escaped variables. */
static void
handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc)
handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc, tree fndecl)
{
VEC(ce_s, heap) *lhsc = NULL;
@ -3496,6 +3496,12 @@ handle_lhs_call (tree lhs, int flags, VEC(ce_s, heap) *rhsc)
it escapes. */
DECL_EXTERNAL (vi->decl) = 0;
vi->is_global_var = 0;
/* If this is not a real malloc call assume the memory was
initialized and thus may point to global memory. All
builtin functions with the malloc attribute behave in a sane way. */
if (!fndecl
|| DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
make_constraint_from (vi, nonlocal_id);
}
else if (VEC_length (ce_s, rhsc) > 0)
{
@ -3798,7 +3804,7 @@ find_func_aliases (gimple origt)
handle_rhs_call (t, &rhsc);
if (gimple_call_lhs (t)
&& could_have_pointers (gimple_call_lhs (t)))
handle_lhs_call (gimple_call_lhs (t), flags, rhsc);
handle_lhs_call (gimple_call_lhs (t), flags, rhsc, fndecl);
VEC_free (ce_s, heap, rhsc);
}
else