modulo-sched: fix branch rescheduling issue (PR92591)
authorRoman Zhuykov <zhroma@ispras.ru>
Fri, 13 Dec 2019 17:33:38 +0000 (17:33 +0000)
committerRoman Zhuykov <zhroma@gcc.gnu.org>
Fri, 13 Dec 2019 17:33:38 +0000 (17:33 +0000)
PR rtl-optimization/92591
* modulo-sched.c (ps_add_node_check_conflicts): Improve checking
for history > 0 case.

testsuite:

PR rtl-optimization/92591
* gcc.dg/pr92951-1.c: New test.
* gcc.dg/pr92951-2.c: New test.

From-SVN: r279377

gcc/ChangeLog
gcc/modulo-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr92951-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr92951-2.c [new file with mode: 0644]

index 56d05cc498615249c955568eed8b99341b21a0db..f8a56a4c289427c9ba3d582c84124151d1bf785d 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-13  Roman Zhuykov  <zhroma@ispras.ru>
+
+       PR rtl-optimization/92591
+       * modulo-sched.c (ps_add_node_check_conflicts): Improve checking
+       for history > 0 case.
+
 2019-12-13  Roman Zhuykov  <zhroma@ispras.ru>
 
        * modulo-sched.c (sms_schedule): Use param_sms_max_ii_factor
@@ -8,6 +14,7 @@
 
 2019-12-13  Roman Zhuykov  <zhroma@ispras.ru>
 
+       PR rtl-optimization/90001
        * ddg.c (create_ddg): Init max_dist array for each node.
        (free_ddg): Free max_dist array.
        (create_ddg_edge): Use bool field instead of aux union.
index 2dc9af70930f40154adafaf59a2d5dc8d4313409..ddc2874fc7d815a11210276c3339fbd97601c49d 100644 (file)
@@ -3197,7 +3197,7 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n,
                             int c, sbitmap must_precede,
                             sbitmap must_follow)
 {
-  int has_conflicts = 0;
+  int i, first, amount, has_conflicts = 0;
   ps_insn_ptr ps_i;
 
   /* First add the node to the PS, if this succeeds check for
@@ -3205,23 +3205,32 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n,
   if (! (ps_i = add_node_to_ps (ps, n, c, must_precede, must_follow)))
     return NULL; /* Failed to insert the node at the given cycle.  */
 
-  has_conflicts = ps_has_conflicts (ps, c, c)
-                 || (ps->history > 0
-                     && ps_has_conflicts (ps,
-                                          c - ps->history,
-                                          c + ps->history));
-
-  /* Try different issue slots to find one that the given node can be
-     scheduled in without conflicts.  */
-  while (has_conflicts)
+  while (1)
     {
+      has_conflicts = ps_has_conflicts (ps, c, c);
+      if (ps->history > 0 && !has_conflicts)
+       {
+         /* Check all 2h+1 intervals, starting from c-2h..c up to c..2h,
+            but not more than ii intervals.  */
+         first = c - ps->history;
+         amount = 2 * ps->history + 1;
+         if (amount > ps->ii)
+           amount = ps->ii;
+         for (i = first; i < first + amount; i++)
+           {
+             has_conflicts = ps_has_conflicts (ps,
+                                               i - ps->history,
+                                               i + ps->history);
+             if (has_conflicts)
+               break;
+           }
+       }
+      if (!has_conflicts)
+       break;
+      /* Try different issue slots to find one that the given node can be
+        scheduled in without conflicts.  */
       if (! ps_insn_advance_column (ps, ps_i, must_follow))
        break;
-      has_conflicts = ps_has_conflicts (ps, c, c)
-                     || (ps->history > 0
-                         && ps_has_conflicts (ps,
-                                              c - ps->history,
-                                              c + ps->history));
     }
 
   if (has_conflicts)
index 7ea9f58c920b61fc1ae67d2bccd4ef16536ea7d0..2a4d9a09b491fa4e0093b1f40715f0425279a75f 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-13  Roman Zhuykov  <zhroma@ispras.ru>
+
+       PR rtl-optimization/92591
+       * gcc.dg/pr92951-1.c: New test.
+       * gcc.dg/pr92951-2.c: New test.
+
 2019-12-13  Dennis Zhang  <dennis.zhang@arm.com>
 
        * gcc.target/aarch64/pragma_cpp_predefs_2.c: Add tests for i8mm
diff --git a/gcc/testsuite/gcc.dg/pr92951-1.c b/gcc/testsuite/gcc.dg/pr92951-1.c
new file mode 100644 (file)
index 0000000..0f9365d
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR rtl-optimization/92591 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fmodulo-sched -fweb -fno-dce -fno-ivopts -fno-sched-pressure -fno-tree-loop-distribute-patterns --param sms-dfa-history=1" } */
+/* { dg-additional-options "-mcpu=e500mc" { target { powerpc-*-* } } } */
+
+void
+wf (char *mr, int tc)
+{
+  while (tc-- > 0)
+    *mr++ = 0;
+}
diff --git a/gcc/testsuite/gcc.dg/pr92951-2.c b/gcc/testsuite/gcc.dg/pr92951-2.c
new file mode 100644 (file)
index 0000000..04a8092
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR rtl-optimization/92591 */
+/* { dg-do compile } */
+/* { dg-options "-Os -fmodulo-sched -fmodulo-sched-allow-regmoves --param sms-dfa-history=8" } */
+
+#include "../gcc.c-torture/execute/pr61682.c"