aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.c
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2005-01-18 03:54:38 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2005-01-17 22:54:38 -0500
commite03a46f571d5c4144e326ec9965db0a539473090 (patch)
tree0905041f83c7d584e9670c50b9a13715c323e6d7 /gcc/tree-ssa.c
parent696a2ca15ffb199bf85594121380dc0d7399e0c9 (diff)
downloadgcc-e03a46f571d5c4144e326ec9965db0a539473090.zip
gcc-e03a46f571d5c4144e326ec9965db0a539473090.tar.gz
gcc-e03a46f571d5c4144e326ec9965db0a539473090.tar.bz2
re PR tree-optimization/19121 (ICE: in merge_alias_info, at tree-ssa-copy.c:236)
PR tree-optimization/19121 * tree-ssa-alias.c (compute_flow_sensitive_aliasing): When adding aliases to a name tag, also add them to the pointer's type tag. * tree-ssa-copy.c (merge_alias_info): Do not merge flow sensitive alias info at all. Only check that the two pointers have compatible pointed-to sets. * tree-ssa.c (verify_name_tags): Verify that the alias set of a pointer's type tag is a superset of the alias set of the pointer's name tag. testsuite/ChangeLog: PR tree-optimization/19121 * gcc.c-torture/compile/pr19121.c: New test. From-SVN: r93810
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r--gcc/tree-ssa.c73
1 files changed, 59 insertions, 14 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 24b5697..fe608f6 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -469,7 +469,11 @@ DEF_VEC_MALLOC_P (bitmap);
same name tag must have the same points-to set.
So we check a single variable for each name tag, and verify that its
points-to set is different from every other points-to set for other name
- tags. */
+ tags.
+
+ Additionally, given a pointer P_i with name tag NMT and type tag
+ TMT, this function verified the alias set of TMT is a superset of
+ the alias set of NMT. */
static void
verify_name_tags (void)
@@ -479,25 +483,62 @@ verify_name_tags (void)
bitmap first, second;
VEC (tree) *name_tag_reps = NULL;
VEC (bitmap) *pt_vars_for_reps = NULL;
+ bitmap type_aliases = BITMAP_XMALLOC ();
/* First we compute the name tag representatives and their points-to sets. */
for (i = 0; i < num_ssa_names; i++)
{
- if (ssa_name (i))
+ struct ptr_info_def *pi;
+ tree tmt, ptr = ssa_name (i);
+
+ if (ptr == NULL_TREE)
+ continue;
+
+ pi = SSA_NAME_PTR_INFO (ptr);
+
+ if (!TREE_VISITED (ptr)
+ || !POINTER_TYPE_P (TREE_TYPE (ptr))
+ || !pi
+ || !pi->name_mem_tag
+ || TREE_VISITED (pi->name_mem_tag))
+ continue;
+
+ TREE_VISITED (pi->name_mem_tag) = 1;
+
+ if (pi->pt_vars == NULL)
+ continue;
+
+ VEC_safe_push (tree, name_tag_reps, ptr);
+ VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
+
+ /* Verify that alias set of PTR's type tag is a superset of the
+ alias set of PTR's name tag. */
+ tmt = var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
+ if (tmt)
{
- tree ptr = ssa_name (i);
- struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
- if (!TREE_VISITED (ptr)
- || !POINTER_TYPE_P (TREE_TYPE (ptr))
- || !pi
- || !pi->name_mem_tag
- || TREE_VISITED (pi->name_mem_tag))
+ size_t i;
+ varray_type aliases = var_ann (tmt)->may_aliases;
+ bitmap_clear (type_aliases);
+ for (i = 0; aliases && i < VARRAY_ACTIVE_SIZE (aliases); i++)
+ {
+ tree alias = VARRAY_TREE (aliases, i);
+ bitmap_set_bit (type_aliases, var_ann (alias)->uid);
+ }
+
+ /* When grouping, we may have added PTR's type tag into the
+ alias set of PTR's name tag. To prevent a false
+ positive, pretend that TMT is in its own alias set. */
+ bitmap_set_bit (type_aliases, var_ann (tmt)->uid);
+
+ if (bitmap_equal_p (type_aliases, pi->pt_vars))
continue;
- TREE_VISITED (pi->name_mem_tag) = 1;
- if (pi->pt_vars != NULL)
- {
- VEC_safe_push (tree, name_tag_reps, ptr);
- VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
+
+ if (!bitmap_intersect_compl_p (type_aliases, pi->pt_vars))
+ {
+ error ("Alias set of a pointer's type tag should be a superset of the corresponding name tag");
+ debug_variable (tmt);
+ debug_variable (pi->name_mem_tag);
+ goto err;
}
}
}
@@ -532,13 +573,17 @@ verify_name_tags (void)
TREE_VISITED (pi->name_mem_tag) = 0;
}
}
+
VEC_free (bitmap, pt_vars_for_reps);
+ BITMAP_FREE (type_aliases);
return;
err:
debug_variable (VEC_index (tree, name_tag_reps, i));
internal_error ("verify_name_tags failed");
}
+
+
/* Verify the consistency of aliasing information. */
static void