diff options
Diffstat (limited to 'gcc/mode-switching.c')
-rw-r--r-- | gcc/mode-switching.c | 9 |
1 files changed, 8 insertions, 1 deletions
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; |