PR middle-end/49220
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Nov 2012 10:48:12 +0000 (10:48 +0000)
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Nov 2012 10:48:12 +0000 (10:48 +0000)
* mode-switching.c (create_pre_exit): Set short_block if there
are no copy insns.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193289 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/mode-switching.c

index 0445594..9444adc 100644 (file)
@@ -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.
index 386f8d1..2072628 100644 (file)
@@ -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;