diff mbox

[PR43920,5/9] Cross-jumping - Add missing use of return register.

Message ID 4D95E5F0.1030104@codesourcery.com
State New
Headers show

Commit Message

Tom de Vries April 1, 2011, 2:49 p.m. UTC
Reposting, with ChangeLog.

Comments

Jeff Law April 4, 2011, 7:11 p.m. UTC | #1
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 04/01/11 08:49, Tom de Vries wrote:
> Reposting, with ChangeLog.
> 	PR target/43920
> 	* function.c (emit_use_return_register_into_block): New function.
> 	(thread_prologue_and_epilogue_insns): Use
> 	emit_use_return_register_into_block.
OK
Jeff
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJNmhfwAAoJEBRtltQi2kC7TZUH/0c8CygMEMP7Nr7D3bceYgR0
u9P35+/b4CXCjTCOtvS+tR6c+2Wuc3rRmjFEQq9Q3z7K5DySfbkCVfGCeJ0kGj5T
nMg77l9zINumT+zY460Taqm3EuL7Souh89ahw2D7fyPXh2vaFugWLckoCuzkR/6K
PTRXD/rnaaQNAaU19h5yRtVQBgDdPfFY0KruWMpCyTWYxdA+uvRdfi1BFoV43UdZ
Kis3SANV3mZbJV9fKXcfwolpSZxE6UWcURgd00Z3L1oaGbkyAvtgBhgOKfZ3WBUB
++0aHQztbJSeClD66ML1r6pZzgg4urowDohJme6yGPpt0hJjKEf75PCG0lyBQ/A=
=7zN6
-----END PGP SIGNATURE-----
diff mbox

Patch

2011-04-01  Tom de Vries  <tom@codesourcery.com>

	PR target/43920
	* function.c (emit_use_return_register_into_block): New function.
	(thread_prologue_and_epilogue_insns): Use
	emit_use_return_register_into_block.

Index: gcc/function.c
===================================================================
--- gcc/function.c	(revision 170556)
+++ gcc/function.c	(working copy)
@@ -5241,6 +5241,19 @@  prologue_epilogue_contains (const_rtx in
   return 0;
 }
 
+/* Insert use of return register before the end of BB.  */
+
+static void
+emit_use_return_register_into_block (basic_block bb)
+{
+  rtx seq;
+  start_sequence ();
+  use_return_register ();
+  seq = get_insns ();
+  end_sequence ();
+  emit_insn_before (seq, BB_END (bb));
+}
+
 #ifdef HAVE_return
 /* Insert gen_return at the end of block BB.  This also means updating
    block_for_insn appropriately.  */
@@ -5395,6 +5408,15 @@  thread_prologue_and_epilogue_insns (void
 		 with a simple return instruction.  */
 	      if (simplejump_p (jump))
 		{
+		  /* The use of the return register might be present in the exit
+		     fallthru block.  Either:
+		     - removing the use is safe, and we should remove the use in
+		       the exit fallthru block, or
+		     - removing the use is not safe, and we should add it here.
+		     For now, we conservatively choose the latter.  Either of the
+		     2 helps in crossjumping.  */
+		  emit_use_return_register_into_block (bb);
+
 		  emit_return_into_block (bb);
 		  delete_insn (jump);
 		}
@@ -5409,6 +5431,9 @@  thread_prologue_and_epilogue_insns (void
 		      continue;
 		    }
 
+                  /* See comment in simple_jump_p case above.  */
+		  emit_use_return_register_into_block (bb);
+
 		  /* If this block has only one successor, it both jumps
 		     and falls through to the fallthru block, so we can't
 		     delete the edge.  */