re PR target/41993 ([sh] ICE in create_pre_exit, at mode-switching.c:399)
authorUros Bizjak <ubizjak@gmail.com>
Tue, 13 Nov 2012 16:59:37 +0000 (17:59 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 13 Nov 2012 16:59:37 +0000 (17:59 +0100)
PR target/41993
* mode-switching.c (create_pre_exit): Set return_copy to last_insn
when copy_start is a function return regno instead of pseudo.
Skip debug instructions in instruction scan loop.

From-SVN: r193480

gcc/ChangeLog
gcc/mode-switching.c

index 863190f..864fc8f 100644 (file)
@@ -1,3 +1,10 @@
+2012-11-13  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/41993
+       * mode-switching.c (create_pre_exit): Set return_copy to last_insn
+       when copy_start is a function return regno instead of pseudo.
+       Skip debug instructions in instruction scan loop.
+
 2012-11-13  Andrew Stubbs  <ams@codesourcery.com>
            Ulrich Weigand  <ulrich.weigand@linaro.org>
 
index 2072628..d607ad3 100644 (file)
@@ -242,7 +242,8 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
                int copy_start, copy_num;
                int j;
 
-               if (INSN_P (return_copy))
+               if (INSN_P (return_copy)
+                   && !DEBUG_INSN_P (return_copy))
                  {
                    /* When using SJLJ exceptions, the call to the
                       unregister function is inserted between the
@@ -330,7 +331,7 @@ create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
                          short_block = 1;
                        break;
                      }
-                   if (copy_start >= FIRST_PSEUDO_REGISTER)
+                   if (!targetm.calls.function_value_regno_p (copy_start))
                      {
                        last_insn = return_copy;
                        continue;