diff options
author | Tom de Vries <tom@codesourcery.com> | 2011-04-05 10:12:14 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2011-04-05 10:12:14 +0000 |
commit | 4c029f40bd39f49cb2748fb685d18e5dc97c90a6 (patch) | |
tree | 90745af363780920b5090d26d5fc5631ea679e96 /gcc/function.c | |
parent | 2a562b0ab31fe77a48dcaca05d2e6d31c29bbeab (diff) | |
download | gcc-4c029f40bd39f49cb2748fb685d18e5dc97c90a6.zip gcc-4c029f40bd39f49cb2748fb685d18e5dc97c90a6.tar.gz gcc-4c029f40bd39f49cb2748fb685d18e5dc97c90a6.tar.bz2 |
re PR target/43920 (Choosing conditional execution over conditional branches for code size in some cases.)
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c index a1ea482..7c500a6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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. */ |