From patchwork Mon Nov 12 08:36:23 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [RFA,middle-end] Fix PR target/41993 Date: Sun, 11 Nov 2012 22:36:23 -0000 From: Uros Bizjak X-Patchwork-Id: 198330 Message-Id: To: Eric Botcazou Cc: Kaz Kojima , gcc-patches@gcc.gnu.org On Tue, Nov 6, 2012 at 9:12 AM, Eric Botcazou wrote: >> 2012-11-05 Uros Bizjak >> Kaz Kojima >> >> PR target/41993 >> * mode-switching.c (create_pre_exit): Set return_copy to >> last_insn when copy_start is a pseudo reg. It looks to me, that we in fact want: --cut here-- --cut here-- If we find an unrelated HARD register, we will fail in the same way as described in the PR. This was found by post-reload vzeroupper insertion pass that tripped on unrelated hard reg assignment. At this point, we are interested only in hard registers that are also used for function return value. Actually, even in pre-reload pass, there are no other assignments to hard registers. Uros. Index: mode-switching.c =================================================================== --- mode-switching.c (revision 193407) +++ mode-switching.c (working copy) @@ -330,7 +330,7 @@ short_block = 1; break; } - if (copy_start >= FIRST_PSEUDO_REGISTER) + if (!targetm.calls.function_value_regno_p (copy_start)) { last_insn = return_copy; continue;