aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRobin Dapp <rdapp@linux.ibm.com>2018-10-19 06:25:30 +0000
committerRobin Dapp <rdapp@gcc.gnu.org>2018-10-19 06:25:30 +0000
commit079c81d010e3303c8fdbc4669bf3907fe7a37052 (patch)
tree62a104b46c142a0806e88524cf3af84a78d8c3e5 /gcc
parente75883a503330846f7a76bc6610513fd10a45cf4 (diff)
downloadgcc-079c81d010e3303c8fdbc4669bf3907fe7a37052.zip
gcc-079c81d010e3303c8fdbc4669bf3907fe7a37052.tar.gz
gcc-079c81d010e3303c8fdbc4669bf3907fe7a37052.tar.bz2
Reset insn priority after inc/ref replacement
This patch recomputes the insn priority when a replacement for one of its dependent insns is applied. gcc/ChangeLog: * haifa-sched.c (priority): Add force_recompute parameter. (apply_replacement): Call priority () with force_recompute = true. (restore_pattern): Likewise. From-SVN: r265304
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/haifa-sched.c21
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7c5f9dd..82cc005 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-10-19 Robin Dapp <rdapp@linux.ibm.com>
+
+ * haifa-sched.c (priority): Add force_recompute parameter.
+ (apply_replacement): Call priority () with force_recompute = true.
+ (restore_pattern): Likewise.
+
2018-10-18 H.J. Lu <hongjiu.lu@intel.com>
* simplify-rtx.c (simplify_subreg): Limit mask of vec_merge to
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 1fdc9df..2c84ce3 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -830,7 +830,7 @@ add_delay_dependencies (rtx_insn *insn)
/* 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);
@@ -1590,7 +1590,7 @@ bool sched_fusion;
/* 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;
@@ -1598,7 +1598,7 @@ priority (rtx_insn *insn)
/* 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;
@@ -4713,7 +4713,12 @@ apply_replacement (dep_t dep, bool immediately)
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);
@@ -4767,7 +4772,17 @@ restore_pattern (dep_t dep, bool immediately)
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);