Commit 986583fd by Diego Novillo Committed by Diego Novillo

re PR tree-optimization/18291 (ICE in merge_alias_info)


	PR tree-optimization/18291
	* tree-ssa-copy.c (merge_alias_info): Fix merging of
	flow-sensitive alias information.  If the new pointer has no
	name tag, copy it from the original pointer.  Otherwise, make
	sure that the pointed-to sets have a common intersection.

testsuite/ChangeLog

	PR tree-optimization/18291
	* testsuite/gcc.c-torture/compile/pr18291.c: New test.

From-SVN: r91574
parent 28a6dfca
2004-12-01 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/18291
* tree-ssa-copy.c (merge_alias_info): Fix merging of
flow-sensitive alias information. If the new pointer has no
name tag, copy it from the original pointer. Otherwise, make
sure that the pointed-to sets have a common intersection.
2004-12-01 Richard Henderson <rth@redhat.com> 2004-12-01 Richard Henderson <rth@redhat.com>
PR rtl-opt/15289 PR rtl-opt/15289
......
2004-12-01 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/18291
* testsuite/gcc.c-torture/compile/pr18291.c: New test.
2004-12-01 Nathan Sidwell <nathan@codesourcery.com> 2004-12-01 Nathan Sidwell <nathan@codesourcery.com>
PR C++/18729 PR C++/18729
......
int baz(int k2)
{
int i, j, *p, k = 1, k1 = 0;
if (k2)
p = &j;
else
p = &i;
if (k1)
*p = 0 , p = &k;
*p = 1;
return k;
}
...@@ -178,7 +178,6 @@ merge_alias_info (tree orig, tree new) ...@@ -178,7 +178,6 @@ merge_alias_info (tree orig, tree new)
tree orig_sym = SSA_NAME_VAR (orig); tree orig_sym = SSA_NAME_VAR (orig);
var_ann_t new_ann = var_ann (new_sym); var_ann_t new_ann = var_ann (new_sym);
var_ann_t orig_ann = var_ann (orig_sym); var_ann_t orig_ann = var_ann (orig_sym);
struct ptr_info_def *new_ptr_info;
struct ptr_info_def *orig_ptr_info; struct ptr_info_def *orig_ptr_info;
gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig))); gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig)));
...@@ -203,18 +202,41 @@ merge_alias_info (tree orig, tree new) ...@@ -203,18 +202,41 @@ merge_alias_info (tree orig, tree new)
else else
gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag); gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag);
/* Synchronize flow sensitive alias information. If both pointers orig_ptr_info = SSA_NAME_PTR_INFO (orig);
had flow information and they are inconsistent, then something if (orig_ptr_info && orig_ptr_info->name_mem_tag)
has gone wrong. */ {
new_ptr_info = get_ptr_info (new); struct ptr_info_def *new_ptr_info = get_ptr_info (new);
orig_ptr_info = get_ptr_info (orig);
if (new_ptr_info->name_mem_tag == NULL_TREE)
if (new_ptr_info->name_mem_tag == NULL_TREE) {
memcpy (new_ptr_info, orig_ptr_info, sizeof (*new_ptr_info)); /* If ORIG had a name tag, it means that was dereferenced in
else if (orig_ptr_info->name_mem_tag == NULL_TREE) the code, and since pointer NEW will now replace every
memcpy (orig_ptr_info, new_ptr_info, sizeof (*orig_ptr_info)); occurrence of ORIG, we have to make sure that NEW has an
else if (orig_ptr_info->name_mem_tag != new_ptr_info->name_mem_tag) appropriate tag. If, NEW did not have a name tag, get it
abort (); from ORIG. */
memcpy (new_ptr_info, orig_ptr_info, sizeof (*new_ptr_info));
new_ptr_info->pt_vars = BITMAP_GGC_ALLOC ();
bitmap_copy (new_ptr_info->pt_vars, orig_ptr_info->pt_vars);
new_ptr_info->name_mem_tag = orig_ptr_info->name_mem_tag;
}
else
{
/* If NEW already had a name tag, nothing needs to be done.
Note that pointer NEW may actually have a different set of
pointed-to variables.
However, since NEW is being copy-propagated into ORIG, it must
always be true that the pointed-to set for pointer NEW is the
same, or a subset, of the pointed-to set for pointer ORIG. If
this isn't the case, we shouldn't have been able to do the
propagation of NEW into ORIG. */
#if defined ENABLE_CHECKING
if (orig_ptr_info->pt_vars && new_ptr_info->pt_vars)
gcc_assert (bitmap_intersect_p (new_ptr_info->pt_vars,
orig_ptr_info->pt_vars));
#endif
}
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment