Mercurial > hg > CbC > CbC_gcc
diff gcc/haifa-sched.c @ 132:d34655255c78
update gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 10:21:07 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/haifa-sched.c Thu Oct 25 08:08:40 2018 +0900 +++ b/gcc/haifa-sched.c Thu Oct 25 10:21:07 2018 +0900 @@ -1,5 +1,5 @@ /* Instruction scheduling pass. - Copyright (C) 1992-2017 Free Software Foundation, Inc. + Copyright (C) 1992-2018 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by, and currently maintained by, Jim Wilson (wilson@cygnus.com) @@ -529,6 +529,9 @@ /* Test if it is a 'store'. */ tmp_class = may_trap_exp (XEXP (x, 0), 1); break; + case CLOBBER_HIGH: + gcc_assert (REG_P (XEXP (x, 0))); + break; case SET: /* Test if it is a store. */ tmp_class = may_trap_exp (SET_DEST (x), 1); @@ -827,7 +830,7 @@ /* Forward declarations. */ -static int priority (rtx_insn *); +static int priority (rtx_insn *, bool force_recompute = false); static int autopref_rank_for_schedule (const rtx_insn *, const rtx_insn *); static int rank_for_schedule (const void *, const void *); static void swap_sort (rtx_insn **, int); @@ -1587,7 +1590,7 @@ /* Compute the priority number for INSN. */ static int -priority (rtx_insn *insn) +priority (rtx_insn *insn, bool force_recompute) { if (! INSN_P (insn)) return 0; @@ -1595,7 +1598,7 @@ /* We should not be interested in priority of an already scheduled insn. */ gcc_assert (QUEUE_INDEX (insn) != QUEUE_SCHEDULED); - if (!INSN_PRIORITY_KNOWN (insn)) + if (force_recompute || !INSN_PRIORITY_KNOWN (insn)) { int this_priority = -1; @@ -2539,7 +2542,7 @@ RFS_SCHED_GROUP, RFS_PRESSURE_DELAY, RFS_PRESSURE_TICK, RFS_FEEDS_BACKTRACK_INSN, RFS_PRIORITY, RFS_SPECULATION, RFS_SCHED_RANK, RFS_LAST_INSN, RFS_PRESSURE_INDEX, - RFS_DEP_COUNT, RFS_TIE, RFS_FUSION, RFS_N }; + RFS_DEP_COUNT, RFS_TIE, RFS_FUSION, RFS_COST, RFS_N }; /* Corresponding strings for print outs. */ static const char *rfs_str[RFS_N] = { @@ -2547,7 +2550,7 @@ "RFS_SCHED_GROUP", "RFS_PRESSURE_DELAY", "RFS_PRESSURE_TICK", "RFS_FEEDS_BACKTRACK_INSN", "RFS_PRIORITY", "RFS_SPECULATION", "RFS_SCHED_RANK", "RFS_LAST_INSN", "RFS_PRESSURE_INDEX", - "RFS_DEP_COUNT", "RFS_TIE", "RFS_FUSION" }; + "RFS_DEP_COUNT", "RFS_TIE", "RFS_FUSION", "RFS_COST" }; /* Statistical breakdown of rank_for_schedule decisions. */ struct rank_for_schedule_stats_t { unsigned stats[RFS_N]; }; @@ -2783,12 +2786,11 @@ } /* Prefer instructions that occur earlier in the model schedule. */ - if (sched_pressure == SCHED_PRESSURE_MODEL - && INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb) + if (sched_pressure == SCHED_PRESSURE_MODEL) { diff = model_index (tmp) - model_index (tmp2); - gcc_assert (diff != 0); - return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2); + if (diff != 0) + return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2); } /* Prefer the insn which has more later insns that depend on it. @@ -2801,6 +2803,14 @@ if (flag_sched_dep_count_heuristic && val != 0) return rfs_result (RFS_DEP_COUNT, val, tmp, tmp2); + /* Sort by INSN_COST rather than INSN_LUID. This means that instructions + which take longer to execute are prioritised and it leads to more + dual-issue opportunities on in-order cores which have this feature. */ + + if (INSN_COST (tmp) != INSN_COST (tmp2)) + return rfs_result (RFS_COST, INSN_COST (tmp2) - INSN_COST (tmp), + tmp, tmp2); + /* If insns are equally good, sort by INSN_LUID (original insn order), so that we make the sort stable. This minimizes instruction movement, thus minimizing sched's effect on debugging and cross-jumping. */ @@ -3917,8 +3927,8 @@ - call_saved_regs_num[cl]). */ { int i; - int entry_freq = ENTRY_BLOCK_PTR_FOR_FN (cfun)->frequency; - int bb_freq = bb->frequency; + int entry_freq = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun); + int bb_freq = bb->count.to_frequency (cfun); if (bb_freq == 0) { @@ -4010,7 +4020,7 @@ gcc_assert (sd_lists_empty_p (insn, SD_LIST_HARD_BACK)); /* Reset debug insns invalidated by moving this insn. */ - if (MAY_HAVE_DEBUG_INSNS && !DEBUG_INSN_P (insn)) + if (MAY_HAVE_DEBUG_BIND_INSNS && !DEBUG_INSN_P (insn)) for (sd_it = sd_iterator_start (insn, SD_LIST_BACK); sd_iterator_cond (&sd_it, &dep);) { @@ -4023,7 +4033,7 @@ continue; } - gcc_assert (DEBUG_INSN_P (dbg)); + gcc_assert (DEBUG_BIND_INSN_P (dbg)); if (sched_verbose >= 6) fprintf (sched_dump, ";;\t\tresetting: debug insn %d\n", @@ -4703,7 +4713,12 @@ success = validate_change (desc->insn, desc->loc, desc->newval, 0); gcc_assert (success); + rtx_insn *insn = DEP_PRO (dep); + + /* Recompute priority since dependent priorities may have changed. */ + priority (insn, true); update_insn_after_change (desc->insn); + if ((TODO_SPEC (desc->insn) & (HARD_DEP | DEP_POSTPONED)) == 0) fix_tick_ready (desc->insn); @@ -4757,7 +4772,17 @@ success = validate_change (desc->insn, desc->loc, desc->orig, 0); gcc_assert (success); + + rtx_insn *insn = DEP_PRO (dep); + + if (QUEUE_INDEX (insn) != QUEUE_SCHEDULED) + { + /* Recompute priority since dependent priorities may have changed. */ + priority (insn, true); + } + update_insn_after_change (desc->insn); + if (backtrack_queue != NULL) { backtrack_queue->replacement_deps.safe_push (dep); @@ -8086,7 +8111,7 @@ || (!NOTE_P (insn) && !LABEL_P (insn) /* Don't emit a NOTE if it would end up before a BARRIER. */ - && !BARRIER_P (NEXT_INSN (end)))) + && !BARRIER_P (next_nondebug_insn (end)))) { rtx_note *note = emit_note_after (NOTE_INSN_DELETED, end); /* Make note appear outside BB. */ @@ -8141,8 +8166,6 @@ single->count = last->count; empty->count = last->count; - single->frequency = last->frequency; - empty->frequency = last->frequency; BB_COPY_PARTITION (single, last); BB_COPY_PARTITION (empty, last); @@ -8236,7 +8259,6 @@ in sel-sched.c `check_ds' in create_speculation_check. */ e->probability = profile_probability::very_unlikely (); rec->count = e->count (); - rec->frequency = EDGE_FREQUENCY (e); e2->probability = e->probability.invert (); rtx_code_label *label = block_label (second_bb);