Reset insn priority after inc/ref replacement
authorRobin Dapp <rdapp@linux.ibm.com>
Fri, 19 Oct 2018 06:25:30 +0000 (06:25 +0000)
committerRobin Dapp <rdapp@gcc.gnu.org>
Fri, 19 Oct 2018 06:25:30 +0000 (06:25 +0000)
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

gcc/ChangeLog
gcc/haifa-sched.c

index 7c5f9dd..82cc005 100644 (file)
@@ -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
index 1fdc9df..2c84ce3 100644 (file)
@@ -830,7 +830,7 @@ add_delay_dependencies (rtx_insn *insn)
 \f
 /* 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);