bitmap.c (bitmap_elem_to_freelist): Set indx to -1.
authorRichard Biener <rguenther@suse.de>
Fri, 7 Oct 2016 10:06:24 +0000 (10:06 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 7 Oct 2016 10:06:24 +0000 (10:06 +0000)
2016-10-07  Richard Biener  <rguenther@suse.de>

* bitmap.c (bitmap_elem_to_freelist): Set indx to -1.
* bitmap.h (bmp_iter_set): When advancing to the next element
check that we didn't remove the current one.
(bmp_iter_and): Likewise.
(bmp_iter_and_compl): Likewise.
* tree-ssa.c (release_defs_bitset): Do not remove worklist bit
we currently iterate on but keep a one-level queue.
* sched-deps.c (remove_from_deps): Do not clear current bit
but keep a one-level queue.

From-SVN: r240859

gcc/ChangeLog
gcc/bitmap.c
gcc/bitmap.h
gcc/sched-deps.c
gcc/tree-ssa.c

index 1be7817592a5912d91af78e5300c6354525df0c1..56e5fd9a1b5e4f1f7d50cfa79992b8c7ddeec98c 100644 (file)
@@ -1,3 +1,15 @@
+2016-10-07  Richard Biener  <rguenther@suse.de>
+
+       * bitmap.c (bitmap_elem_to_freelist): Set indx to -1.
+       * bitmap.h (bmp_iter_set): When advancing to the next element
+       check that we didn't remove the current one.
+       (bmp_iter_and): Likewise.
+       (bmp_iter_and_compl): Likewise.
+       * tree-ssa.c (release_defs_bitset): Do not remove worklist bit
+       we currently iterate on but keep a one-level queue.
+       * sched-deps.c (remove_from_deps): Do not clear current bit
+       but keep a one-level queue.
+
 2016-10-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/77664
index 6206535a8ea9f9a0203f00a4b60c5a1378181065..1a32332439fa48550674dc73c8d559bb2690055c 100644 (file)
@@ -66,6 +66,7 @@ bitmap_elem_to_freelist (bitmap head, bitmap_element *elt)
   bitmap_obstack *bit_obstack = head->obstack;
 
   elt->next = NULL;
+  elt->indx = -1;
   if (bit_obstack)
     {
       elt->prev = bit_obstack->elements;
index 111571186b76402f09e5326fdd81c4e2f01fa172..e4e80d6ce5dab91baa412b047e1aa9ab01f17f8c 100644 (file)
@@ -618,6 +618,9 @@ bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
          bi->word_no++;
        }
 
+      /* Make sure we didn't remove the element while iterating.  */
+      gcc_checking_assert (bi->elt1->indx != -1U);
+
       /* Advance to the next element.  */
       bi->elt1 = bi->elt1->next;
       if (!bi->elt1)
@@ -664,6 +667,9 @@ bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
       /* Advance to the next identical element.  */
       do
        {
+         /* Make sure we didn't remove the element while iterating.  */
+         gcc_checking_assert (bi->elt1->indx != -1U);
+
          /* Advance elt1 while it is less than elt2.  We always want
             to advance one elt.  */
          do
@@ -674,6 +680,9 @@ bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
            }
          while (bi->elt1->indx < bi->elt2->indx);
 
+         /* Make sure we didn't remove the element while iterating.  */
+         gcc_checking_assert (bi->elt2->indx != -1U);
+
          /* Advance elt2 to be no less than elt1.  This might not
             advance.  */
          while (bi->elt2->indx < bi->elt1->indx)
@@ -726,11 +735,17 @@ bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
          bi->word_no++;
        }
 
+      /* Make sure we didn't remove the element while iterating.  */
+      gcc_checking_assert (bi->elt1->indx != -1U);
+
       /* Advance to the next element of elt1.  */
       bi->elt1 = bi->elt1->next;
       if (!bi->elt1)
        return false;
 
+      /* Make sure we didn't remove the element while iterating.  */
+      gcc_checking_assert (! bi->elt2 || bi->elt2->indx != -1U);
+
       /* Advance elt2 until it is no less than elt1.  */
       while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
        bi->elt2 = bi->elt2->next;
index 41a6af25c79b609af947538d8b7df1d87dfcb8a0..dc46351ccd278305f3bc716000a1cc3142f62f74 100644 (file)
@@ -3992,8 +3992,14 @@ remove_from_deps (struct deps_desc *deps, rtx_insn *insn)
   removed = remove_from_dependence_list (insn, &deps->last_pending_memory_flush);
   deps->pending_flush_length -= removed;
 
+  unsigned to_clear = -1U;
   EXECUTE_IF_SET_IN_REG_SET (&deps->reg_last_in_use, 0, i, rsi)
     {
+      if (to_clear != -1U)
+       {
+         CLEAR_REGNO_REG_SET (&deps->reg_last_in_use, to_clear);
+         to_clear = -1U;
+       }
       struct deps_reg *reg_last = &deps->reg_last[i];
       if (reg_last->uses)
        remove_from_dependence_list (insn, &reg_last->uses);
@@ -4005,8 +4011,10 @@ remove_from_deps (struct deps_desc *deps, rtx_insn *insn)
        remove_from_dependence_list (insn, &reg_last->clobbers);
       if (!reg_last->uses && !reg_last->sets && !reg_last->implicit_sets
          && !reg_last->clobbers)
-        CLEAR_REGNO_REG_SET (&deps->reg_last_in_use, i);
+       to_clear = i;
     }
+  if (to_clear != -1U)
+    CLEAR_REGNO_REG_SET (&deps->reg_last_in_use, to_clear);
 
   if (CALL_P (insn))
     {
index d442a5f89e1cf05bc6495e2d51f9db58bd7beedb..261d9b0c90b18506e3a476238c8896ef11dd61bd 100644 (file)
@@ -551,58 +551,70 @@ release_defs_bitset (bitmap toremove)
      most likely run in slightly superlinear time, rather than the
      pathological quadratic worst case.  */
   while (!bitmap_empty_p (toremove))
-    EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
-      {
-       bool remove_now = true;
-       tree var = ssa_name (j);
-       gimple *stmt;
-       imm_use_iterator uit;
-
-       FOR_EACH_IMM_USE_STMT (stmt, uit, var)
-         {
-           ssa_op_iter dit;
-           def_operand_p def_p;
+    {
+      unsigned to_remove_bit = -1U;
+      EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
+       {
+         if (to_remove_bit != -1U)
+           {
+             bitmap_clear_bit (toremove, to_remove_bit);
+             to_remove_bit = -1U;
+           }
 
-           /* We can't propagate PHI nodes into debug stmts.  */
-           if (gimple_code (stmt) == GIMPLE_PHI
-               || is_gimple_debug (stmt))
-             continue;
+         bool remove_now = true;
+         tree var = ssa_name (j);
+         gimple *stmt;
+         imm_use_iterator uit;
 
-           /* If we find another definition to remove that uses
-              the one we're looking at, defer the removal of this
-              one, so that it can be propagated into debug stmts
-              after the other is.  */
-           FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
-             {
-               tree odef = DEF_FROM_PTR (def_p);
+         FOR_EACH_IMM_USE_STMT (stmt, uit, var)
+           {
+             ssa_op_iter dit;
+             def_operand_p def_p;
+
+             /* We can't propagate PHI nodes into debug stmts.  */
+             if (gimple_code (stmt) == GIMPLE_PHI
+                 || is_gimple_debug (stmt))
+               continue;
+
+             /* If we find another definition to remove that uses
+                the one we're looking at, defer the removal of this
+                one, so that it can be propagated into debug stmts
+                after the other is.  */
+             FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
+               {
+                 tree odef = DEF_FROM_PTR (def_p);
 
-               if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
-                 {
-                   remove_now = false;
-                   break;
-                 }
-             }
+                 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
+                   {
+                     remove_now = false;
+                     break;
+                   }
+               }
 
-           if (!remove_now)
-             BREAK_FROM_IMM_USE_STMT (uit);
-         }
+             if (!remove_now)
+               BREAK_FROM_IMM_USE_STMT (uit);
+           }
 
-       if (remove_now)
-         {
-           gimple *def = SSA_NAME_DEF_STMT (var);
-           gimple_stmt_iterator gsi = gsi_for_stmt (def);
+         if (remove_now)
+           {
+             gimple *def = SSA_NAME_DEF_STMT (var);
+             gimple_stmt_iterator gsi = gsi_for_stmt (def);
 
-           if (gimple_code (def) == GIMPLE_PHI)
-             remove_phi_node (&gsi, true);
-           else
-             {
-               gsi_remove (&gsi, true);
-               release_defs (def);
-             }
+             if (gimple_code (def) == GIMPLE_PHI)
+               remove_phi_node (&gsi, true);
+             else
+               {
+                 gsi_remove (&gsi, true);
+                 release_defs (def);
+               }
+
+             to_remove_bit = j;
+           }
+       }
+      if (to_remove_bit != -1U)
+       bitmap_clear_bit (toremove, to_remove_bit);
+    }
 
-           bitmap_clear_bit (toremove, j);
-         }
-      }
 }
 
 /* Verify virtual SSA form.  */