diff options
author | Diego Novillo <dnovillo@redhat.com> | 2005-01-18 03:54:38 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2005-01-17 22:54:38 -0500 |
commit | e03a46f571d5c4144e326ec9965db0a539473090 (patch) | |
tree | 0905041f83c7d584e9670c50b9a13715c323e6d7 /gcc/tree-ssa.c | |
parent | 696a2ca15ffb199bf85594121380dc0d7399e0c9 (diff) | |
download | gcc-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.c | 73 |
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 |