This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix PR 16728


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]