tree-flow.h (subvar_t): Make it a VEC.
authorRichard Guenther <rguenther@suse.de>
Sun, 28 Oct 2007 16:14:44 +0000 (16:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sun, 28 Oct 2007 16:14:44 +0000 (16:14 +0000)
2007-10-28  Richard Guenther  <rguenther@suse.de>

* tree-flow.h (subvar_t): Make it a VEC.
(struct subvar): Remove.
(struct var_ann_d): Use VEC(tree,gc) to store subvars.
* tree-flow-inline.h (get_subvar_at): Adjust iterators over
variable subvars.
* tree-into-ssa.c (mark_sym_for_renaming): Likewise.
* tree-nrv.c (dest_safe_for_nrv_p): Likewise.
* tree-ssa-alias.c (mark_aliases_call_clobbered): Likewise.
(set_initial_properties): Likewise.
(setup_pointers_and_addressables): Likewise.
(new_type_alias): Likewise.
(create_overlap_variables_for): Likewise.
* tree-dfa.c (dump_subvars_for): Likewise.
* tree-ssa-operands.c (add_vars_for_offset): Likewise.
(get_expr_operands): Likewise.
(add_to_addressable_set): Likewise.
* tree-ssa-structalias.c (set_uids_in_ptset): Likewise.

* gcc.dg/tree-ssa/alias-15.c: Adjust pattern.

From-SVN: r129699

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/alias-15.c
gcc/tree-dfa.c
gcc/tree-flow-inline.h
gcc/tree-flow.h
gcc/tree-into-ssa.c
gcc/tree-nrv.c
gcc/tree-ssa-alias.c
gcc/tree-ssa-operands.c
gcc/tree-ssa-structalias.c

index 7ec6c5710e3ee65b0808c3d1e082f79c71f073c7..3064b8bd80bbcb0e567ad033c2a527441365efdb 100644 (file)
@@ -1,3 +1,23 @@
+2007-10-28  Richard Guenther  <rguenther@suse.de>
+
+       * tree-flow.h (subvar_t): Make it a VEC.
+       (struct subvar): Remove.
+       (struct var_ann_d): Use VEC(tree,gc) to store subvars.
+       * tree-flow-inline.h (get_subvar_at): Adjust iterators over
+       variable subvars.
+       * tree-into-ssa.c (mark_sym_for_renaming): Likewise.
+       * tree-nrv.c (dest_safe_for_nrv_p): Likewise.
+       * tree-ssa-alias.c (mark_aliases_call_clobbered): Likewise.
+       (set_initial_properties): Likewise.
+       (setup_pointers_and_addressables): Likewise.
+       (new_type_alias): Likewise.
+       (create_overlap_variables_for): Likewise.
+       * tree-dfa.c (dump_subvars_for): Likewise.
+       * tree-ssa-operands.c (add_vars_for_offset): Likewise.
+       (get_expr_operands): Likewise.
+       (add_to_addressable_set): Likewise.
+       * tree-ssa-structalias.c (set_uids_in_ptset): Likewise.
+
 2007-10-28  Uros Bizjak  <ubizjak@gmail.com>
 
        PR tree-optimization/33920
index 2988c0c378d364467c19324b57dadf96d5d5a16e..d3305b8c7d578d44c088e2f085a268252679e189 100644 (file)
@@ -1,3 +1,7 @@
+2007-10-28  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/alias-15.c: Adjust pattern.
+
 2007-10-28  Martin Michlmayr  <tbm@cyrius.com>
            Uros Bizjak  <ubizjak@gmail.com>
 
index 9e409f082167350b0f86c6eb92319ceafb2a48f7..4155b030c88084a8f6d882c4e592da0a34004230 100644 (file)
@@ -15,6 +15,6 @@ int test2(void)
   return p->b[3] - m.b.b[3];
 }
 
-/* { dg-final { scan-tree-dump "SFT.1 created for var m offset 128" "salias" } } */
-/* { dg-final { scan-tree-dump-times "VUSE <SFT.1_" 2 "salias" } } */
+/* { dg-final { scan-tree-dump "SFT.5 created for var m offset 128" "salias" } } */
+/* { dg-final { scan-tree-dump-times "VUSE <SFT.5_" 2 "salias" } } */
 /* { dg-final { cleanup-tree-dump "salias" } } */
index 79f3b8712bcde3a5c9efedb05fc980248bb1809b..1ec0264a5fa0d11f8fb8050f29d53b7556fcaf81 100644 (file)
@@ -276,15 +276,17 @@ void
 dump_subvars_for (FILE *file, tree var)
 {
   subvar_t sv = get_subvars_for_var (var);
+  tree subvar;
+  unsigned int i;
 
   if (!sv)
     return;
 
   fprintf (file, "{ ");
 
-  for (; sv; sv = sv->next)
+  for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
     {
-      print_generic_expr (file, sv->var, dump_flags);
+      print_generic_expr (file, subvar, dump_flags);
       fprintf (file, " ");
     }
 
index 7f47bba4c7d794928845a64f8fda1a27fd6b21f9..b87f3d2fc843f9257b76974474d4546d65712772 100644 (file)
@@ -1609,11 +1609,14 @@ get_subvars_for_var (tree var)
 static inline tree
 get_subvar_at (tree var, unsigned HOST_WIDE_INT offset)
 {
-  subvar_t sv;
-
-  for (sv = get_subvars_for_var (var); sv; sv = sv->next)
-    if (SFT_OFFSET (sv->var) == offset)
-      return sv->var;
+  subvar_t sv = get_subvars_for_var (var);
+  unsigned int i;
+  tree subvar;
+
+  /* ???  Binary search would be possible here.  */
+  for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
+    if (SFT_OFFSET (subvar) == offset)
+      return subvar;
 
   return NULL_TREE;
 }
index 1d6808bfd6cd6a11af4517d7b968c1f75e9848e6..6e7b88b672bee2dcff39b9c6ecc45b74f1b59b15 100644 (file)
@@ -308,18 +308,7 @@ enum noalias_state {
 };
 
 
-struct subvar;
-typedef struct subvar *subvar_t;
-
-/* This structure represents a fake sub-variable for a structure field.  */
-struct subvar GTY(())
-{
-  /* Fake variable.  */
-  tree var;
-
-  /* Next subvar for this structure.  */
-  subvar_t next;
-};
+typedef VEC(tree,gc) *subvar_t;
 
 struct var_ann_d GTY(())
 {
@@ -384,9 +373,9 @@ struct var_ann_d GTY(())
      current version of this variable (an SSA_NAME).  */
   tree current_def;
 
-  /* If this variable is a structure, this fields holds a list of
-     symbols representing each of the fields of the structure.  */
-  subvar_t subvars;
+  /* If this variable is a structure, this fields holds an array
+     of symbols representing each of the fields of the structure.  */
+  VEC(tree,gc) *subvars;
 
   /* Mask of values saying the reasons why this variable has escaped
      the function.  */
index 2baf879627ebf060da5314350174065540f7276d..c55f7363697b65edf14e25a769c5a7349e2ee471 100644 (file)
@@ -2793,9 +2793,11 @@ mark_sym_for_renaming (tree sym)
     subvar_t svars;
     if (var_can_have_subvars (sym) && (svars = get_subvars_for_var (sym)))
       {
-       subvar_t sv;
-       for (sv = svars; sv; sv = sv->next)
-         mark_sym_for_renaming (sv->var);
+        unsigned int i;
+       tree subvar;
+
+       for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
+         mark_sym_for_renaming (subvar);
       }
   }
 
index 9acfb60fa221f1b1eb2451c35c2a93bd0c0631c4..ef5ee67a2f3119c419c20833dabc631bcd793e34 100644 (file)
@@ -249,7 +249,9 @@ struct tree_opt_pass pass_nrv =
 static bool
 dest_safe_for_nrv_p (tree dest)
 {
-  subvar_t subvar;
+  subvar_t sv;
+  unsigned int i;
+  tree subvar;
 
   while (handled_component_p (dest))
     dest = TREE_OPERAND (dest, 0);
@@ -262,9 +264,12 @@ dest_safe_for_nrv_p (tree dest)
 
   if (is_call_clobbered (dest))
     return false;
-  for (subvar = get_subvars_for_var (dest); subvar; subvar = subvar->next)
-    if (is_call_clobbered (subvar->var))
+
+  sv = get_subvars_for_var (dest);
+  for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
+    if (is_call_clobbered (subvar))
       return false;
+
   return true;
 }
 
index e96f0ef899b7d6dbb3c681714c5cfda63559151e..dc40c2ef398fa37ce5930a9fe64bc506a65d0942 100644 (file)
@@ -422,11 +422,13 @@ mark_aliases_call_clobbered (tree tag, VEC (tree, heap) **worklist,
     {
       EXECUTE_IF_SET_IN_BITMAP (queued, 0, i, bi)
        {
-         subvar_t svars;
-         svars = get_subvars_for_var (referenced_var (i));
-         for (; svars; svars = svars->next)
-           if (!unmodifiable_var_p (svars->var))
-              mark_call_clobbered (svars->var, ta->escape_mask);
+         subvar_t svars = get_subvars_for_var (referenced_var (i));
+         unsigned int i;
+         tree subvar;
+
+         for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
+           if (!unmodifiable_var_p (subvar))
+              mark_call_clobbered (subvar, ta->escape_mask);
        }
       bitmap_clear (queued);
     }
@@ -600,11 +602,13 @@ set_initial_properties (struct alias_info *ai)
                {
                  EXECUTE_IF_SET_IN_BITMAP (queued, 0, j, bi)
                    {
-                     subvar_t svars;
-                     svars = get_subvars_for_var (referenced_var (j));
-                     for (; svars; svars = svars->next)
-                       if (!unmodifiable_var_p (svars->var))
-                         mark_call_clobbered (svars->var, pi->escape_mask);
+                     subvar_t svars = get_subvars_for_var (referenced_var (j));
+                     unsigned int i;
+                     tree subvar;
+
+                     for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
+                       if (!unmodifiable_var_p (subvar))
+                         mark_call_clobbered (subvar, pi->escape_mask);
                    }
                  bitmap_clear (queued);
                }
@@ -2644,14 +2648,15 @@ setup_pointers_and_addressables (struct alias_info *ai)
              if (var_can_have_subvars (var)
                  && (svars = get_subvars_for_var (var)))
                {
-                 subvar_t sv;
+                 unsigned int i;
+                 tree subvar;
 
-                 for (sv = svars; sv; sv = sv->next)
+                 for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
                    {         
                      if (bitmap_bit_p (gimple_addressable_vars (cfun),
-                                       DECL_UID (sv->var)))
+                                       DECL_UID (subvar)))
                        okay_to_mark = false;
-                     mark_sym_for_renaming (sv->var);
+                     mark_sym_for_renaming (subvar);
                    }
                }
 
@@ -3574,8 +3579,9 @@ new_type_alias (tree ptr, tree var, tree expr)
   HOST_WIDE_INT offset, size, maxsize;
   tree ref;
   VEC (tree, heap) *overlaps = NULL;
-  subvar_t sv;
-  unsigned int len;
+  unsigned int len, i;
+  tree subvar;
+
 
   gcc_assert (symbol_mem_tag (ptr) == NULL_TREE);
   gcc_assert (!MTAG_P (var));
@@ -3591,12 +3597,12 @@ new_type_alias (tree ptr, tree var, tree expr)
   if (var_can_have_subvars (ref)
       && (svars = get_subvars_for_var (ref)))
     {
-      for (sv = svars; sv; sv = sv->next)
+      for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
        {
           bool exact;
 
-          if (overlap_subvar (offset, maxsize, sv->var, &exact))
-            VEC_safe_push (tree, heap, overlaps, sv->var);
+          if (overlap_subvar (offset, maxsize, subvar, &exact))
+            VEC_safe_push (tree, heap, overlaps, subvar);
         }
       gcc_assert (overlaps != NULL);
     }
@@ -3610,8 +3616,8 @@ new_type_alias (tree ptr, tree var, tree expr)
         On mem-ssa branch, the scanning for virtual operands have been
         split from the rest of tree-ssa-operands, so it should be much
         easier to fix this problem correctly once mem-ssa is merged.  */
-      for (sv = svars; sv; sv = sv->next)
-       VEC_safe_push (tree, heap, overlaps, sv->var);
+      for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
+       VEC_safe_push (tree, heap, overlaps, subvar);
 
       gcc_assert (overlaps != NULL);
     }
@@ -3873,15 +3879,14 @@ create_overlap_variables_for (tree var)
       
       /* Otherwise, create the variables.  */
       subvars = lookup_subvars_for_var (var);
-      
+      *subvars = VEC_alloc (tree, gc, VEC_length (fieldoff_s, fieldstack));
       sort_fieldstack (fieldstack);
 
-      for (i = VEC_length (fieldoff_s, fieldstack);
-          VEC_iterate (fieldoff_s, fieldstack, --i, fo);)
+      for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); ++i)
        {
-         subvar_t sv;
          HOST_WIDE_INT fosize;
-         tree currfotype;
+         tree currfotype, subvar;
 
          fosize = TREE_INT_CST_LOW (fo->size);
          currfotype = fo->type;
@@ -3900,26 +3905,24 @@ create_overlap_variables_for (tree var)
                  && fosize == lastfosize
                  && currfotype == lastfotype))
            continue;
-         sv = GGC_NEW (struct subvar);
-         sv->next = *subvars;
-         sv->var =
-           create_sft (var, fo->type, fo->offset, fosize, fo->alias_set);
+         subvar = create_sft (var, fo->type, fo->offset,
+                              fosize, fo->alias_set);
+         VEC_quick_push (tree, *subvars, subvar);
 
          if (dump_file)
            {
              fprintf (dump_file, "structure field tag %s created for var %s",
-                      get_name (sv->var), get_name (var));
+                      get_name (subvar), get_name (var));
              fprintf (dump_file, " offset " HOST_WIDE_INT_PRINT_DEC,
-                      SFT_OFFSET (sv->var));
+                      SFT_OFFSET (subvar));
              fprintf (dump_file, " size " HOST_WIDE_INT_PRINT_DEC,
-                      SFT_SIZE (sv->var));
+                      SFT_SIZE (subvar));
              fprintf (dump_file, "\n");
            }
          
          lastfotype = currfotype;
          lastfooffset = fo->offset;
          lastfosize = fosize;
-         *subvars = sv;
        }
 
       /* Once we have created subvars, the original is no longer call
index 206c04bd484ddc6e6c855582baf4c24b237299ef..1c4299fffc0fcb4c49e61ae3b2f67f07f78658f3 100644 (file)
@@ -1421,20 +1421,23 @@ add_vars_for_offset (tree full_ref, tree var, HOST_WIDE_INT offset,
     {      
       bool added = false;
       subvar_t sv = get_subvars_for_var (SFT_PARENT_VAR (var));
-      for (; sv; sv = sv->next)
+      unsigned int i;
+      tree subvar;
+
+      for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
        {
          /* Once we hit the end of the parts that could touch,
             stop looking.  */
          if (size != -1
-             && SFT_OFFSET (var) + offset + size <= SFT_OFFSET (sv->var))
+             && SFT_OFFSET (var) + offset + size <= SFT_OFFSET (subvar))
            break;
-         if (overlap_subvar (SFT_OFFSET (var) + offset, size, sv->var, NULL))
+         if (overlap_subvar (SFT_OFFSET (var) + offset, size, subvar, NULL))
            {
              added = true;
              if (is_def)
-               append_vdef (sv->var);
+               append_vdef (subvar);
              else
-               append_vuse (sv->var);
+               append_vuse (subvar);
            }
        }
       return added;
@@ -2092,9 +2095,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
        if (var_can_have_subvars (expr)
            && (svars = get_subvars_for_var (expr)))
          {
-           subvar_t sv;
-           for (sv = svars; sv; sv = sv->next)
-             add_stmt_operand (&sv->var, s_ann, flags);
+           unsigned int i;
+           tree subvar;
+           for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
+             add_stmt_operand (&subvar, s_ann, flags);
          }
        else
          add_stmt_operand (expr_p, s_ann, flags);
@@ -2137,18 +2141,19 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
        ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
        if (SSA_VAR_P (ref) && get_subvars_for_var (ref))
          {
-           subvar_t sv;
            subvar_t svars = get_subvars_for_var (ref);
+           unsigned int i;
+           tree subvar;
 
-           for (sv = svars; sv; sv = sv->next)
+           for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
              {
                bool exact;             
 
-               if (overlap_subvar (offset, maxsize, sv->var, &exact))
+               if (overlap_subvar (offset, maxsize, subvar, &exact))
                  {
                    int subvar_flags = flags;
                    none = false;
-                   add_stmt_operand (&sv->var, s_ann, subvar_flags);
+                   add_stmt_operand (&subvar, s_ann, subvar_flags);
                  }
              }
 
@@ -2710,11 +2715,12 @@ add_to_addressable_set (tree ref, bitmap *addresses_taken)
       if (var_can_have_subvars (var)
          && (svars = get_subvars_for_var (var)))
        {
-         subvar_t sv;
-         for (sv = svars; sv; sv = sv->next)
+         unsigned int i;
+         tree subvar;
+         for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
            {
-             bitmap_set_bit (*addresses_taken, DECL_UID (sv->var));
-             TREE_ADDRESSABLE (sv->var) = 1;
+             bitmap_set_bit (*addresses_taken, DECL_UID (subvar));
+             TREE_ADDRESSABLE (subvar) = 1;
            }
        }
       else
index a99839c7e8443fa051d74b62f59d304c26093bd4..02124992b5b94090a4004690187bed332919cb44 100644 (file)
@@ -4702,7 +4702,6 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed,
 {
   unsigned int i;
   bitmap_iterator bi;
-  subvar_t sv;
   alias_set_type ptr_alias_set = get_alias_set (TREE_TYPE (ptr));
 
   EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
@@ -4717,10 +4716,14 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed,
 
       if (vi->has_union && get_subvars_for_var (vi->decl) != NULL)
        {
+         unsigned int i;
+         tree subvar;
+         subvar_t sv = get_subvars_for_var (vi->decl);
+
          /* Variables containing unions may need to be converted to
             their SFT's, because SFT's can have unions and we cannot.  */
-         for (sv = get_subvars_for_var (vi->decl); sv; sv = sv->next)
-           bitmap_set_bit (into, DECL_UID (sv->var));
+         for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
+           bitmap_set_bit (into, DECL_UID (subvar));
        }
       else if (TREE_CODE (vi->decl) == VAR_DECL
               || TREE_CODE (vi->decl) == PARM_DECL