Hello! Attached patch fixes an oversight in mode-switching. For blocks without ANY mode requirements, we have to consider instructions with MODE_AFTER mode changes. If the exiting mode from the block is different that no_mode (the mode we start), we have to mark the block as nontransparent.
2013-11-08 Uros Bizjak <ubiz...@gmail.com> * mode-switching.c (optimize_mode_switching): Mark block as nontransparent, if last_mode at block exit is different from no_mode. Bootstrapped and regression tested on x86_64-pc-linux-gnu {,-m32} core-avx-i configured bootstrap. OK for mainline and branches? Thanks, Uros.
Index: mode-switching.c =================================================================== --- mode-switching.c (revision 204496) +++ mode-switching.c (working copy) @@ -577,6 +577,8 @@ optimize_mode_switching (void) { ptr = new_seginfo (no_mode, BB_END (bb), bb->index, live_now); add_seginfo (info + bb->index, ptr); + if (last_mode != no_mode) + bitmap_clear_bit (transp[bb->index], j); } } #if defined (MODE_ENTRY) && defined (MODE_EXIT)