re PR target/43920 (Choosing conditional execution over conditional branches for...
authorTom de Vries <tom@codesourcery.com>
Tue, 5 Apr 2011 10:12:14 +0000 (10:12 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 5 Apr 2011 10:12:14 +0000 (10:12 +0000)
2011-04-05  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.

From-SVN: r171977

gcc/ChangeLog
gcc/function.c

index 6cde480..15e1b86 100644 (file)
@@ -1,6 +1,13 @@
 2011-04-05  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.
+
+2011-04-05  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/43920
        * cfgcleanup.c (flow_find_cross_jump): Don't count USE or CLOBBER as
        insn.
 
index a1ea482..7c500a6 100644 (file)
@@ -5262,6 +5262,19 @@ prologue_epilogue_contains (const_rtx insn)
   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.  */
@@ -5416,6 +5429,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);
                }
@@ -5430,6 +5452,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.  */