diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-18 03:54:38 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-18 03:54:38 +0000 |
commit | 97d6b11869fc65a21d62bb925277e4202649a953 (patch) | |
tree | 0905041f83c7d584e9670c50b9a13715c323e6d7 /gcc/tree-ssa-copy.c | |
parent | adf432af74e475221bd9f6e50aeb10a25d154c40 (diff) | |
download | gcc-97d6b11869fc65a21d62bb925277e4202649a953.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@93810 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-copy.c')
-rw-r--r-- | gcc/tree-ssa-copy.c | 57 |
1 files changed, 23 insertions, 34 deletions
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 8a03c2435d1..c679eb221be 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -178,10 +178,10 @@ merge_alias_info (tree orig, tree new) tree orig_sym = SSA_NAME_VAR (orig); var_ann_t new_ann = var_ann (new_sym); var_ann_t orig_ann = var_ann (orig_sym); - struct ptr_info_def *orig_ptr_info; gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig))); gcc_assert (POINTER_TYPE_P (TREE_TYPE (new))); + #if defined ENABLE_CHECKING gcc_assert (lang_hooks.types_compatible_p (TREE_TYPE (orig), TREE_TYPE (new))); @@ -202,41 +202,30 @@ merge_alias_info (tree orig, tree new) else gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag); - orig_ptr_info = SSA_NAME_PTR_INFO (orig); - if (orig_ptr_info && orig_ptr_info->name_mem_tag) - { - struct ptr_info_def *new_ptr_info = get_ptr_info (new); - - if (new_ptr_info->name_mem_tag == NULL_TREE) - { - /* If ORIG had a name tag, it means that was dereferenced in - the code, and since pointer NEW will now replace every - occurrence of ORIG, we have to make sure that NEW has an - appropriate tag. If, NEW did not have a name tag, get it - 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 - } + { + struct ptr_info_def *orig_ptr_info = SSA_NAME_PTR_INFO (orig); + struct ptr_info_def *new_ptr_info = SSA_NAME_PTR_INFO (new); + + if (orig_ptr_info + && new_ptr_info + && orig_ptr_info->name_mem_tag + && new_ptr_info->name_mem_tag + && orig_ptr_info->pt_vars + && new_ptr_info->pt_vars) + { + /* 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. */ + gcc_assert (bitmap_intersect_p (new_ptr_info->pt_vars, + orig_ptr_info->pt_vars)); } + } +#endif } |