From 10eb6bce2f0f650de299e79316ba4e02863e7da8 Mon Sep 17 00:00:00 2001
From: dberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 30 Mar 2005 22:10:47 +0000
Subject: [PATCH] 2005-03-30  Daniel Berlin  <dberlin@dberlin.org>

	* tree-ssa-alias.c (compute_flow_insensitive_aliasing): Make sure
	subvars get marked properly in tags for grouping.
	(add_pointed_to_var): Mark only actual pointed to
	variables/subvars in addresses needed.
	(create_overlap_variables_for): Clear call clobbered on original
	variable.
	* tree-ssa-operands.c (get_asm_expr_operands): Don't let regular
	addresable vars with subvars into list.
	* tree-ssa.c (verify_ssa_name): Verify original is not used where
	subvar should be.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97285 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog           | 13 +++++++++++++
 gcc/tree-ssa-alias.c    | 41 +++++++++++++++++++++++++++++++----------
 gcc/tree-ssa-operands.c | 11 +++++++++++
 gcc/tree-ssa.c          |  7 +++++++
 4 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index be4f8c255e4..9fac180b8e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2005-03-30  Daniel Berlin  <dberlin@dberlin.org>
+
+	* tree-ssa-alias.c (compute_flow_insensitive_aliasing): Make sure
+	subvars get marked properly in tags for grouping.
+	(add_pointed_to_var): Mark only actual pointed to
+	variables/subvars in addresses needed.
+	(create_overlap_variables_for): Clear call clobbered on original
+	variable.
+	* tree-ssa-operands.c (get_asm_expr_operands): Don't let regular
+	addresable vars with subvars into list.
+	* tree-ssa.c (verify_ssa_name): Verify original is not used where
+	subvar should be.
+
 2005-03-30  Richard Henderson  <rth@redhat.com>
 
 	* cgraph.h (struct cgraph_node): Add alias.
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 12a432b79a3..c08cf3b1bfa 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -1006,11 +1006,19 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
 		  subvar_t sv;
 
 		  for (sv = svars; sv; sv = sv->next)
-		    add_may_alias (tag, sv->var);
+		    {
+		      add_may_alias (tag, sv->var);
+		      /* Update the bitmap used to represent TAG's alias set
+			 in case we need to group aliases.  */
+		      SET_BIT (p_map->may_aliases, var_ann (sv->var)->uid);
+		    }
 		}
 	      else
 		{
 		  add_may_alias (tag, var);
+		  /* Update the bitmap used to represent TAG's alias set
+		     in case we need to group aliases.  */
+		  SET_BIT (p_map->may_aliases, var_ann (var)->uid);
 		}
 
 	      /* Update the total number of virtual operands due to
@@ -1022,9 +1030,7 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
 	      ai->total_alias_vops += (num_var_refs + num_tag_refs);
 	      p_map->total_alias_vops += (num_var_refs + num_tag_refs);
 
-	      /* Update the bitmap used to represent TAG's alias set
-		 in case we need to group aliases.  */
-	      SET_BIT (p_map->may_aliases, var_ann (var)->uid);
+
 	    }
 	}
     }
@@ -1982,7 +1988,7 @@ add_pointed_to_var (struct alias_info *ai, tree ptr, tree value)
       svars = get_subvars_for_var (ref);
 
       uid = var_ann (pt_var)->uid;
-      bitmap_set_bit (ai->addresses_needed, uid);
+      
       if (pi->pt_vars == NULL)
 	pi->pt_vars = BITMAP_GGC_ALLOC ();
        /* If the variable is a global, mark the pointer as pointing to
@@ -1993,15 +1999,17 @@ add_pointed_to_var (struct alias_info *ai, tree ptr, tree value)
       for (sv = svars; sv; sv = sv->next)
 	{
 	  if (overlap_subvar (offset, size, sv, NULL))
-	    bitmap_set_bit (pi->pt_vars, var_ann (sv->var)->uid);
+	    {
+	      bitmap_set_bit (pi->pt_vars, var_ann (sv->var)->uid);
+	      bitmap_set_bit (ai->addresses_needed, var_ann (sv->var)->uid);
+	    }
 	}
     }
   else if (pt_var && SSA_VAR_P (pt_var))
     {
     
       uid = var_ann (pt_var)->uid;
-      bitmap_set_bit (ai->addresses_needed, uid);
-
+      
       if (pi->pt_vars == NULL)
 	pi->pt_vars = BITMAP_GGC_ALLOC ();
 
@@ -2019,7 +2027,10 @@ add_pointed_to_var (struct alias_info *ai, tree ptr, tree value)
 	    }
 	}
       else	
-	bitmap_set_bit (pi->pt_vars, uid);	  
+	{
+	  bitmap_set_bit (ai->addresses_needed, uid);
+	  bitmap_set_bit (pi->pt_vars, uid);	  
+	}
 
       /* If the variable is a global, mark the pointer as pointing to
 	 global memory (which will make its tag a global variable).  */
@@ -2894,8 +2905,18 @@ create_overlap_variables_for (tree var)
 	  *subvars = sv;
 	  free (fo);
 	}
+
+      /* Once we have created subvars, the original is no longer call
+	 clobbered on its own.  Its call clobbered status depends
+	 completely on the call clobbered status of the subvars.
+
+	 add_referenced_var in the above loop will take care of
+	 marking subvars of global variables as call clobbered for us
+	 to start, since they are global as well.  */
+      clear_call_clobbered (var);
+
     }
-  
+
   VEC_free (fieldoff_t, fieldstack);
 }
 
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 1ef06db602f..916814dc4de 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -1370,6 +1370,17 @@ get_asm_expr_operands (tree stmt)
 	EXECUTE_IF_SET_IN_BITMAP (addressable_vars, 0, i, bi)
 	    {
 	      tree var = referenced_var (i);
+
+	      /* Subvars are explicitly represented in this list, so
+		 we don't need the original to be added to the clobber
+		 ops, but the original *will* be in this list because 
+		 we keep the addressability of the original
+		 variable up-to-date so we don't screw up the rest of
+		 the backend.  */
+	      if (var_can_have_subvars (var)
+		  && get_subvars_for_var (var) != NULL)
+		continue;		
+
 	      add_stmt_operand (&var, s_ann, opf_is_def);
 	    }
 
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index b3fda97f9f4..899594db222 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -136,6 +136,13 @@ verify_ssa_name (tree ssa_name, bool is_virtual)
       return true;
     }
 
+  if (is_virtual && var_ann (SSA_NAME_VAR (ssa_name)) 
+      && get_subvars_for_var (SSA_NAME_VAR (ssa_name)) != NULL)
+    {
+      error ("Found real variable when subvariables should have appeared");
+      return true;
+    }
+
   return false;
 }
 
-- 
GitLab