diff options
Diffstat (limited to 'gcc/sel-sched.c')
-rw-r--r-- | gcc/sel-sched.c | 132 |
1 files changed, 59 insertions, 73 deletions
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index fd01824..f1d1a77 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -500,31 +500,25 @@ static int max_ws; static int num_insns_scheduled; /* A vector of expressions is used to be able to sort them. */ -DEF_VEC_P(expr_t); -DEF_VEC_ALLOC_P(expr_t,heap); -static VEC(expr_t, heap) *vec_av_set = NULL; +static vec<expr_t> vec_av_set = vec<expr_t>(); /* A vector of vinsns is used to hold temporary lists of vinsns. */ -DEF_VEC_P(vinsn_t); -DEF_VEC_ALLOC_P(vinsn_t,heap); -typedef VEC(vinsn_t, heap) *vinsn_vec_t; +typedef vec<vinsn_t> vinsn_vec_t; /* This vector has the exprs which may still present in av_sets, but actually can't be moved up due to bookkeeping created during code motion to another fence. See comment near the call to update_and_record_unavailable_insns for the detailed explanations. */ -static vinsn_vec_t vec_bookkeeping_blocked_vinsns = NULL; +static vinsn_vec_t vec_bookkeeping_blocked_vinsns = vinsn_vec_t(); /* This vector has vinsns which are scheduled with renaming on the first fence and then seen on the second. For expressions with such vinsns, target availability information may be wrong. */ -static vinsn_vec_t vec_target_unavailable_vinsns = NULL; +static vinsn_vec_t vec_target_unavailable_vinsns = vinsn_vec_t(); /* Vector to store temporary nops inserted in move_op to prevent removal of empty bbs. */ -DEF_VEC_P(insn_t); -DEF_VEC_ALLOC_P(insn_t,heap); -static VEC(insn_t, heap) *vec_temp_moveop_nops = NULL; +static vec<insn_t> vec_temp_moveop_nops = vec<insn_t>(); /* These bitmaps record original instructions scheduled on the current iteration and bookkeeping copies created by them. */ @@ -587,12 +581,12 @@ advance_one_cycle (fence_t fence) can_issue_more = issue_rate; FENCE_ISSUE_MORE (fence) = can_issue_more; - for (i = 0; VEC_iterate (rtx, FENCE_EXECUTING_INSNS (fence), i, insn); ) + for (i = 0; vec_safe_iterate (FENCE_EXECUTING_INSNS (fence), i, &insn); ) { if (INSN_READY_CYCLE (insn) < cycle) { remove_from_deps (FENCE_DC (fence), insn); - VEC_unordered_remove (rtx, FENCE_EXECUTING_INSNS (fence), i); + FENCE_EXECUTING_INSNS (fence)->unordered_remove (i); continue; } i++; @@ -1938,9 +1932,7 @@ undo_transformations (av_set_t *av_ptr, rtx insn) { expr_history_def *phist; - phist = &VEC_index (expr_history_def, - EXPR_HISTORY_OF_CHANGES (expr), - index); + phist = &EXPR_HISTORY_OF_CHANGES (expr)[index]; switch (phist->type) { @@ -2735,7 +2727,7 @@ compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws) /* Add insn to the tail of current path. */ ilist_add (&p, insn); - FOR_EACH_VEC_ELT (rtx, sinfo->succs_ok, is, succ) + FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ) { av_set_t succ_set; @@ -2743,7 +2735,7 @@ compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws) succ_set = compute_av_set_inside_bb (succ, p, ws, true); av_set_split_usefulness (succ_set, - VEC_index (int, sinfo->probs_ok, is), + sinfo->probs_ok[is], sinfo->all_prob); if (sinfo->all_succs_n > 1) @@ -2789,7 +2781,7 @@ compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws) /* Check liveness restrictions via hard way when there are more than two successors. */ if (sinfo->succs_ok_n > 2) - FOR_EACH_VEC_ELT (rtx, sinfo->succs_ok, is, succ) + FOR_EACH_VEC_ELT (sinfo->succs_ok, is, succ) { basic_block succ_bb = BLOCK_FOR_INSN (succ); @@ -2800,7 +2792,7 @@ compute_av_set_at_bb_end (insn_t insn, ilist_t p, int ws) /* Finally, check liveness restrictions on paths leaving the region. */ if (sinfo->all_succs_n > sinfo->succs_ok_n) - FOR_EACH_VEC_ELT (rtx, sinfo->succs_other, is, succ) + FOR_EACH_VEC_ELT (sinfo->succs_other, is, succ) mark_unavailable_targets (av1, NULL, BB_LV_SET (BLOCK_FOR_INSN (succ))); @@ -3577,13 +3569,10 @@ vinsn_vec_has_expr_p (vinsn_vec_t vinsn_vec, expr_t expr) of expr taken from its history vector. */ for (i = 0, expr_vinsn = EXPR_VINSN (expr); expr_vinsn; - expr_vinsn = (i < VEC_length (expr_history_def, - EXPR_HISTORY_OF_CHANGES (expr)) - ? VEC_index (expr_history_def, - EXPR_HISTORY_OF_CHANGES (expr), - i++).old_expr_vinsn + expr_vinsn = (i < EXPR_HISTORY_OF_CHANGES (expr).length () + ? EXPR_HISTORY_OF_CHANGES (expr)[i++].old_expr_vinsn : NULL)) - FOR_EACH_VEC_ELT (vinsn_t, vinsn_vec, n, vinsn) + FOR_EACH_VEC_ELT (vinsn_vec, n, vinsn) if (VINSN_SEPARABLE_P (vinsn)) { if (vinsn_equal_p (vinsn, expr_vinsn)) @@ -3651,15 +3640,15 @@ av_set_could_be_blocked_by_bookkeeping_p (av_set_t orig_ops, void *static_params static void vinsn_vec_clear (vinsn_vec_t *vinsn_vec) { - unsigned len = VEC_length (vinsn_t, *vinsn_vec); + unsigned len = vinsn_vec->length (); if (len > 0) { vinsn_t vinsn; int n; - FOR_EACH_VEC_ELT (vinsn_t, *vinsn_vec, n, vinsn) + FOR_EACH_VEC_ELT (*vinsn_vec, n, vinsn) vinsn_detach (vinsn); - VEC_block_remove (vinsn_t, *vinsn_vec, 0, len); + vinsn_vec->block_remove (0, len); } } @@ -3668,15 +3657,14 @@ static void vinsn_vec_add (vinsn_vec_t *vinsn_vec, expr_t expr) { vinsn_attach (EXPR_VINSN (expr)); - VEC_safe_push (vinsn_t, heap, *vinsn_vec, EXPR_VINSN (expr)); + vinsn_vec->safe_push (EXPR_VINSN (expr)); } /* Free the vector representing blocked expressions. */ static void -vinsn_vec_free (vinsn_vec_t *vinsn_vec) +vinsn_vec_free (vinsn_vec_t &vinsn_vec) { - if (*vinsn_vec) - VEC_free (vinsn_t, heap, *vinsn_vec); + vinsn_vec.release (); } /* Increase EXPR_PRIORITY_ADJ for INSN by AMOUNT. */ @@ -3713,15 +3701,15 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, return false; /* Empty vector from the previous stuff. */ - if (VEC_length (expr_t, vec_av_set) > 0) - VEC_block_remove (expr_t, vec_av_set, 0, VEC_length (expr_t, vec_av_set)); + if (vec_av_set.length () > 0) + vec_av_set.block_remove (0, vec_av_set.length ()); /* Turn the set into a vector for sorting and call sel_target_adjust_priority for each insn. */ - gcc_assert (VEC_empty (expr_t, vec_av_set)); + gcc_assert (vec_av_set.is_empty ()); FOR_EACH_EXPR (expr, si, av) { - VEC_safe_push (expr_t, heap, vec_av_set, expr); + vec_av_set.safe_push (expr); gcc_assert (EXPR_PRIORITY_ADJ (expr) == 0 || *pneed_stall); @@ -3730,7 +3718,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, } /* Sort the vector. */ - VEC_qsort (expr_t, vec_av_set, sel_rank_for_schedule); + vec_av_set.qsort (sel_rank_for_schedule); /* We record maximal priority of insns in av set for current instruction group. */ @@ -3738,11 +3726,11 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, av_max_prio = est_ticks_till_branch = INT_MIN; /* Filter out inappropriate expressions. Loop's direction is reversed to - visit "best" instructions first. We assume that VEC_unordered_remove + visit "best" instructions first. We assume that vec::unordered_remove moves last element in place of one being deleted. */ - for (n = VEC_length (expr_t, vec_av_set) - 1, stalled = 0; n >= 0; n--) + for (n = vec_av_set.length () - 1, stalled = 0; n >= 0; n--) { - expr_t expr = VEC_index (expr_t, vec_av_set, n); + expr_t expr = vec_av_set[n]; insn_t insn = EXPR_INSN_RTX (expr); signed char target_available; bool is_orig_reg_p = true; @@ -3751,7 +3739,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, /* Don't allow any insns other than from SCHED_GROUP if we have one. */ if (FENCE_SCHED_NEXT (fence) && insn != FENCE_SCHED_NEXT (fence)) { - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); continue; } @@ -3775,7 +3763,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, we have to recompute the set of available registers for it. */ if (vinsn_vec_has_expr_p (vec_bookkeeping_blocked_vinsns, expr)) { - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Expr %d is blocked by bookkeeping inserted earlier\n", INSN_UID (insn)); @@ -3792,12 +3780,12 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, (target_available == false && !EXPR_SEPARABLE_P (expr)) /* Don't try to find a register for low-priority expression. */ - || (int) VEC_length (expr_t, vec_av_set) - 1 - n >= max_insns_to_rename + || (int) vec_av_set.length () - 1 - n >= max_insns_to_rename /* ??? FIXME: Don't try to rename data speculation. */ || (EXPR_SPEC_DONE_DS (expr) & BEGIN_DATA) || ! find_best_reg_for_expr (expr, bnds, &is_orig_reg_p)) { - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Expr %d has no suitable target register\n", INSN_UID (insn)); @@ -3817,7 +3805,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, if ((int) current_loop_nest->ninsns < 9) { - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Pipelining expr %d will likely cause stall\n", INSN_UID (insn)); @@ -3828,7 +3816,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, < need_n_ticks_till_branch * issue_rate / 2 && est_ticks_till_branch < need_n_ticks_till_branch) { - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Pipelining expr %d will likely cause stall\n", INSN_UID (insn)); @@ -3843,7 +3831,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, { stalled++; min_need_stall = min_need_stall < 0 ? 1 : MIN (min_need_stall, 1); - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Delaying speculation check %d until its first use\n", INSN_UID (insn)); @@ -3870,7 +3858,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, min_need_stall = (min_need_stall < 0 ? need_cycles : MIN (min_need_stall, need_cycles)); - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Expr %d is not ready until cycle %d (cached)\n", @@ -3908,7 +3896,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, ? need_cycles : MIN (min_need_stall, need_cycles)); - VEC_unordered_remove (expr_t, vec_av_set, n); + vec_av_set.unordered_remove (n); if (sched_verbose >= 4) sel_print ("Expr %d is not ready yet until cycle %d\n", @@ -3933,7 +3921,7 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, if (min_need_stall < 0) min_need_stall = 0; - if (VEC_empty (expr_t, vec_av_set)) + if (vec_av_set.is_empty ()) { /* We need to set *pneed_stall here, because later we skip this code when ready list is empty. */ @@ -3944,14 +3932,14 @@ fill_vec_av_set (av_set_t av, blist_t bnds, fence_t fence, gcc_assert (min_need_stall == 0); /* Sort the vector. */ - VEC_qsort (expr_t, vec_av_set, sel_rank_for_schedule); + vec_av_set.qsort (sel_rank_for_schedule); if (sched_verbose >= 4) { sel_print ("Total ready exprs: %d, stalled: %d\n", - VEC_length (expr_t, vec_av_set), stalled); - sel_print ("Sorted av set (%d): ", VEC_length (expr_t, vec_av_set)); - FOR_EACH_VEC_ELT (expr_t, vec_av_set, n, expr) + vec_av_set.length (), stalled); + sel_print ("Sorted av set (%d): ", vec_av_set.length ()); + FOR_EACH_VEC_ELT (vec_av_set, n, expr) dump_expr (expr); sel_print ("\n"); } @@ -3969,7 +3957,7 @@ convert_vec_av_set_to_ready (void) expr_t expr; /* Allocate and fill the ready list from the sorted vector. */ - ready.n_ready = VEC_length (expr_t, vec_av_set); + ready.n_ready = vec_av_set.length (); ready.first = ready.n_ready - 1; gcc_assert (ready.n_ready > 0); @@ -3980,7 +3968,7 @@ convert_vec_av_set_to_ready (void) sched_extend_ready_list (ready.n_ready); } - FOR_EACH_VEC_ELT (expr_t, vec_av_set, n, expr) + FOR_EACH_VEC_ELT (vec_av_set, n, expr) { vinsn_t vi = EXPR_VINSN (expr); insn_t insn = VINSN_INSN_RTX (vi); @@ -4126,7 +4114,7 @@ invoke_reorder_hooks (fence_t fence) { int i, j, n; rtx *arr = ready.vec; - expr_t *vec = VEC_address (expr_t, vec_av_set); + expr_t *vec = vec_av_set.address (); for (i = 0, n = ready.n_ready; i < n; i++) if (EXPR_INSN_RTX (vec[i]) != arr[i]) @@ -4159,7 +4147,7 @@ find_expr_for_ready (int index, bool follow_ready_element) real_index = follow_ready_element ? ready.first - index : index; - expr = VEC_index (expr_t, vec_av_set, real_index); + expr = vec_av_set[real_index]; gcc_assert (ready.vec[real_index] == EXPR_INSN_RTX (expr)); return expr; @@ -4994,16 +4982,15 @@ remove_temp_moveop_nops (bool full_tidying) int i; insn_t insn; - FOR_EACH_VEC_ELT (insn_t, vec_temp_moveop_nops, i, insn) + FOR_EACH_VEC_ELT (vec_temp_moveop_nops, i, insn) { gcc_assert (INSN_NOP_P (insn)); return_nop_to_pool (insn, full_tidying); } /* Empty the vector. */ - if (VEC_length (insn_t, vec_temp_moveop_nops) > 0) - VEC_block_remove (insn_t, vec_temp_moveop_nops, 0, - VEC_length (insn_t, vec_temp_moveop_nops)); + if (vec_temp_moveop_nops.length () > 0) + vec_temp_moveop_nops.block_remove (0, vec_temp_moveop_nops.length ()); } /* Records the maximal UID before moving up an instruction. Used for @@ -5336,7 +5323,7 @@ update_fence_and_insn (fence_t fence, insn_t insn, int need_stall) /* First, reflect that something is scheduled on this fence. */ asm_p = advance_state_on_fence (fence, insn); FENCE_LAST_SCHEDULED_INSN (fence) = insn; - VEC_safe_push (rtx, gc, FENCE_EXECUTING_INSNS (fence), insn); + vec_safe_push (FENCE_EXECUTING_INSNS (fence), insn); if (SCHED_GROUP_P (insn)) { FENCE_SCHED_NEXT (fence) = INSN_SCHED_NEXT (insn); @@ -5983,7 +5970,7 @@ remove_insn_from_stream (rtx insn, bool only_disconnect) { insn_t nop = get_nop_from_pool (insn); gcc_assert (INSN_NOP_P (nop)); - VEC_safe_push (insn_t, heap, vec_temp_moveop_nops, nop); + vec_temp_moveop_nops.safe_push (nop); } sel_remove_insn (insn, only_disconnect, false); @@ -6876,10 +6863,10 @@ sel_region_init (int rgn) if (current_region_empty_p ()) return true; - bbs = VEC_alloc (basic_block, heap, current_nr_blocks); + bbs.create (current_nr_blocks); for (i = 0; i < current_nr_blocks; i++) - VEC_quick_push (basic_block, bbs, BASIC_BLOCK (BB_TO_BLOCK (i))); + bbs.quick_push (BASIC_BLOCK (BB_TO_BLOCK (i))); sel_init_bbs (bbs); @@ -6905,7 +6892,7 @@ sel_region_init (int rgn) sel_setup_sched_infos (); sel_init_global_and_expr (bbs); - VEC_free (basic_block, heap, bbs); + bbs.release (); blocks_to_reschedule = BITMAP_ALLOC (NULL); @@ -7253,13 +7240,12 @@ sel_region_finish (bool reset_sched_cycles_p) free_nop_pool (); /* Free the vectors. */ - if (vec_av_set) - VEC_free (expr_t, heap, vec_av_set); + vec_av_set.release (); BITMAP_FREE (current_copies); BITMAP_FREE (current_originators); BITMAP_FREE (code_motion_visited_blocks); - vinsn_vec_free (&vec_bookkeeping_blocked_vinsns); - vinsn_vec_free (&vec_target_unavailable_vinsns); + vinsn_vec_free (vec_bookkeeping_blocked_vinsns); + vinsn_vec_free (vec_target_unavailable_vinsns); /* If LV_SET of the region head should be updated, do it now because there will be no other chance. */ @@ -7289,7 +7275,7 @@ sel_region_finish (bool reset_sched_cycles_p) finish_deps_global (); sched_finish_luids (); - VEC_free (haifa_deps_insn_data_def, heap, h_d_i_d); + h_d_i_d.release (); sel_finish_bbs (); BITMAP_FREE (blocks_to_reschedule); |