aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-10-07 10:06:24 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-10-07 10:06:24 +0000
commita30fe4b68120118221578b111036fa5fea0d25b3 (patch)
treeb23b27954b915b8b7d050e18c30416a85b78a564 /gcc
parenta93cdc5c6f1d56226c3ef7b69423a4074783de34 (diff)
downloadgcc-a30fe4b68120118221578b111036fa5fea0d25b3.zip
gcc-a30fe4b68120118221578b111036fa5fea0d25b3.tar.gz
gcc-a30fe4b68120118221578b111036fa5fea0d25b3.tar.bz2
bitmap.c (bitmap_elem_to_freelist): Set indx to -1.
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/bitmap.c1
-rw-r--r--gcc/bitmap.h15
-rw-r--r--gcc/sched-deps.c10
-rw-r--r--gcc/tree-ssa.c102
5 files changed, 94 insertions, 46 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1be7817..56e5fd9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/bitmap.c b/gcc/bitmap.c
index 6206535..1a32332 100644
--- a/gcc/bitmap.c
+++ b/gcc/bitmap.c
@@ -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;
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 1115711..e4e80d6 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -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;
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 41a6af2..dc46351 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -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))
{
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index d442a5f..261d9b0 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -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. */