aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfganal.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2004-02-06 18:31:33 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2004-02-06 18:31:33 +0000
commit1a6dd8a2b8b9817d852588708a90d30618c02903 (patch)
tree0a45d5a5c934f17bee1657e72f74c8d4cdc93901 /gcc/cfganal.c
parent1711adc261965d9e88dc92fb3b16829a90145d01 (diff)
downloadgcc-1a6dd8a2b8b9817d852588708a90d30618c02903.zip
gcc-1a6dd8a2b8b9817d852588708a90d30618c02903.tar.gz
gcc-1a6dd8a2b8b9817d852588708a90d30618c02903.tar.bz2
* cfganal.c (flow_call_edges_add): Never split a libcall block.
From-SVN: r77410
Diffstat (limited to 'gcc/cfganal.c')
-rw-r--r--gcc/cfganal.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cfganal.c b/gcc/cfganal.c
index 91297e5..aa3965c 100644
--- a/gcc/cfganal.c
+++ b/gcc/cfganal.c
@@ -333,6 +333,7 @@ flow_call_edges_add (sbitmap blocks)
for (i = 0; i < last_bb; i++)
{
basic_block bb = BASIC_BLOCK (i);
+ rtx libcall_end = NULL_RTX;
rtx insn;
rtx prev_insn;
@@ -350,9 +351,13 @@ flow_call_edges_add (sbitmap blocks)
edge e;
rtx split_at_insn = insn;
+ /* Don't split libcalls. */
+ if (libcall_end)
+ split_at_insn = libcall_end;
+
/* Don't split the block between a call and an insn that should
remain in the same block as the call. */
- if (GET_CODE (insn) == CALL_INSN)
+ else if (GET_CODE (insn) == CALL_INSN)
while (split_at_insn != BB_END (bb)
&& keep_with_call_p (NEXT_INSN (split_at_insn)))
split_at_insn = NEXT_INSN (split_at_insn);
@@ -381,6 +386,14 @@ flow_call_edges_add (sbitmap blocks)
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
}
+ /* Watch out for REG_LIBCALL/REG_RETVAL notes so that we know
+ whether we are currently in a libcall or not. Remember that
+ we are scanning backwards! */
+ if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
+ libcall_end = insn;
+ if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
+ libcall_end = NULL_RTX;
+
if (insn == BB_HEAD (bb))
break;
}