From a30fe4b68120118221578b111036fa5fea0d25b3 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 7 Oct 2016 10:06:24 +0000 Subject: [PATCH] bitmap.c (bitmap_elem_to_freelist): Set indx to -1. 2016-10-07 Richard Biener * 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 | 12 ++++++ gcc/bitmap.c | 1 + gcc/bitmap.h | 15 +++++++ gcc/sched-deps.c | 10 ++++- gcc/tree-ssa.c | 102 ++++++++++++++++++++++++++--------------------- 5 files changed, 94 insertions(+), 46 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1be7817592a..56e5fd9a1b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2016-10-07 Richard Biener + + * 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 PR tree-optimization/77664 diff --git a/gcc/bitmap.c b/gcc/bitmap.c index 6206535a8ea..1a32332439f 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 111571186b7..e4e80d6ce5d 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 41a6af25c79..dc46351ccd2 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, ®_last->uses); @@ -4005,8 +4011,10 @@ remove_from_deps (struct deps_desc *deps, rtx_insn *insn) remove_from_dependence_list (insn, ®_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 d442a5f89e1..261d9b0c90b 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. */ -- 2.30.2