diff options
author | Kaz Kojima <kkojima@gcc.gnu.org> | 2012-11-07 10:48:12 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2012-11-07 10:48:12 +0000 |
commit | d78e64db2018951aee075a74bfa71bd9938fd1b7 (patch) | |
tree | adbbfcc16d856974e6504e73e6efe7313f2cf502 /gcc | |
parent | 92d38f386bb23d45f15326edac74449064a6429d (diff) | |
download | gcc-d78e64db2018951aee075a74bfa71bd9938fd1b7.zip gcc-d78e64db2018951aee075a74bfa71bd9938fd1b7.tar.gz gcc-d78e64db2018951aee075a74bfa71bd9938fd1b7.tar.bz2 |
re PR middle-end/49220 (ICE in create_pre_exit, at mode-switching.c:401)
PR middle-end/49220
* mode-switching.c (create_pre_exit): Set short_block if there
are no copy insns.
From-SVN: r193289
Diffstat (limited to 'gcc')
-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; |