OSDN Git Service

* tree-ssa-structalias.c: Don't include expr.h.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-structalias.c
index 4cfd150..f48bcb2 100644 (file)
@@ -34,7 +34,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 #include "basic-block.h"
 #include "output.h"
 #include "errors.h"
-#include "expr.h"
 #include "diagnostic.h"
 #include "tree.h"
 #include "c-common.h"
@@ -988,8 +987,8 @@ build_constraint_graph (void)
 static unsigned int changed_count;
 static sbitmap changed;
 
-DEF_VEC_I(uint);
-DEF_VEC_ALLOC_I(uint,heap);
+DEF_VEC_I(unsigned);
+DEF_VEC_ALLOC_I(unsigned,heap);
 
 
 /* Strongly Connected Component visitation info.  */
@@ -1000,8 +999,8 @@ struct scc_info
   sbitmap in_component;
   int current_index;
   unsigned int *visited_index;
-  VEC(uint,heap) *scc_stack;
-  VEC(uint,heap) *unification_queue;
+  VEC(unsigned,heap) *scc_stack;
+  VEC(unsigned,heap) *unification_queue;
 };
 
 
@@ -1051,18 +1050,18 @@ scc_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
     {
       unsigned int t = si->visited_index[n];
       SET_BIT (si->in_component, n);
-      while (VEC_length (uint, si->scc_stack) != 0 
-            && t < si->visited_index[VEC_last (uint, si->scc_stack)])
+      while (VEC_length (unsigned, si->scc_stack) != 0 
+            && t < si->visited_index[VEC_last (unsigned, si->scc_stack)])
        {
-         unsigned int w = VEC_pop (uint, si->scc_stack);
+         unsigned int w = VEC_pop (unsigned, si->scc_stack);
          get_varinfo (w)->node = n;
          SET_BIT (si->in_component, w);
          /* Mark this node for collapsing.  */
-         VEC_safe_push (uint, heap, si->unification_queue, w);
+         VEC_safe_push (unsigned, heap, si->unification_queue, w);
        } 
     }
   else
-    VEC_safe_push (uint, heap, si->scc_stack, n);
+    VEC_safe_push (unsigned, heap, si->scc_stack, n);
 }
 
 
@@ -1132,9 +1131,9 @@ process_unification_queue (constraint_graph_t graph, struct scc_info *si,
        changed rep's solution.
        
        Delete any 0 weighted self-edges we now have for rep.  */
-  while (i != VEC_length (uint, si->unification_queue))
+  while (i != VEC_length (unsigned, si->unification_queue))
     {
-      unsigned int tounify = VEC_index (uint, si->unification_queue, i);
+      unsigned int tounify = VEC_index (unsigned, si->unification_queue, i);
       unsigned int n = get_varinfo (tounify)->node;
 
       if (dump_file && (dump_flags & TDF_DETAILS))
@@ -1167,8 +1166,8 @@ process_unification_queue (constraint_graph_t graph, struct scc_info *si,
       /* If we've either finished processing the entire queue, or
         finished processing all nodes for component n, update the solution for
         n.  */
-      if (i == VEC_length (uint, si->unification_queue)
-         || get_varinfo (VEC_index (uint, si->unification_queue, i))->node != n)
+      if (i == VEC_length (unsigned, si->unification_queue)
+         || get_varinfo (VEC_index (unsigned, si->unification_queue, i))->node != n)
        {
          struct constraint_edge edge;
 
@@ -1206,7 +1205,7 @@ struct topo_info
   sbitmap visited;
   /* Array that stores the topological order of the graph, *in
      reverse*.  */
-  VEC(uint,heap) *topo_order;
+  VEC(unsigned,heap) *topo_order;
 };
 
 
@@ -1219,7 +1218,7 @@ init_topo_info (void)
   struct topo_info *ti = xmalloc (sizeof (struct topo_info));
   ti->visited = sbitmap_alloc (size);
   sbitmap_zero (ti->visited);
-  ti->topo_order = VEC_alloc (uint, heap, 1);
+  ti->topo_order = VEC_alloc (unsigned, heap, 1);
   return ti;
 }
 
@@ -1230,7 +1229,7 @@ static void
 free_topo_info (struct topo_info *ti)
 {
   sbitmap_free (ti->visited);
-  VEC_free (uint, heap, ti->topo_order);
+  VEC_free (unsigned, heap, ti->topo_order);
   free (ti);
 }
 
@@ -1250,7 +1249,7 @@ topo_visit (constraint_graph_t graph, struct topo_info *ti,
       if (!TEST_BIT (ti->visited, c->dest))
        topo_visit (graph, ti, c->dest);
     }
-  VEC_safe_push (uint, heap, ti->topo_order, n);
+  VEC_safe_push (unsigned, heap, ti->topo_order, n);
 }
 
 /* Return true if variable N + OFFSET is a legal field of N.  */
@@ -1447,8 +1446,8 @@ init_scc_info (void)
   si->in_component = sbitmap_alloc (size);
   sbitmap_ones (si->in_component);
   si->visited_index = xcalloc (sizeof (unsigned int), size + 1);
-  si->scc_stack = VEC_alloc (uint, heap, 1);
-  si->unification_queue = VEC_alloc (uint, heap, 1);
+  si->scc_stack = VEC_alloc (unsigned, heap, 1);
+  si->unification_queue = VEC_alloc (unsigned, heap, 1);
   return si;
 }
 
@@ -1460,8 +1459,8 @@ free_scc_info (struct scc_info *si)
   sbitmap_free (si->visited);
   sbitmap_free (si->in_component);
   free (si->visited_index);
-  VEC_free (uint, heap, si->scc_stack);
-  VEC_free (uint, heap, si->unification_queue);
+  VEC_free (unsigned, heap, si->scc_stack);
+  VEC_free (unsigned, heap, si->unification_queue);
   free(si); 
 }
 
@@ -1534,9 +1533,9 @@ perform_var_substitution (constraint_graph_t graph)
      node in topological order.  */
   compute_topo_order (graph, ti);
  
-  while (VEC_length (uint, ti->topo_order) != 0)
+  while (VEC_length (unsigned, ti->topo_order) != 0)
     {
-      unsigned int i = VEC_pop (uint, ti->topo_order);
+      unsigned int i = VEC_pop (unsigned, ti->topo_order);
       unsigned int pred;
       varinfo_t vi = get_varinfo (i);
       bool okay_to_elim = false;
@@ -1660,9 +1659,9 @@ solve_graph (constraint_graph_t graph)
 
       compute_topo_order (graph, ti);
 
-      while (VEC_length (uint, ti->topo_order) != 0)
+      while (VEC_length (unsigned, ti->topo_order) != 0)
        {
-         i = VEC_pop (uint, ti->topo_order);
+         i = VEC_pop (unsigned, ti->topo_order);
          gcc_assert (get_varinfo (i)->node == i);
 
          /* If the node has changed, we need to process the
@@ -1940,6 +1939,25 @@ bitpos_of_field (const tree fdecl)
 }
 
 
+/* Return true if an access to [ACCESSPOS, ACCESSSIZE]
+   overlaps with a field at [FIELDPOS, FIELDSIZE] */
+
+static bool
+offset_overlaps_with_access (const unsigned HOST_WIDE_INT fieldpos,
+                            const unsigned HOST_WIDE_INT fieldsize,
+                            const unsigned HOST_WIDE_INT accesspos,
+                            const unsigned HOST_WIDE_INT accesssize)
+{
+  if (fieldpos == accesspos && fieldsize == accesssize)
+    return true;
+  if (accesspos >= fieldpos && accesspos < (fieldpos + fieldsize))
+    return true;
+  if (accesspos < fieldpos && (accesspos + accesssize > fieldpos))
+    return true;
+  
+  return false;
+}
+
 /* Given a COMPONENT_REF T, return the constraint_expr for it.  */
 
 static struct constraint_expr
@@ -2000,8 +2018,27 @@ get_constraint_for_component_ref (tree t)
         we may have to do something cute here.  */
       
       if (result.offset < get_varinfo (result.var)->fullsize)  
-       result.var = first_vi_for_offset (get_varinfo (result.var), 
-                                         result.offset)->id;
+       {
+         /* It's also not true that the constraint will actually start at the
+            right offset, it may start in some padding.  We only care about
+            setting the constraint to the first actual field it touches, so
+            walk to find it.  */ 
+         varinfo_t curr;
+         for (curr = get_varinfo (result.var); curr; curr = curr->next)
+           {
+             if (offset_overlaps_with_access (curr->offset, curr->size,
+                                              result.offset, bitsize))
+               {
+                 result.var = curr->id;
+                 break;
+
+               }
+           }
+         /* assert that we found *some* field there. The user couldn't be
+            accessing *only* padding.  */
+            
+         gcc_assert (curr);
+       }
       else
        if (dump_file && (dump_flags & TDF_DETAILS))
          fprintf (dump_file, "Access to past the end of variable, ignoring\n");
@@ -2913,13 +2950,13 @@ set_uids_in_ptset (bitmap into, bitmap from)
          subvar_t svars = get_subvars_for_var (vi->decl);
          subvar_t sv;
          for (sv = svars; sv; sv = sv->next)
-           bitmap_set_bit (into, var_ann (sv->var)->uid);    
+           bitmap_set_bit (into, DECL_UID (sv->var));
        }
       /* We may end up with labels in the points-to set because people
         take their address, and they are _DECL's.  */
       else if (TREE_CODE (vi->decl) == VAR_DECL 
          || TREE_CODE (vi->decl) == PARM_DECL)
-       bitmap_set_bit (into, var_ann (vi->decl)->uid);
+       bitmap_set_bit (into, DECL_UID (vi->decl));
 
          
     }