This moves PTA changed flag handling during solving from using
an sbitmap and an explicitly managed change_count to a bitmap.
Way easier to get right and also a requirement for pending work
that adds variables on-the-fly during solving (which would
require growing the sbitmap).

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Will apply once that succeeded.

Richard.

2011-04-27  Richard Guenther  <rguent...@suse.de>

        * tree-ssa-structalias.c (changed_count): Remove.
        (changed): Use a bitmap.
        (unify_nodes): Adjust.
        (do_sd_constraint): Likewise.
        (do_ds_constraint): Likewise.
        (do_complex_constraint): Likewise.
        (solve_graph): Likewise.

Index: trunk/gcc/tree-ssa-structalias.c
===================================================================
*** trunk.orig/gcc/tree-ssa-structalias.c       2011-02-03 16:59:37.000000000 
+0100
--- trunk/gcc/tree-ssa-structalias.c    2011-02-03 17:04:44.000000000 +0100
*************** build_succ_graph (void)
*** 1412,1419 ****
  
  
  /* Changed variables on the last iteration.  */
! static unsigned int changed_count;
! static sbitmap changed;
  
  /* Strongly Connected Component visitation info.  */
  
--- 1412,1418 ----
  
  
  /* Changed variables on the last iteration.  */
! static bitmap changed;
  
  /* Strongly Connected Component visitation info.  */
  
*************** unify_nodes (constraint_graph_t graph, u
*** 1544,1559 ****
    /* Mark TO as changed if FROM was changed. If TO was already marked
       as changed, decrease the changed count.  */
  
!   if (update_changed && TEST_BIT (changed, from))
      {
!       RESET_BIT (changed, from);
!       if (!TEST_BIT (changed, to))
!       SET_BIT (changed, to);
!       else
!       {
!         gcc_assert (changed_count > 0);
!         changed_count--;
!       }
      }
    if (get_varinfo (from)->solution)
      {
--- 1543,1553 ----
    /* Mark TO as changed if FROM was changed. If TO was already marked
       as changed, decrease the changed count.  */
  
!   if (update_changed
!       && bitmap_bit_p (changed, from))
      {
!       bitmap_clear_bit (changed, from);
!       bitmap_set_bit (changed, to);
      }
    if (get_varinfo (from)->solution)
      {
*************** unify_nodes (constraint_graph_t graph, u
*** 1562,1572 ****
        if (bitmap_ior_into (get_varinfo (to)->solution,
                           get_varinfo (from)->solution))
        {
!         if (update_changed && !TEST_BIT (changed, to))
!           {
!             SET_BIT (changed, to);
!             changed_count++;
!           }
        }
  
        BITMAP_FREE (get_varinfo (from)->solution);
--- 1556,1563 ----
        if (bitmap_ior_into (get_varinfo (to)->solution,
                           get_varinfo (from)->solution))
        {
!         if (update_changed)
!           bitmap_set_bit (changed, to);
        }
  
        BITMAP_FREE (get_varinfo (from)->solution);
*************** done:
*** 1727,1737 ****
    if (flag)
      {
        get_varinfo (lhs)->solution = sol;
!       if (!TEST_BIT (changed, lhs))
!       {
!         SET_BIT (changed, lhs);
!         changed_count++;
!       }
      }
  }
  
--- 1718,1724 ----
    if (flag)
      {
        get_varinfo (lhs)->solution = sol;
!       bitmap_set_bit (changed, lhs);
      }
  }
  
*************** do_ds_constraint (constraint_t c, bitmap
*** 1765,1777 ****
        if (add_graph_edge (graph, t, rhs))
        {
          if (bitmap_ior_into (get_varinfo (t)->solution, sol))
!           {
!             if (!TEST_BIT (changed, t))
!               {
!                 SET_BIT (changed, t);
!                 changed_count++;
!               }
!           }
        }
        return;
      }
--- 1752,1758 ----
        if (add_graph_edge (graph, t, rhs))
        {
          if (bitmap_ior_into (get_varinfo (t)->solution, sol))
!           bitmap_set_bit (changed, t);
        }
        return;
      }
*************** do_ds_constraint (constraint_t c, bitmap
*** 1811,1822 ****
                {
                  t = find (escaped_id);
                  if (add_graph_edge (graph, t, rhs)
!                     && bitmap_ior_into (get_varinfo (t)->solution, sol)
!                     && !TEST_BIT (changed, t))
!                   {
!                     SET_BIT (changed, t);
!                     changed_count++;
!                   }
                  /* Enough to let rhs escape once.  */
                  escaped_p = true;
                }
--- 1792,1799 ----
                {
                  t = find (escaped_id);
                  if (add_graph_edge (graph, t, rhs)
!                     && bitmap_ior_into (get_varinfo (t)->solution, sol))
!                   bitmap_set_bit (changed, t);
                  /* Enough to let rhs escape once.  */
                  escaped_p = true;
                }
*************** do_ds_constraint (constraint_t c, bitmap
*** 1826,1837 ****
  
              t = find (v->id);
              if (add_graph_edge (graph, t, rhs)
!                 && bitmap_ior_into (get_varinfo (t)->solution, sol)
!                 && !TEST_BIT (changed, t))
!               {
!                 SET_BIT (changed, t);
!                 changed_count++;
!               }
            }
  
          /* If the variable is not exactly at the requested offset
--- 1803,1810 ----
  
              t = find (v->id);
              if (add_graph_edge (graph, t, rhs)
!                 && bitmap_ior_into (get_varinfo (t)->solution, sol))
!               bitmap_set_bit (changed, t);
            }
  
          /* If the variable is not exactly at the requested offset
*************** do_complex_constraint (constraint_graph_
*** 1879,1889 ****
        if (flag)
        {
          get_varinfo (c->lhs.var)->solution = tmp;
!         if (!TEST_BIT (changed, c->lhs.var))
!           {
!             SET_BIT (changed, c->lhs.var);
!             changed_count++;
!           }
        }
      }
  }
--- 1852,1858 ----
        if (flag)
        {
          get_varinfo (c->lhs.var)->solution = tmp;
!         bitmap_set_bit (changed, c->lhs.var);
        }
      }
  }
*************** solve_graph (constraint_graph_t graph)
*** 2578,2586 ****
    unsigned int i;
    bitmap pts;
  
!   changed_count = 0;
!   changed = sbitmap_alloc (size);
!   sbitmap_zero (changed);
  
    /* Mark all initial non-collapsed nodes as changed.  */
    for (i = 0; i < size; i++)
--- 2547,2553 ----
    unsigned int i;
    bitmap pts;
  
!   changed = BITMAP_ALLOC (NULL);
  
    /* Mark all initial non-collapsed nodes as changed.  */
    for (i = 0; i < size; i++)
*************** solve_graph (constraint_graph_t graph)
*** 2589,2604 ****
        if (find (i) == i && !bitmap_empty_p (ivi->solution)
          && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i]))
              || VEC_length (constraint_t, graph->complex[i]) > 0))
!       {
!         SET_BIT (changed, i);
!         changed_count++;
!       }
      }
  
    /* Allocate a bitmap to be used to store the changed bits.  */
    pts = BITMAP_ALLOC (&pta_obstack);
  
!   while (changed_count > 0)
      {
        unsigned int i;
        struct topo_info *ti = init_topo_info ();
--- 2556,2568 ----
        if (find (i) == i && !bitmap_empty_p (ivi->solution)
          && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i]))
              || VEC_length (constraint_t, graph->complex[i]) > 0))
!       bitmap_set_bit (changed, i);
      }
  
    /* Allocate a bitmap to be used to store the changed bits.  */
    pts = BITMAP_ALLOC (&pta_obstack);
  
!   while (!bitmap_empty_p (changed))
      {
        unsigned int i;
        struct topo_info *ti = init_topo_info ();
*************** solve_graph (constraint_graph_t graph)
*** 2624,2630 ****
  
          /* If the node has changed, we need to process the
             complex constraints and outgoing edges again.  */
!         if (TEST_BIT (changed, i))
            {
              unsigned int j;
              constraint_t c;
--- 2588,2594 ----
  
          /* If the node has changed, we need to process the
             complex constraints and outgoing edges again.  */
!         if (bitmap_clear_bit (changed, i))
            {
              unsigned int j;
              constraint_t c;
*************** solve_graph (constraint_graph_t graph)
*** 2632,2640 ****
              VEC(constraint_t,heap) *complex = graph->complex[i];
              bool solution_empty;
  
-             RESET_BIT (changed, i);
-             changed_count--;
- 
              /* Compute the changed set of solution bits.  */
              bitmap_and_compl (pts, get_varinfo (i)->solution,
                                get_varinfo (i)->oldsolution);
--- 2596,2601 ----
*************** solve_graph (constraint_graph_t graph)
*** 2697,2707 ****
                      if (flag)
                        {
                          get_varinfo (to)->solution = tmp;
!                         if (!TEST_BIT (changed, to))
!                           {
!                             SET_BIT (changed, to);
!                             changed_count++;
!                           }
                        }
                    }
                }
--- 2658,2664 ----
                      if (flag)
                        {
                          get_varinfo (to)->solution = tmp;
!                         bitmap_set_bit (changed, to);
                        }
                    }
                }
*************** solve_graph (constraint_graph_t graph)
*** 2712,2718 ****
      }
  
    BITMAP_FREE (pts);
!   sbitmap_free (changed);
    bitmap_obstack_release (&oldpta_obstack);
  }
  
--- 2669,2675 ----
      }
  
    BITMAP_FREE (pts);
!   BITMAP_FREE (changed);
    bitmap_obstack_release (&oldpta_obstack);
  }
  

Reply via email to