SOURCES: gcc-pr36519.patch (NEW)

pluto pluto at pld-linux.org
Mon Jun 16 13:17:41 CEST 2008


Author: pluto                        Date: Mon Jun 16 11:17:41 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:


---- Files affected:
SOURCES:
   gcc-pr36519.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/gcc-pr36519.patch
diff -u /dev/null SOURCES/gcc-pr36519.patch:1.1
--- /dev/null	Mon Jun 16 13:17:41 2008
+++ SOURCES/gcc-pr36519.patch	Mon Jun 16 13:17:35 2008
@@ -0,0 +1,121 @@
+2008-06-13  Richard Guenther  <rguenther at suse.de>
+
+	PR tree-optimization/36519
+	* tree-ssa-alias.c (mem_sym_score): Count call-clobbered
+	unpartitionable SFTs in the usual way.
+	(compute_memory_partitions): Do partition call-clobbered
+	unpartitionable SFTs, but make sure to partition all other
+	SFTs of its parent var into the same partition.
+
+Index: gcc/tree-ssa-alias.c
+===================================================================
+*** gcc/tree-ssa-alias.c	(revision 136743)
+--- gcc/tree-ssa-alias.c	(working copy)
+*************** mem_sym_score (mem_sym_stats_t mp)
+*** 866,872 ****
+       the list.  They are not stored in partitions, but they are used
+       for computing overall statistics.  */
+    if (TREE_CODE (mp->var) == STRUCT_FIELD_TAG
+!       && SFT_UNPARTITIONABLE_P (mp->var))
+      return LONG_MAX;
+  
+    return mp->frequency_writes * 64 + mp->frequency_reads * 32
+--- 866,873 ----
+       the list.  They are not stored in partitions, but they are used
+       for computing overall statistics.  */
+    if (TREE_CODE (mp->var) == STRUCT_FIELD_TAG
+!       && SFT_UNPARTITIONABLE_P (mp->var)
+!       && !is_call_clobbered (mp->var))
+      return LONG_MAX;
+  
+    return mp->frequency_writes * 64 + mp->frequency_reads * 32
+*************** compute_memory_partitions (void)
+*** 1573,1578 ****
+--- 1574,1580 ----
+    VEC(tree,heap) *tags;
+    struct mem_ref_stats_d *mem_ref_stats;
+    int prev_max_aliased_vops;
++   referenced_var_iterator rvi;
+  
+    mem_ref_stats = gimple_mem_ref_stats (cfun);
+    gcc_assert (mem_ref_stats->num_vuses == 0 && mem_ref_stats->num_vdefs == 0);
+*************** compute_memory_partitions (void)
+*** 1639,1650 ****
+  	 fields.  See add_vars_for_offset for details.  */
+        if (TREE_CODE (mp_p->var) == STRUCT_FIELD_TAG
+  	  && SFT_UNPARTITIONABLE_P (mp_p->var))
+! 	continue;
+  
+!       mpt = find_partition_for (mp_p);
+        estimate_vop_reduction (mem_ref_stats, mp_p, mpt);
+      }
+  
+    /* After partitions have been created, rewrite alias sets to use
+       them instead of the original symbols.  This way, if the alias set
+       was computed as { a b c d e f }, and the subset { b e f } was
+--- 1641,1705 ----
+  	 fields.  See add_vars_for_offset for details.  */
+        if (TREE_CODE (mp_p->var) == STRUCT_FIELD_TAG
+  	  && SFT_UNPARTITIONABLE_P (mp_p->var))
+! 	{
+! 	  subvar_t subvars;
+! 	  unsigned i;
+! 	  tree subvar;
+! 
+! 	  /* For call clobbered we can partition them because we
+! 	     are sure all subvars end up in the same partition.  */
+! 	  if (!is_call_clobbered (mp_p->var))
+! 	    continue;
+! 
+! 	  mpt = find_partition_for (mp_p);
+! 	  estimate_vop_reduction (mem_ref_stats, mp_p, mpt);
+! 
+! 	  /* If we encounter a call-clobbered but unpartitionable SFT
+! 	     partition all SFTs of its parent variable.  */
+! 	  subvars = get_subvars_for_var (SFT_PARENT_VAR (mp_p->var));
+! 	  for (i = 0; VEC_iterate (tree, subvars, i, subvar); ++i)
+! 	    {
+! 	      gcc_assert (!var_ann (subvar)->mpt
+! 			  || var_ann (subvar)->mpt == mpt);
+! 	      set_memory_partition (subvar, mpt);
+! 	      mark_sym_for_renaming (subvar);
+! 	    }
+  
+! 	  /* ???  We possibly underestimate the VOP reduction if
+! 	     we do not encounter all subvars before we are below
+! 	     the threshold.  We could fix this by sorting in a way
+! 	     that all subvars of a var appear before all
+! 	     unpartitionable vars of it.  */
+! 	  continue;
+! 	}
+! 
+!       /* We might encounter an already partitioned symbol due to
+!          the SFT handling above.  Deal with that.  */
+!       if (var_ann (mp_p->var)->mpt)
+! 	mpt = var_ann (mp_p->var)->mpt;
+!       else
+! 	mpt = find_partition_for (mp_p);
+        estimate_vop_reduction (mem_ref_stats, mp_p, mpt);
+      }
+  
++ #ifdef ENABLE_CHECKING
++   /* For all partitioned unpartitionable subvars make sure all
++      subvars of its parent var are partitioned into the same partition.  */
++   FOR_EACH_REFERENCED_VAR (tag, rvi)
++     if (TREE_CODE (tag) == STRUCT_FIELD_TAG
++ 	&& SFT_UNPARTITIONABLE_P (tag)
++ 	&& var_ann (tag)->mpt != NULL_TREE)
++       {
++ 	subvar_t subvars;
++ 	unsigned i;
++ 	tree subvar;
++ 
++ 	subvars = get_subvars_for_var (SFT_PARENT_VAR (tag));
++ 	for (i = 0; VEC_iterate (tree, subvars, i, subvar); ++i)
++ 	  gcc_assert (var_ann (subvar)->mpt == var_ann (tag)->mpt);
++       }
++ #endif
++ 
+    /* After partitions have been created, rewrite alias sets to use
+       them instead of the original symbols.  This way, if the alias set
+       was computed as { a b c d e f }, and the subset { b e f } was
================================================================


More information about the pld-cvs-commit mailing list