From: Trevor Saunders <tbsaunde+...@tbsaunde.org> Same story for the new functions here as for the previous patch.
gcc/ChangeLog: 2016-04-20 Trevor Saunders <tbsaunde+...@tbsaunde.org> * sched-deps.c (remove_from_dependence_list): Adjust. (flush_pending_lists): Likewise. (sched_analyze_2): Likewise. (sched_analyze_insn): Likewise. (deps_analyze_insn): Likewise. (init_deps): Likewise. (free_deps): Likewise. * sched-int.h (struct deps_desc): Make last_pending_memory_flush a vector. * sched-rgn.c (deps_join): Adjust. (propagate_deps): Likewise. (free_pending_lists): Likewise. --- gcc/sched-deps.c | 61 ++++++++++++++++++++++++++++++++++++++++---------------- gcc/sched-int.h | 4 ++-- gcc/sched-rgn.c | 14 +++++-------- 3 files changed, 51 insertions(+), 28 deletions(-) diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 879c9ca..1361967 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -1641,6 +1641,27 @@ remove_from_dependence_list (rtx_insn *insn, rtx_insn_list **listp) return removed; } +/* Similar but operate on a vec<rtx_insn *>. */ + +static int +remove_from_dependence_list (rtx_insn *insn, vec<rtx_insn *> *insns) +{ + int removed = 0; + + unsigned int len = insns->length (); + for (unsigned int i = len - 1; i < len; i--) + { + if ((*insns)[i] == insn) + { + insns->ordered_remove (i); + removed++; + continue; + } + } + + return removed; +} + /* Same as above, but process two lists at once. */ static int remove_from_both_dependence_lists (rtx_insn *insn, @@ -1804,8 +1825,8 @@ flush_pending_lists (struct deps_desc *deps, rtx_insn *insn, int for_read, if (for_write) deps->pending_read_insns.release (); deps->pending_write_insns.release (); - free_INSN_LIST_list (&deps->last_pending_memory_flush); - free_INSN_LIST_list (&deps->pending_jump_insns); + deps->last_pending_memory_flush.release (); + deps->pending_jump_insns.release (); } if (!deps->readonly) @@ -1813,7 +1834,8 @@ flush_pending_lists (struct deps_desc *deps, rtx_insn *insn, int for_read, free_EXPR_LIST_list (&deps->pending_write_mems); deps->pending_write_list_length = 0; - deps->last_pending_memory_flush = alloc_INSN_LIST (insn, NULL_RTX); + deps->last_pending_memory_flush.truncate (0); + deps->last_pending_memory_flush.safe_push (insn); deps->pending_flush_length = 1; } mark_as_hard = false; @@ -2640,7 +2662,6 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rtx_insn *insn) case MEM: { /* Reading memory. */ - rtx_insn_list *u; rtx_expr_list *pending_mem; rtx t = x; @@ -2685,22 +2706,26 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rtx_insn *insn) pending_mem = pending_mem->next (); } - for (u = deps->last_pending_memory_flush; u; u = u->next ()) - add_dependence (insn, u->insn (), REG_DEP_ANTI); + len = deps->last_pending_memory_flush.length (); + for (unsigned int i = len - 1; i < len; i--) + add_dependence (insn, deps->last_pending_memory_flush[i], + REG_DEP_ANTI); - for (u = deps->pending_jump_insns; u; u = u->next ()) + len = deps->pending_jump_insns.length (); + for (unsigned int i = len - 1; i < len; i--) if (deps_may_trap_p (x)) { + rtx_insn *temp = deps->pending_jump_insns[i]; if ((sched_deps_info->generate_spec_deps) && sel_sched_p () && (spec_info->mask & BEGIN_CONTROL)) { ds_t ds = set_dep_weak (DEP_ANTI, BEGIN_CONTROL, MAX_DEP_WEAK); - note_dep (u->insn (), ds); + note_dep (temp, ds); } else - add_dependence (insn, u->insn (), REG_DEP_CONTROL); + add_dependence (insn, temp, REG_DEP_CONTROL); } } @@ -3074,7 +3099,6 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx_insn *insn) if (DEBUG_INSN_P (insn)) { rtx_insn *prev = deps->last_debug_insn; - rtx_insn_list *u; if (!deps->readonly) deps->last_debug_insn = insn; @@ -3086,8 +3110,12 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx_insn *insn) REG_DEP_ANTI, false); if (!sel_sched_p ()) - for (u = deps->last_pending_memory_flush; u; u = u->next ()) - add_dependence (insn, u->insn (), REG_DEP_ANTI); + { + unsigned int len = deps->last_pending_memory_flush.length (); + for (unsigned int i = len - 1; i < len; i--) + add_dependence (insn, deps->last_pending_memory_flush[i], + REG_DEP_ANTI); + } EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi) { @@ -3653,8 +3681,7 @@ deps_analyze_insn (struct deps_desc *deps, rtx_insn *insn) if (deps->pending_flush_length++ >= MAX_PENDING_LIST_LENGTH) flush_pending_lists (deps, insn, true, true); else - deps->pending_jump_insns - = alloc_INSN_LIST (insn, deps->pending_jump_insns); + deps->pending_jump_insns.safe_push (insn); } /* For each insn which shouldn't cross a jump, add a dependence. */ @@ -3903,11 +3930,11 @@ init_deps (struct deps_desc *deps, bool lazy_reg_last) deps->pending_read_mems = 0; deps->pending_write_insns.create (0); deps->pending_write_mems = 0; - deps->pending_jump_insns = 0; + deps->pending_jump_insns.create (0); deps->pending_read_list_length = 0; deps->pending_write_list_length = 0; deps->pending_flush_length = 0; - deps->last_pending_memory_flush = 0; + deps->last_pending_memory_flush.create (0); deps->last_function_call = 0; deps->last_function_call_may_noreturn = 0; deps->sched_before_next_call = 0; @@ -3951,7 +3978,7 @@ free_deps (struct deps_desc *deps) free_EXPR_LIST_list (&deps->pending_read_mems); deps->pending_write_insns.release (); free_EXPR_LIST_list (&deps->pending_write_mems); - free_INSN_LIST_list (&deps->last_pending_memory_flush); + deps->last_pending_memory_flush.release (); /* Without the EXECUTE_IF_SET, this loop is executed max_reg * nr_regions times. For a testcase with 42000 regs and 8000 small basic blocks, diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 45890b8..d75a85c 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -478,7 +478,7 @@ struct deps_desc rtx_expr_list *pending_write_mems; /* An INSN_LIST containing all jump insns. */ - rtx_insn_list *pending_jump_insns; + vec<rtx_insn *> pending_jump_insns; /* We must prevent the above lists from ever growing too large since the number of dependencies produced is at least O(N*N), @@ -505,7 +505,7 @@ struct deps_desc alias analysis, this restriction can be relaxed. This may also be an INSN that writes memory if the pending lists grow too large. */ - rtx_insn_list *last_pending_memory_flush; + vec<rtx_insn *> last_pending_memory_flush; /* A list of the last function calls we have seen. We use a list to represent last function calls from multiple predecessor blocks. diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c index 9e807a1..6ba4757 100644 --- a/gcc/sched-rgn.c +++ b/gcc/sched-rgn.c @@ -2620,12 +2620,8 @@ deps_join (struct deps_desc *succ_deps, struct deps_desc *pred_deps) concat_mem_list (pred_deps->pending_write_mems, &succ_deps->pending_write_mems); - succ_deps->pending_jump_insns - = concat_INSN_LIST (pred_deps->pending_jump_insns, - succ_deps->pending_jump_insns); - succ_deps->last_pending_memory_flush - = concat_INSN_LIST (pred_deps->last_pending_memory_flush, - succ_deps->last_pending_memory_flush); + succ_deps->pending_jump_insns.safe_splice (pred_deps->pending_jump_insns); + succ_deps->last_pending_memory_flush.safe_splice (pred_deps->last_pending_memory_flush); succ_deps->pending_read_list_length += pred_deps->pending_read_list_length; succ_deps->pending_write_list_length += pred_deps->pending_write_list_length; @@ -2672,17 +2668,17 @@ propagate_deps (int bb, struct deps_desc *pred_deps) pred_deps->pending_read_insns = vNULL; bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns; pred_deps->pending_write_insns = vNULL; + bb_deps[bb].pending_jump_insns = pred_deps->pending_jump_insns; + pred_deps->pending_jump_insns = vNULL; /* These lists should point to the right place, for correct freeing later. */ bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems; bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems; - bb_deps[bb].pending_jump_insns = pred_deps->pending_jump_insns; /* Can't allow these to be freed twice. */ pred_deps->pending_read_mems = 0; pred_deps->pending_write_mems = 0; - pred_deps->pending_jump_insns = 0; } /* Compute dependences inside bb. In a multiple blocks region: @@ -2761,7 +2757,7 @@ free_pending_lists (void) bb_deps[bb].pending_write_insns.release (); free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems); free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems); - free_INSN_LIST_list (&bb_deps[bb].pending_jump_insns); + bb_deps[bb].pending_jump_insns.release (); } } -- 2.7.4