tree-ssa-alias.c (compute_flow_insensitive_aliasing): Make sure subvars get marked...
authorDaniel Berlin <dberlin@dberlin.org>
Wed, 30 Mar 2005 22:10:47 +0000 (22:10 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Wed, 30 Mar 2005 22:10:47 +0000 (22:10 +0000)
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.

From-SVN: r97285

gcc/ChangeLog
gcc/tree-ssa-alias.c
gcc/tree-ssa-operands.c
gcc/tree-ssa.c

index be4f8c255e447c42fec8995754eaf6dbaffcd4e2..9fac180b8e7e430b51c192b43512dda4238b3e40 100644 (file)
@@ -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.
index 12a432b79a3c2aa120c4b7f6854b32eb93cbd6a9..c08cf3b1bfa1125aadb8d4820b23fca829d6a88b 100644 (file)
@@ -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);
 }
 
index 1ef06db602f1851f66b5b4803a29e35f083228d9..916814dc4deac28dd1cec14de07b2ff2acc5b55b 100644 (file)
@@ -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);
            }
 
index b3fda97f9f41032df9849acd1f349e997bf97a1a..899594db2228a972654967c33b24db442d8e200f 100644 (file)
@@ -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;
 }