On 06.04.2018 18:59, Alexander Monakov wrote: > On Tue, 3 Apr 2018, Andrey Belevantsev wrote: > >> Hello, >> >> This issues is about the correct order in which we need to call the >> routines that fix up the control flow for us. > > OK with formatting both in the new comment and the Changelog fixed.
Thanks, fixed that in rev. 259229. Andrey > >> Best, >> Andrey >> >> 2018-04-03 Andrey Belevantsev <a...@ispras.ru> >> >> PR rtl-optimization/83962 >> >> * sel-sched-ir.c (tidy_control_flow): Correct the order in which we call >> tidy_fallthru_edge >> and tidy_control_flow. >> >> * gcc.dg/pr83962.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 >> @@ -3839,9 +3839,13 @@ tidy_control_flow (basic_block xbb, bool full_tidying) >> && INSN_SCHED_TIMES (BB_END (xbb)) == 0 >> && !IN_CURRENT_FENCE_P (BB_END (xbb))) >> { >> - if (sel_remove_insn (BB_END (xbb), false, false)) >> - return true; >> + /* We used to call sel_remove_insn here that can trigger >> tidy_control_flow >> + before we fix up the fallthru edge. Correct that ordering by >> + explicitly doing the latter before the former. */ >> + clear_expr (INSN_EXPR (BB_END (xbb))); >> tidy_fallthru_edge (EDGE_SUCC (xbb, 0)); >> + if (tidy_control_flow (xbb, false)) >> + return true; >> } >> >> first = sel_bb_head (xbb); >> diff --git a/gcc/testsuite/gcc.dg/pr83962.c b/gcc/testsuite/gcc.dg/pr83962.c >> new file mode 100644 >> index 00000000000..0547e218715 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/pr83962.c >> @@ -0,0 +1,10 @@ >> +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ >> +/* { dg-options "-std=gnu99 -O1 -fselective-scheduling2 -fschedule-insns2 >> -fcse-follow-jumps -fno-ssa-phiopt -fno-guess-branch-probability" } */ >> +unsigned int ca; >> + >> +void >> +v6 (long long unsigned int as, int p9) >> +{ >> + while (p9 < 1) >> + as = (as != ca) || (as > 1); >> +} >>