Add handling to fixup_reorder_chain for a region crossing branch, which cannot be optimized away (since it is needed to cross the region boundary). In the case when there is no fallthru for a conditional jump the comments indicate that this can happen if the conditional jump has side effects and can't be deleted, in which case a barrier is inserted and no change is made to the branch. Here, since the branch is region crossing, it also cannot be eliminated, but the assert was not handling that case. I fixed by simply adding a check for it to the assert.
fixup_reorder_chain already has some handling for region-crossing branches, but it was only handling the case where there was both a taken and fallthru edge. In this case we had no fallthru. The reason was that the fallthru had been eliminated in an earlier round of cfg optimizations when going in/out of cfglayout mode during pro_and_epilogue. The fallthru was an empty block that appears to be due to switch expansion with the case having a __builtin_unreachable(). Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk? 2013-12-17 Teresa Johnson <tejohn...@google.com> PR gcov-profile/59527 * cfgrtl.c (fixup_reorder_chain): Handle a region-crossing branch, which can't be eliminated. Index: cfgrtl.c =================================================================== --- cfgrtl.c (revision 206033) +++ cfgrtl.c (working copy) @@ -3736,7 +3736,8 @@ fixup_reorder_chain (void) if (!e_fall) { gcc_assert (!onlyjump_p (bb_end_insn) - || returnjump_p (bb_end_insn)); + || returnjump_p (bb_end_insn) + || (e_taken->flags & EDGE_CROSSING)); emit_barrier_after (bb_end_insn); continue; } -- Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413