This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/49220] ICE in create_pre_exit, at mode-switching.c:401
- From: "kkojima at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 29 May 2011 12:39:53 +0000
- Subject: [Bug middle-end/49220] ICE in create_pre_exit, at mode-switching.c:401
- Auto-submitted: auto-generated
- References: <bug-49220-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49220
Kazumoto Kojima <kkojima at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |ice-on-invalid-code
CC| |kkojima at gcc dot gnu.org
--- Comment #1 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-05-29 12:39:21 UTC ---
I think that create_pre_exit is used by SH target only.
I'm testing the patch below.
--- ORIG/trunk/gcc/mode-switching.c 2010-11-20 09:24:49.000000000 +0900
+++ trunk/gcc/mode-switching.c 2011-05-29 21:24:18.000000000 +0900
@@ -324,7 +324,14 @@ create_pre_exit (int n_entities, int *en
&& 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)
break;
copy_num