]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR rtl-optimization/83913
authorabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Apr 2018 09:42:25 +0000 (09:42 +0000)
committerabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Apr 2018 09:42:25 +0000 (09:42 +0000)
       * sel-sched-ir.c (merge_expr_data): Choose the middle between two
       different sched-times when merging exprs.

       * gcc.dg/pr83913.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259230 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/sel-sched-ir.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr83913.c [new file with mode: 0644]

index 99d9ccacd36d3b39a2dbeec7517ee6d2df8e880d..a22c610bab7fa8804c783cee3d3647fb84950c42 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
+
+       PR rtl-optimization/83913
+
+       * sel-sched-ir.c (merge_expr_data): Choose the middle between two
+       different sched-times when merging exprs.
+
 2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/83962
index 987bd9f93cf440da5258c0da10885220bdded605..6f1e5a1f90dae216897e29c0a245536fffc5dc35 100644 (file)
@@ -1837,8 +1837,12 @@ merge_expr_data (expr_t to, expr_t from, insn_t split_point)
   if (EXPR_PRIORITY (to) < EXPR_PRIORITY (from))
     EXPR_PRIORITY (to) = EXPR_PRIORITY (from);
 
-  if (EXPR_SCHED_TIMES (to) > EXPR_SCHED_TIMES (from))
-    EXPR_SCHED_TIMES (to) = EXPR_SCHED_TIMES (from);
+  /* We merge sched-times half-way to the larger value to avoid the endless
+     pipelining of unneeded insns.  The average seems to be good compromise
+     between pipelining opportunities and avoiding extra work.  */
+  if (EXPR_SCHED_TIMES (to) != EXPR_SCHED_TIMES (from))
+    EXPR_SCHED_TIMES (to) = ((EXPR_SCHED_TIMES (from) + EXPR_SCHED_TIMES (to)
+                             + 1) / 2);
 
   if (EXPR_ORIG_BB_INDEX (to) != EXPR_ORIG_BB_INDEX (from))
     EXPR_ORIG_BB_INDEX (to) = 0;
index 91a1a2f8973d06370e685915db8ff228b2cb4b11..2de94af83e2ecf7c6fae53087b10cfc7f4dcf89a 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
+
+       PR rtl-optimization/83913
+       * gcc.dg/pr83913.c: New test.
+
 2018-04-09  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/83962
diff --git a/gcc/testsuite/gcc.dg/pr83913.c b/gcc/testsuite/gcc.dg/pr83913.c
new file mode 100644 (file)
index 0000000..c898d71
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -funroll-all-loops -fselective-scheduling -fsel-sched-pipelining -fschedule-insns -fno-dce -fno-forward-propagate -fno-rerun-cse-after-loop -fno-web" } */
+
+int jo, z4;
+
+int
+be (long unsigned int l7, int nt)
+{
+  int en;
+
+  jo = l7;
+  for (en = 0; en < 24; ++en)
+    {
+      jo = (jo / z4) * (!!jo >= ((!!nt) & 2));
+      if (jo == 0)
+        nt = 0;
+      else
+        {
+          nt = z4;
+          ++z4;
+          nt = (long unsigned int) nt == (l7 + 1);
+        }
+    }
+
+  return nt;
+}