aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2018-04-09 12:42:25 +0300
committerAndrey Belevantsev <abel@gcc.gnu.org>2018-04-09 12:42:25 +0300
commit8e9a9b014264250eeda5544cafbdc16eba9489e1 (patch)
tree084a26bd36d6ca02b7525caa82303dee556aede0
parentab6dceab101d62684d93655217f0ff5840c6ef5b (diff)
downloadgcc-8e9a9b014264250eeda5544cafbdc16eba9489e1.zip
gcc-8e9a9b014264250eeda5544cafbdc16eba9489e1.tar.gz
gcc-8e9a9b014264250eeda5544cafbdc16eba9489e1.tar.bz2
re PR rtl-optimization/83913 (Compile time and memory hog w/ selective scheduling)
PR rtl-optimization/83913 * sel-sched-ir.c (merge_expr_data): Choose the middle between two different sched-times when merging exprs. * gcc.dg/pr83913.c: New test. From-SVN: r259230
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/sel-sched-ir.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr83913.c26
4 files changed, 44 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99d9cca..a22c610 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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
* sel-sched-ir.c (tidy_control_flow): Correct the order in which we call
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index 987bd9f..6f1e5a1 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 91a1a2f..2de94af 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* gcc.dg/pr83962.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr83913.c b/gcc/testsuite/gcc.dg/pr83913.c
new file mode 100644
index 0000000..c898d71
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83913.c
@@ -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;
+}