aboutsummaryrefslogtreecommitdiff
path: root/gcc/mode-switching.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/mode-switching.c')
-rw-r--r--gcc/mode-switching.c9
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;