diff options
| author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-24 01:05:45 +0000 | 
|---|---|---|
| committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-24 01:05:45 +0000 | 
| commit | cbbefea46e5a749a5182df5770cc70f30e12aa2e (patch) | |
| tree | 152cb570bb5673abd6f3cb0e91129d27c8889d40 /gcc | |
| parent | 1f63eb0c40acb3350bb371130e878bf7156266a7 (diff) | |
| download | ppe42-gcc-cbbefea46e5a749a5182df5770cc70f30e12aa2e.tar.gz ppe42-gcc-cbbefea46e5a749a5182df5770cc70f30e12aa2e.zip  | |
	PR tree-optimization/16688
	PR tree-optimization/16689
	* tree-ssa-alias.c (setup_pointers_and_addressables): Remove
	unnecessary initialization of 'tag'.
	(get_tmt_for): Check that the new type tag has the same alias
	set as the pointed-to type.
	(group_aliases): Only regular variables need to be removed
	from the alias set of a name tag.
	* tree-ssa-copy.c (may_propagate_copy): Do not allow copy
	propagation if the two types are not compatible.
	(merge_alias_info): Rename from replace_ssa_names_ann.
	Add more checking.
	(replace_exp_1): If both arguments are SSA_NAMEs, check that
	the propagation can be done.
	Only call merge_alias_info on pointers.
	(propagate_value): Likewise.
	* tree-ssa-copyrename.c: Include langhooks.h.
	(copy_rename_partition_coalesce): Call replace_ssa_name_symbol
	to do the merging.
	Do not coalesce variables with incompatible types.
	(rename_ssa_copies): Call replace_ssa_name_symbol.
	* tree-ssa.c (verify_ssa_name): Verify that the SSA_NAME has
	the same type as the underlying _DECL.
	* tree-ssanames.c (replace_ssa_name_symbol): New function.
	* tree.h (replace_ssa_name_symbol): Declare.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@85108 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 28 | ||||
| -rw-r--r-- | gcc/tree-ssa-alias.c | 13 | ||||
| -rw-r--r-- | gcc/tree-ssa-copy.c | 83 | ||||
| -rw-r--r-- | gcc/tree-ssa-copyrename.c | 15 | ||||
| -rw-r--r-- | gcc/tree-ssa.c | 6 | ||||
| -rw-r--r-- | gcc/tree-ssanames.c | 10 | ||||
| -rw-r--r-- | gcc/tree.h | 1 | 
7 files changed, 119 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a563915de0..bd8785c902c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,31 @@ +2004-07-23  Diego Novillo  <dnovillo@redhat.com> + +	PR tree-optimization/16688 +	PR tree-optimization/16689 +	* tree-ssa-alias.c (setup_pointers_and_addressables): Remove +	unnecessary initialization of 'tag'. +	(get_tmt_for): Check that the new type tag has the same alias +	set as the pointed-to type. +	(group_aliases): Only regular variables need to be removed +	from the alias set of a name tag. +	* tree-ssa-copy.c (may_propagate_copy): Do not allow copy +	propagation if the two types are not compatible. +	(merge_alias_info): Rename from replace_ssa_names_ann. +	Add more checking. +	(replace_exp_1): If both arguments are SSA_NAMEs, check that +	the propagation can be done. +	Only call merge_alias_info on pointers. +	(propagate_value): Likewise. +	* tree-ssa-copyrename.c: Include langhooks.h. +	(copy_rename_partition_coalesce): Call replace_ssa_name_symbol +	to do the merging. +	Do not coalesce variables with incompatible types. +	(rename_ssa_copies): Call replace_ssa_name_symbol. +	* tree-ssa.c (verify_ssa_name): Verify that the SSA_NAME has +	the same type as the underlying _DECL. +	* tree-ssanames.c (replace_ssa_name_symbol): New function. +	* tree.h (replace_ssa_name_symbol): Declare. +  2004-07-23  Richard Henderson  <rth@redhat.com>  	PR c++/16277 diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index a854b0bd897..fab9e027841 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1225,7 +1225,8 @@ group_aliases (struct alias_info *ai)  	{  	  tree alias = VARRAY_TREE (aliases, j);  	  var_ann_t ann = var_ann (alias); -	  if (ann->may_aliases) + +	  if (ann->mem_tag_kind == NOT_A_TAG && ann->may_aliases)  	    {  	      tree new_alias; @@ -1370,7 +1371,7 @@ setup_pointers_and_addressables (struct alias_info *ai)  	  && (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid)  	      || bitmap_bit_p (ai->dereferenced_ptrs_load, v_ann->uid)))  	{ -	  tree tag = v_ann->type_mem_tag; +	  tree tag;  	  var_ann_t t_ann;  	  /* If pointer VAR still doesn't have a memory tag associated @@ -2170,6 +2171,14 @@ get_tmt_for (tree ptr, struct alias_info *ai)        ai->pointers[ai->num_pointers++] = alias_map;      } +#if defined ENABLE_CHECKING +  /* Make sure that the type tag has the same alias set as the +     pointed-to type.  */ +  if (tag_set != get_alias_set (tag)) +    abort (); +#endif + +    return tag;  } diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 5d96fae8e5b..0ddfa9ce825 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -110,6 +110,8 @@ may_propagate_copy (tree dest, tree orig)        tree mt_orig = var_ann (SSA_NAME_VAR (orig))->type_mem_tag;        if (mt_dest && mt_orig && mt_dest != mt_orig)  	return false; +      else if (!lang_hooks.types_compatible_p (type_d, type_o)) +	return false;      }    /* If the destination is a SSA_NAME for a virtual operand, then we have @@ -152,41 +154,40 @@ may_propagate_copy (tree dest, tree orig)    return true;  } -/* Given two SSA_NAMEs, replace the annotations for the one referred to by OP  -   with VAR's annotations. - -   If OP is a pointer, copy the memory tag used originally by OP into -   VAR.  This is needed in cases where VAR had never been dereferenced in the -   program. -   If FOR_PROPAGATION is true, then perform additional checks to ensure -   that const/copy propagation of var for OP is valid.  */ +/* Given two SSA_NAMEs pointers ORIG and NEW such that we are copy +   propagating NEW into ORIG, consolidate aliasing information so that +   they both share the same memory tags.  */  static void -replace_ssa_names_ann (tree op, -		   tree var, -		   bool for_propagation ATTRIBUTE_UNUSED) +merge_alias_info (tree orig, tree new)  { +  tree new_sym = SSA_NAME_VAR (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); +  #if defined ENABLE_CHECKING -  if (for_propagation && !may_propagate_copy (op, var)) +  if (!POINTER_TYPE_P (TREE_TYPE (orig)) +      || !POINTER_TYPE_P (TREE_TYPE (new)) +      || !lang_hooks.types_compatible_p (TREE_TYPE (orig), TREE_TYPE (new)))      abort (); -#endif -  /* If VAR doesn't have a memory tag, copy the one from the original -     operand.  Also copy the dereferenced flags.  */ -  if (POINTER_TYPE_P (TREE_TYPE (op))) -    { -      var_ann_t new_ann = var_ann (SSA_NAME_VAR (var)); -      var_ann_t orig_ann = var_ann (SSA_NAME_VAR (op)); - -      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 if (new_ann->type_mem_tag != orig_ann->type_mem_tag) -	abort (); -    } +  /* If the pointed-to alias sets are different, these two pointers +     would never have the same memory tag.  In this case, NEW should +     not have been propagated into ORIG.  */ +  if (get_alias_set (TREE_TYPE (TREE_TYPE (new_sym))) +      != get_alias_set (TREE_TYPE (TREE_TYPE (orig_sym)))) +    abort (); +#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 if (new_ann->type_mem_tag != orig_ann->type_mem_tag) +    abort ();  }    @@ -196,12 +197,23 @@ replace_ssa_names_ann (tree op,     replacement is done to propagate a value or not.  */  static void -replace_exp_1 (use_operand_p op_p, tree val, bool for_propagation) +replace_exp_1 (use_operand_p op_p, tree val, +	       bool for_propagation ATTRIBUTE_UNUSED)  { +  tree op = USE_FROM_PTR (op_p); + +#if defined ENABLE_CHECKING +  if (for_propagation +      && TREE_CODE (op) == SSA_NAME +      && TREE_CODE (val) == SSA_NAME +      && !may_propagate_copy (op, val)) +    abort (); +#endif +    if (TREE_CODE (val) == SSA_NAME)      { -      if (TREE_CODE (USE_FROM_PTR (op_p)) == SSA_NAME) -	replace_ssa_names_ann (USE_FROM_PTR (op_p), val, for_propagation); +      if (TREE_CODE (op) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (op))) +	merge_alias_info (op, val);        SET_USE (op_p, val);      }    else @@ -233,10 +245,17 @@ propagate_value (use_operand_p op_p, tree val)  void  propagate_tree_value (tree *op_p, tree val)  { +#if defined ENABLE_CHECKING +  if (TREE_CODE (val) == SSA_NAME +      && TREE_CODE (*op_p) == SSA_NAME +      && !may_propagate_copy (*op_p, val)) +    abort (); +#endif +    if (TREE_CODE (val) == SSA_NAME)      { -      if (TREE_CODE (*op_p) == SSA_NAME) -	replace_ssa_names_ann (*op_p, val, true); +      if (TREE_CODE (*op_p) == SSA_NAME && POINTER_TYPE_P (TREE_TYPE (*op_p))) +	merge_alias_info (*op_p, val);        *op_p = val;      }    else diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index c65b8284de6..ac7c00aa06e 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA.  */  #include "tree-dump.h"  #include "tree-ssa-live.h"  #include "tree-pass.h" +#include "langhooks.h"  extern void rename_ssa_copies (void); @@ -247,16 +248,24 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)  	gimp2 = false;        } +  /* Don't coalesce if the two variables aren't type compatible.  */ +  if (!lang_hooks.types_compatible_p (TREE_TYPE (root1), TREE_TYPE (root2))) +    { +      if (debug) +	fprintf (debug, " : Incompatible types.  No coalesce.\n"); +      return; +    } +    /* Merge the two partitions.  */    p3 = partition_union (map->var_partition, p1, p2);    /* Set the root variable of the partition to the better choice, if there is        one.  */    if (!gimp2) -    SSA_NAME_VAR (partition_to_var (map, p3)) = root2; +    replace_ssa_name_symbol (partition_to_var (map, p3), root2);    else      if (!gimp1) -      SSA_NAME_VAR (partition_to_var (map, p3)) = root1; +      replace_ssa_name_symbol (partition_to_var (map, p3), root1);    /* Update the various flag widgitry of the current base representative.  */    ann3 = var_ann (SSA_NAME_VAR (partition_to_var (map, p3))); @@ -359,7 +368,7 @@ rename_ssa_copies (void)  	      fprintf (debug, "\n");  	    }  	} -      SSA_NAME_VAR (var) = SSA_NAME_VAR (part_var); +      replace_ssa_name_symbol (var, SSA_NAME_VAR (part_var));      }    delete_var_map (map); diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 6e92597f511..27b3a5b1bf0 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -118,6 +118,12 @@ verify_ssa_name (tree ssa_name, bool is_virtual)        return true;      } +  if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name))) +    { +      error ("Type mismatch between an SSA_NAME and its symbol."); +      return true; +    } +    if (SSA_NAME_IN_FREE_LIST (ssa_name))      {        error ("Found an SSA_NAME that had been released into the free pool"); diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 2785e530b3c..4e8985a4b21 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -249,4 +249,14 @@ release_defs (tree stmt)      release_ssa_name (V_MUST_DEF_OP (v_must_defs, i));  } + +/* Replace the symbol associated with SSA_NAME with SYM.  */ + +void +replace_ssa_name_symbol (tree ssa_name, tree sym) +{ +  SSA_NAME_VAR (ssa_name) = sym; +  TREE_TYPE (ssa_name) = TREE_TYPE (sym); +} +  #include "gt-tree-ssanames.h" diff --git a/gcc/tree.h b/gcc/tree.h index 1962d72dff5..a5c0a2c2ad6 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2648,6 +2648,7 @@ extern tree make_ssa_name (tree, tree);  extern tree duplicate_ssa_name (tree, tree);  extern void release_ssa_name (tree);  extern void release_defs (tree); +extern void replace_ssa_name_symbol (tree, tree);  #ifdef GATHER_STATISTICS  extern void ssanames_print_statistics (void);  | 

