Hello, This issue ended up being fixed the way different from described in the PR. We do not want to walk away from the invariant "zero SCHED_TIMES -- insn is not scheduled" even for bookkeeping copies (testing showed it trips over asserts designed to catch this). Rather we choose merging exprs in the way the larger sched-times wins.
Best, Andrey 2018-04-03 Andrey Belevantsev <a...@ispras.ru> 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. diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index a965d2ec42f..f6de96a7f3d 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -1837,8 +1837,9 @@ 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); + 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; @@ -3293,11 +3294,22 @@ has_dependence_note_mem_dep (rtx mem ATTRIBUTE_UNUSED, /* Note a dependence. */ static void diff --git a/gcc/testsuite/gcc.dg/pr83913.c b/gcc/testsuite/gcc.dg/pr83913.c new file mode 100644 index 00000000000..c898d71a261 --- /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; +}