]> gcc.gnu.org Git - gcc.git/commitdiff
basic-block.h (EDGE_SIBCALL): New.
authorRichard Henderson <rth@redhat.com>
Sat, 7 Jun 2003 21:30:49 +0000 (14:30 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 7 Jun 2003 21:30:49 +0000 (14:30 -0700)
        * basic-block.h (EDGE_SIBCALL): New.
        (EDGE_ALL_FLAGS): Update.
        * cfg.c (dump_edge_info): Add sibcall name.
        * cfgbuild.c (make_edges): Use EDGE_SIBCALL.
        * cfgrtl.c (purge_dead_edges): Handle sibcalls.

From-SVN: r67602

gcc/ChangeLog
gcc/basic-block.h
gcc/cfg.c
gcc/cfgbuild.c
gcc/cfgrtl.c

index 10efafa97303f1e04cc26932eb467cb044d467ac..14a02eade2591a22ef9f7939ddee9e3b2c45ed61 100644 (file)
@@ -1,3 +1,11 @@
+2003-06-07  Richard Henderson  <rth@redhat.com>
+
+       * basic-block.h (EDGE_SIBCALL): New.
+       (EDGE_ALL_FLAGS): Update.
+       * cfg.c (dump_edge_info): Add sibcall name.
+       * cfgbuild.c (make_edges): Use EDGE_SIBCALL.
+       * cfgrtl.c (purge_dead_edges): Handle sibcalls.
+
 2003-06-07  Andreas Jaeger  <aj@suse.de>
 
        * mklibgcc.in (lib2funcs): Remove _exit.
index a229367c9ec858ed3d997973208015b382584e09..4aa47dd50ba8fc415470d57fdb4b7c1e65905e64 100644 (file)
@@ -151,7 +151,8 @@ typedef struct edge_def {
 #define EDGE_CAN_FALLTHRU      64      /* Candidate for straight line
                                           flow.  */
 #define EDGE_IRREDUCIBLE_LOOP  128     /* Part of irreducible loop.  */
-#define EDGE_ALL_FLAGS         255
+#define EDGE_SIBCALL           256     /* Edge from sibcall to exit.  */
+#define EDGE_ALL_FLAGS         511
 
 #define EDGE_COMPLEX   (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
 
index 7e4aa4035dc38b84b8bca90dcaadb0eee3e820a8..93736a66bb27da316a6d77e5e789523bf021b54c 100644 (file)
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -652,8 +652,10 @@ dump_edge_info (file, e, do_succ)
 
   if (e->flags)
     {
-      static const char * const bitnames[]
-       = {"fallthru", "ab", "abcall", "eh", "fake", "dfs_back", "can_fallthru","irreducible"};
+      static const char * const bitnames[] = {
+       "fallthru", "ab", "abcall", "eh", "fake", "dfs_back",
+       "can_fallthru", "irreducible", "sibcall"
+      };
       int comma = 0;
       int i, flags = e->flags;
 
index 69fcc15294b57598243a0cb216856865f2ec6047..ed8dfb88066ee12238cc0c121168f117876c43d6 100644 (file)
@@ -406,8 +406,7 @@ make_edges (label_value_list, min, max, update_p)
         worry about EH edges, since we wouldn't have created the sibling call
         in the first place.  */
       if (code == CALL_INSN && SIBLING_CALL_P (insn))
-       cached_make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
-                  EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
+       cached_make_edge (edge_cache, bb, EXIT_BLOCK_PTR, EDGE_SIBCALL);
 
       /* If this is a CALL_INSN, then mark it as reaching the active EH
         handler for this CALL_INSN.  If we're handling non-call
index b0678f09f1cc0a0cc79d1b91aa98cfc5434601bc..21208c9763a295d57b414d5fca010359f84d3b1e 100644 (file)
@@ -2299,6 +2299,19 @@ purge_dead_edges (bb)
 
       return purged;
     }
+  else if (GET_CODE (insn) == CALL_INSN && SIBLING_CALL_P (insn))
+    {
+      /* First, there should not be any EH or ABCALL edges resulting
+        from non-local gotos and the like.  If there were, we shouldn't
+        have created the sibcall in the first place.  Second, there
+        should of course never have been a fallthru edge.  */
+      if (!bb->succ || bb->succ->succ_next)
+       abort ();
+      if (bb->succ->flags != EDGE_SIBCALL)
+       abort ();
+
+      return 0;
+    }
 
   /* If we don't see a jump insn, we don't know exactly why the block would
      have been broken at this point.  Look for a simple, non-fallthru edge,
This page took 0.096536 seconds and 5 git commands to generate.