sel-sched: fix zero-usefulness case in sel_rank_for_schedule (PR 83513)
authorAlexander Monakov <amonakov@ispras.ru>
Tue, 26 Dec 2017 14:34:33 +0000 (17:34 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Tue, 26 Dec 2017 14:34:33 +0000 (17:34 +0300)
PR rtl-optimization/83513
* sel-sched.c (sel_rank_for_schedule): Order by non-zero usefulness
before priority comparison.

From-SVN: r256001

gcc/ChangeLog
gcc/sel-sched.c

index 22c8ea3f8815250757a7043f16ac216d6ebb9f45..2df0a20bbc49e8f24f0431a83aa97be8da8813d3 100644 (file)
@@ -1,3 +1,9 @@
+2017-12-26  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR rtl-optimization/83513
+       * sel-sched.c (sel_rank_for_schedule): Order by non-zero usefulness
+       before priority comparison.
+
 2017-12-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/83488
index c1be013655158b27bf80ca2cb92023913a2a66d9..be3813717ba107f26c7bb49da7949a61834b41e3 100644 (file)
@@ -3396,17 +3396,22 @@ sel_rank_for_schedule (const void *x, const void *y)
   else if (control_flow_insn_p (tmp2_insn) && !control_flow_insn_p (tmp_insn))
     return 1;
 
-  /* Prefer an expr with greater priority.  */
-  if (EXPR_USEFULNESS (tmp) != 0 || EXPR_USEFULNESS (tmp2) != 0)
-    {
-      int p2 = EXPR_PRIORITY (tmp2) + EXPR_PRIORITY_ADJ (tmp2),
-          p1 = EXPR_PRIORITY (tmp) + EXPR_PRIORITY_ADJ (tmp);
+  /* Prefer an expr with non-zero usefulness.  */
+  int u1 = EXPR_USEFULNESS (tmp), u2 = EXPR_USEFULNESS (tmp2);
 
-      val = p2 * EXPR_USEFULNESS (tmp2) - p1 * EXPR_USEFULNESS (tmp);
+  if (u1 == 0)
+    {
+      if (u2 == 0)
+        u1 = u2 = 1;
+      else
+        return 1;
     }
-  else
-    val = EXPR_PRIORITY (tmp2) - EXPR_PRIORITY (tmp)
-         + EXPR_PRIORITY_ADJ (tmp2) - EXPR_PRIORITY_ADJ (tmp);
+  else if (u2 == 0)
+    return -1;
+
+  /* Prefer an expr with greater priority.  */
+  val = (u2 * (EXPR_PRIORITY (tmp2) + EXPR_PRIORITY_ADJ (tmp2))
+         - u1 * (EXPR_PRIORITY (tmp) + EXPR_PRIORITY_ADJ (tmp)));
   if (val)
     return val;