diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2004-02-06 18:31:33 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2004-02-06 18:31:33 +0000 |
commit | 1a6dd8a2b8b9817d852588708a90d30618c02903 (patch) | |
tree | 0a45d5a5c934f17bee1657e72f74c8d4cdc93901 /gcc/cfganal.c | |
parent | 1711adc261965d9e88dc92fb3b16829a90145d01 (diff) | |
download | gcc-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.c | 15 |
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; } |