On July 19, 2016 7:27:30 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >Normally empty blocks without successors (result of >__builtin_unreachable () >somewhere in RTL) aren't considered as forwarder_block_p, because they >don't satisfy single_succ_p. But e.g. during cross-jumping fake edges >to >exit are added and then they suddenly satisfy this predicate, which >confuses >the cross-jumping among other things (normally cross-jumping attempts >to be >careful with no real successor blocks if there isn't a noreturn call >with REG_ARGS_SIZE note, but if it believes those are forwarders, it >doesn't >check hard). > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for >trunk/6.2?
OK. Thanks, Richard. >2016-07-19 Jakub Jelinek <ja...@redhat.com> > > PR rtl-optimization/71916 > * cfgrtl.c (contains_no_active_insn_p): Return false also for > bb which have a single succ fake edge. > > * gcc.c-torture/compile/pr71916.c: New test. > >--- gcc/cfgrtl.c.jj 2016-05-11 15:15:49.000000000 +0200 >+++ gcc/cfgrtl.c 2016-07-19 16:38:20.362303955 +0200 >@@ -574,8 +574,10 @@ contains_no_active_insn_p (const_basic_b > { > rtx_insn *insn; > >- if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == >ENTRY_BLOCK_PTR_FOR_FN (cfun) >- || !single_succ_p (bb)) >+ if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) >+ || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun) >+ || !single_succ_p (bb) >+ || (single_succ_edge (bb)->flags & EDGE_FAKE) != 0) > return false; > >for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn)) >--- gcc/testsuite/gcc.c-torture/compile/pr71916.c.jj 2016-07-19 >16:43:37.610371787 +0200 >+++ gcc/testsuite/gcc.c-torture/compile/pr71916.c 2016-07-19 >16:43:20.000000000 +0200 >@@ -0,0 +1,36 @@ >+/* PR rtl-optimization/71916 */ >+ >+int a, b, c, d, f, g; >+short h; >+ >+short >+foo (short p1) >+{ >+ return a >= 2 || p1 > 7 >> a ? p1 : p1 << a; >+} >+ >+void >+bar (void) >+{ >+ for (;;) >+ { >+ int i, j[3]; >+ h = b >= 2 ? d : d >> b; >+ if (foo (f > h ^ c)) >+ { >+ d = 0; >+ while (f <= 2) >+ { >+ char k[2]; >+ for (;;) >+ k[i++] = 7; >+ } >+ } >+ else >+ for (;;) >+ g = j[2]; >+ if (g) >+ for (;;) >+ ; >+ } >+} > > Jakub