]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Update changed bit when constraint set changes
authorXinliang David Li <davidxl@google.com>
Wed, 4 Dec 2013 19:46:36 +0000 (19:46 +0000)
committerXinliang David Li <davidxl@gcc.gnu.org>
Wed, 4 Dec 2013 19:46:36 +0000 (19:46 +0000)
From-SVN: r205677

gcc/ChangeLog
gcc/tree-ssa-structalias.c

index a4a1e0a6d2f73a59f2d276d1c532d84e5c285bde..320f186477f530864e41764c4780c0594577d92b 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-03  Xinliang David Li  <davidxl@google.com>
+
+       * tree-ssa-structalias.c (constraint_set_union): Change return type
+       from void to bool.
+       (merge_node_constraints): Ditto.
+       (unify_nodes): Update changed set when constraints set changes.
+
 2013-12-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        * configure.ac: Append gdbasan.in to .gdbinit if CFLAGS contains
index 6482e68c04f69f5efa82b213e145566d4c4c1d5c..16679f41ce942c00caefe798bdbbec53aec19a2d 100644 (file)
@@ -892,14 +892,16 @@ constraint_vec_find (vec<constraint_t> vec,
   return found;
 }
 
-/* Union two constraint vectors, TO and FROM.  Put the result in TO.  */
+/* Union two constraint vectors, TO and FROM.  Put the result in TO. 
+   Returns true of TO set is changed.  */
 
-static void
+static bool
 constraint_set_union (vec<constraint_t> *to,
                      vec<constraint_t> *from)
 {
   int i;
   constraint_t c;
+  bool any_change = false;
 
   FOR_EACH_VEC_ELT (*from, i, c)
     {
@@ -907,8 +909,10 @@ constraint_set_union (vec<constraint_t> *to,
        {
          unsigned int place = to->lower_bound (c, constraint_less);
          to->safe_insert (place, c);
+          any_change = true;
        }
     }
+  return any_change;
 }
 
 /* Expands the solution in SET to all sub-fields of variables included.  */
@@ -1028,22 +1032,24 @@ insert_into_complex (constraint_graph_t graph,
 
 
 /* Condense two variable nodes into a single variable node, by moving
-   all associated info from SRC to TO.  */
+   all associated info from FROM to TO. Returns true if TO node's 
+   constraint set changes after the merge.  */
 
-static void
+static bool
 merge_node_constraints (constraint_graph_t graph, unsigned int to,
                        unsigned int from)
 {
   unsigned int i;
   constraint_t c;
+  bool any_change = false;
 
   gcc_checking_assert (find (from) == to);
 
   /* Move all complex constraints from src node into to node  */
   FOR_EACH_VEC_ELT (graph->complex[from], i, c)
     {
-      /* In complex constraints for node src, we may have either
-        a = *src, and *src = a, or an offseted constraint which are
+      /* In complex constraints for node FROM, we may have either
+        a = *FROM, and *FROM = a, or an offseted constraint which are
         always added to the rhs node's constraints.  */
 
       if (c->rhs.type == DEREF)
@@ -1052,9 +1058,12 @@ merge_node_constraints (constraint_graph_t graph, unsigned int to,
        c->lhs.var = to;
       else
        c->rhs.var = to;
+
     }
-  constraint_set_union (&graph->complex[to], &graph->complex[from]);
+  any_change = constraint_set_union (&graph->complex[to],
+                                    &graph->complex[from]);
   graph->complex[from].release ();
+  return any_change;
 }
 
 
@@ -1472,7 +1481,11 @@ unify_nodes (constraint_graph_t graph, unsigned int to, unsigned int from,
     stats.unified_vars_static++;
 
   merge_graph_nodes (graph, to, from);
-  merge_node_constraints (graph, to, from);
+  if (merge_node_constraints (graph, to, from))
+    {
+      if (update_changed)
+       bitmap_set_bit (changed, to);
+    }
 
   /* Mark TO as changed if FROM was changed. If TO was already marked
      as changed, decrease the changed count.  */