diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2018-04-09 12:42:25 +0300 |
---|---|---|
committer | Andrey Belevantsev <abel@gcc.gnu.org> | 2018-04-09 12:42:25 +0300 |
commit | 8e9a9b014264250eeda5544cafbdc16eba9489e1 (patch) | |
tree | 084a26bd36d6ca02b7525caa82303dee556aede0 | |
parent | ab6dceab101d62684d93655217f0ff5840c6ef5b (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr83913.c | 26 |
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; +} |