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
This commit is contained in:
Richard Biener 2016-10-07 10:06:24 +00:00 committed by Richard Biener
parent a93cdc5c6f
commit a30fe4b681
5 changed files with 93 additions and 45 deletions

View 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

View 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;

View 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;

View 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))
{

View 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;
{
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;
}
FOR_EACH_IMM_USE_STMT (stmt, uit, var)
{
ssa_op_iter dit;
def_operand_p def_p;
bool remove_now = true;
tree var = ssa_name (j);
gimple *stmt;
imm_use_iterator uit;
/* We can't propagate PHI nodes into debug stmts. */
if (gimple_code (stmt) == GIMPLE_PHI
|| is_gimple_debug (stmt))
continue;
FOR_EACH_IMM_USE_STMT (stmt, uit, var)
{
ssa_op_iter dit;
def_operand_p def_p;
/* 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);
/* We can't propagate PHI nodes into debug stmts. */
if (gimple_code (stmt) == GIMPLE_PHI
|| is_gimple_debug (stmt))
continue;
if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
{
remove_now = false;
break;
}
}
/* 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 (!remove_now)
BREAK_FROM_IMM_USE_STMT (uit);
}
if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
{
remove_now = false;
break;
}
}
if (remove_now)
{
gimple *def = SSA_NAME_DEF_STMT (var);
gimple_stmt_iterator gsi = gsi_for_stmt (def);
if (!remove_now)
BREAK_FROM_IMM_USE_STMT (uit);
}
if (gimple_code (def) == GIMPLE_PHI)
remove_phi_node (&gsi, true);
else
{
gsi_remove (&gsi, true);
release_defs (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);
}
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. */