OSDN Git Service

* cfganal.c (flow_call_edges_add): Never split a libcall block.
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2004 18:31:33 +0000 (18:31 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Feb 2004 18:31:33 +0000 (18:31 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77410 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfganal.c

index f2ea897..19454ac 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-06  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * cfganal.c (flow_call_edges_add): Never split a libcall block.
+
 2004-02-06  Daniel Berlin  <dberlin@dberlin.org>
 
        * dwarf2out.c (output_loc_list): Don't use deltas if we have
index 91297e5..aa3965c 100644 (file)
@@ -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;
        }