This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix PR 16728
- From: Diego Novillo <dnovillo at redhat dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: "libstdc++ at gcc dot gnu dot org" <libstdc++ at gcc dot gnu dot org>
- Date: Thu, 28 Oct 2004 14:38:27 -0400
- Subject: Fix PR 16728
- Organization: Red Hat Canada
When copying a pointer into another, we should also merge the flow
sensitive information. This first showed up on tree-cleanup-branch with
the more aggressive copy propagator. I'm rather surprised that it had
never showed up on mainline.
The original test is only run with 'make check-performance' on
libstdc++. I'd like to move/copy this test into the regular 'make
check', but I don't know my way around libstdc++/testsuite. Could one
of the libstdc++ folks give me a pointer? Where could I put this test?
It's a runtime test that needs '-O2 -pthread' to run.
Bootstrap and testing in progress.
Diego.
PR tree-optimization/16728
* tree-flow.h (get_ptr_info): Declare.
* tree-ssa-alias.c (get_ptr_info): Make extern.
* tree-ssa-copy.c (merge_alias_info): Merge flow-sensitive
alias information.
Index: tree-flow.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-flow.h,v
retrieving revision 2.55
diff -d -c -p -r2.55 tree-flow.h
*** tree-flow.h 27 Oct 2004 17:45:19 -0000 2.55
--- tree-flow.h 28 Oct 2004 18:01:54 -0000
*************** extern void debug_points_to_info (void);
*** 556,561 ****
--- 556,562 ----
extern void dump_points_to_info_for (FILE *, tree);
extern void debug_points_to_info_for (tree);
extern bool may_be_aliased (tree);
+ extern struct ptr_info_def *get_ptr_info (tree);
/* Call-back function for walk_use_def_chains(). At each reaching
definition, a function with this prototype is called. */
Index: tree-ssa-alias.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-alias.c,v
retrieving revision 2.47
diff -d -c -p -r2.47 tree-ssa-alias.c
*** tree-ssa-alias.c 30 Sep 2004 14:09:45 -0000 2.47
--- tree-ssa-alias.c 28 Oct 2004 18:01:55 -0000
*************** static void collect_points_to_info_for (
*** 152,158 ****
static bool ptr_is_dereferenced_by (tree, tree, bool *);
static void maybe_create_global_var (struct alias_info *ai);
static void group_aliases (struct alias_info *);
- static struct ptr_info_def *get_ptr_info (tree t);
static void set_pt_anything (tree ptr);
static void set_pt_malloc (tree ptr);
--- 152,157 ----
*************** debug_alias_info (void)
*** 2262,2268 ****
/* Return the alias information associated with pointer T. It creates a
new instance if none existed. */
! static struct ptr_info_def *
get_ptr_info (tree t)
{
struct ptr_info_def *pi;
--- 2261,2267 ----
/* Return the alias information associated with pointer T. It creates a
new instance if none existed. */
! struct ptr_info_def *
get_ptr_info (tree t)
{
struct ptr_info_def *pi;
Index: tree-ssa-copy.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-copy.c,v
retrieving revision 2.18
diff -d -c -p -r2.18 tree-ssa-copy.c
*** tree-ssa-copy.c 30 Sep 2004 01:22:05 -0000 2.18
--- tree-ssa-copy.c 28 Oct 2004 18:01:55 -0000
*************** merge_alias_info (tree orig, tree new)
*** 178,183 ****
--- 178,185 ----
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 *new_ptr_info;
+ struct ptr_info_def *orig_ptr_info;
gcc_assert (POINTER_TYPE_P (TREE_TYPE (orig)));
gcc_assert (POINTER_TYPE_P (TREE_TYPE (new)));
*************** merge_alias_info (tree orig, tree new)
*** 192,205 ****
== get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym))));
#endif
! /* Merge type-based alias info. */
if (new_ann->type_mem_tag == NULL_TREE)
new_ann->type_mem_tag = orig_ann->type_mem_tag;
else if (orig_ann->type_mem_tag == NULL_TREE)
orig_ann->type_mem_tag = new_ann->type_mem_tag;
else
gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag);
! }
/* Common code for propagate_value and replace_exp.
--- 194,221 ----
== get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym))));
#endif
! /* Synchronize the type tags. If both pointers had a tag and they
! are different, then something has gone wrong. */
if (new_ann->type_mem_tag == NULL_TREE)
new_ann->type_mem_tag = orig_ann->type_mem_tag;
else if (orig_ann->type_mem_tag == NULL_TREE)
orig_ann->type_mem_tag = new_ann->type_mem_tag;
else
gcc_assert (new_ann->type_mem_tag == orig_ann->type_mem_tag);
!
! /* Synchronize flow sensitive alias information. If both pointers
! had flow information and they are inconsistent, then something
! has gone wrong. */
! new_ptr_info = get_ptr_info (new);
! orig_ptr_info = get_ptr_info (orig);
!
! if (new_ptr_info->name_mem_tag == NULL_TREE)
! memcpy (new_ptr_info, orig_ptr_info, sizeof (*new_ptr_info));
! else if (orig_ptr_info->name_mem_tag == NULL_TREE)
! memcpy (orig_ptr_info, new_ptr_info, sizeof (*orig_ptr_info));
! else if (orig_ptr_info->name_mem_tag != new_ptr_info->name_mem_tag)
! abort ();
! }
/* Common code for propagate_value and replace_exp.