diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/mode-switching.c | 9 |
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0445594..9444adc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-07 Kaz Kojima <kkojima@gcc.gnu.org> + + PR middle-end/49220 + * mode-switching.c (create_pre_exit): Set short_block if there + are no copy insns. + 2012-11-07 Martin Jambor <mjambor@suse.cz> * lto-cgraph.c: Include tree-pass.h. diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index 386f8d1..2072628 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -322,7 +322,14 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes) && GET_CODE (SUBREG_REG (copy_reg)) == REG) copy_start = REGNO (SUBREG_REG (copy_reg)); else - break; + { + /* When control reaches end of non-void function, + there are no return copy insns at all. This + avoids an ice on that invalid function. */ + if (ret_start + nregs == ret_end) + short_block = 1; + break; + } if (copy_start >= FIRST_PSEUDO_REGISTER) { last_insn = return_copy; |