/* Miscellaneous SSA utility functions.
- Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
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)
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;
}
}
}
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