flow.c (redirect_edge_and_branch): Bail out on complex edges.
authorRichard Henderson <rth@cygnus.com>
Wed, 18 Jul 2001 17:11:11 +0000 (10:11 -0700)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 18 Jul 2001 17:11:11 +0000 (17:11 +0000)
* flow.c (redirect_edge_and_branch): Bail out on complex edges.
(try_optimize_cfg): Do not remove tail recursive labels before sibcall.
* jump.c (mark_jump_label): Do not forward branches.

Co-Authored-By: Jan Hubicka <jh@suse.cz>
From-SVN: r44118

gcc/ChangeLog
gcc/flow.c
gcc/jump.c

index 066b41200d8bd1e4d4d1df4b156842374f5a40dc..e045d18fe6800ec07f564cda5052fefcd96cf858 100644 (file)
@@ -1,3 +1,10 @@
+Wed Jul 18 18:46:30 CEST 2001  Richard Henderson <rth@cygnus.com>
+                              Jan Hubicka  <jh@suse.cz>
+
+       * flow.c (redirect_edge_and_branch): Bail out on complex edges.
+       (try_optimize_cfg): Do not remove tail recursive labels before sibcall.
+       * jump.c (mark_jump_label): Do not forward branches.
+
 Wed Jul 18 18:35:01 CEST 2001  Jan Hubicka  <jh@suse.cz>
 
        * cse.c (delete_trivially_dead_insns): Delete the libcall block
index 6e6c2b61d0b965564b136eb81296772be37d44fc..06a10401f79119d532ccfe5a960fae101d9703af 100644 (file)
@@ -1777,6 +1777,9 @@ redirect_edge_and_branch (e, target)
   basic_block src = e->src;
   rtx insn = src->end;
 
+  if (e->flags & EDGE_COMPLEX)
+    return false;
+
   if (try_redirect_by_replacing_jump (e, target))
     return true;
   /* Do this fast path late, as we want above code to simplify for cases
@@ -3683,30 +3686,15 @@ try_optimize_cfg (mode)
              changed = 1;
              b = c;
            }
-         /* The fallthru forwarder block can be deleted.  */
-         if (b->pred->pred_next == NULL
-             && forwarder_block_p (b)
-             && n_basic_blocks > 1
-             && (b->pred->flags & EDGE_FALLTHRU)
-             && (b->succ->flags & EDGE_FALLTHRU))
-           {
-             if (rtl_dump_file)
-               fprintf (rtl_dump_file, "Deleting fallthru block %i.\n",
-                        b->index);
-             c = BASIC_BLOCK (i ? i - 1 : i + 1);
-             redirect_edge_succ (b->pred, b->succ->dest);
-             flow_delete_block (b);
-             changed = 1;
-             b = c;
-           }
-
          /* Remove code labels no longer used.  
             Don't do the optimization before sibling calls are discovered,
             as some branches may be hidden inside CALL_PLACEHOLDERs.  */
-         if (!(mode & CLEANUP_PRE_SIBCALL)
-             && b->pred->pred_next == NULL
+         if (b->pred->pred_next == NULL
              && (b->pred->flags & EDGE_FALLTHRU)
+             && !(b->pred->flags & EDGE_COMPLEX)
              && GET_CODE (b->head) == CODE_LABEL
+             && (!(mode & CLEANUP_PRE_SIBCALL)
+                 || !tail_recursion_label_p (b->head))
              /* If previous block does end with condjump jumping to next BB,
                 we can't delete the label.  */
              && (b->pred->src == ENTRY_BLOCK_PTR
@@ -3719,12 +3707,31 @@ try_optimize_cfg (mode)
                fprintf (rtl_dump_file, "Deleted label in block %i.\n",
                         b->index);
            }
+         /* The fallthru forwarder block can be deleted.  */
+         if (b->pred->pred_next == NULL
+             && forwarder_block_p (b)
+             && n_basic_blocks > 1
+             && (b->pred->flags & EDGE_FALLTHRU)
+             && (b->succ->flags & EDGE_FALLTHRU)
+             && GET_CODE (b->head) != CODE_LABEL)
+           {
+             if (rtl_dump_file)
+               fprintf (rtl_dump_file, "Deleting fallthru block %i.\n",
+                        b->index);
+             c = BASIC_BLOCK (i ? i - 1 : i + 1);
+             redirect_edge_succ (b->pred, b->succ->dest);
+             flow_delete_block (b);
+             changed = 1;
+             b = c;
+           }
+
 
          /* A loop because chains of blocks might be combineable.  */
          while ((s = b->succ) != NULL
                 && s->succ_next == NULL
                 && (s->flags & EDGE_EH) == 0
                 && (c = s->dest) != EXIT_BLOCK_PTR
+                && !(s->flags & EDGE_COMPLEX)
                 && c->pred->pred_next == NULL
                 /* If the jump insn has side effects,
                    we can't kill the edge.  */
index 20e0bc783c82d1f5f460fb5a47ab1030523ae7ad..afc37f9b8b4f5c7db03b3708ebc808038e98ac12 100644 (file)
@@ -1999,8 +1999,6 @@ mark_jump_label (x, insn, in_mem)
     case LABEL_REF:
       {
        rtx label = XEXP (x, 0);
-       rtx olabel = label;
-       rtx next;
 
        /* Ignore remaining references to unreachable labels that
           have been deleted.  */
@@ -2015,23 +2013,6 @@ mark_jump_label (x, insn, in_mem)
        if (LABEL_REF_NONLOCAL_P (x))
          break;
 
-       /* If there are other labels following this one,
-          replace it with the last of the consecutive labels.  */
-       for (next = NEXT_INSN (label); next; next = NEXT_INSN (next))
-         {
-           if (GET_CODE (next) == CODE_LABEL)
-             label = next;
-           else if (GET_CODE (next) != NOTE)
-             break;
-           else if ((NOTE_LINE_NUMBER (next) == NOTE_INSN_LOOP_BEG
-                     || NOTE_LINE_NUMBER (next) == NOTE_INSN_FUNCTION_END
-                     /* ??? Optional.  Disables some optimizations, but
-                        makes gcov output more accurate with -O.  */
-                     || (flag_test_coverage
-                         && NOTE_LINE_NUMBER (next) > 0)))
-             break;
-         }
-
        XEXP (x, 0) = label;
        if (! insn || ! INSN_DELETED_P (insn))
          ++LABEL_NUSES (label);
@@ -2042,27 +2023,6 @@ mark_jump_label (x, insn, in_mem)
              JUMP_LABEL (insn) = label;
            else
              {
-               /* If we've changed the label, update notes accordingly.  */
-               if (label != olabel)
-                 {
-                   rtx note;
-
-                   /* We may have a REG_LABEL note to indicate that this
-                      instruction uses the label.  */
-                   note = find_reg_note (insn, REG_LABEL, olabel);
-                   if (note)
-                     XEXP (note, 0) = label;
-
-                   /* We may also have a REG_EQUAL note to indicate that
-                      a register is being set to the address of the
-                      label.  */
-                   note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
-                   if (note 
-                       && GET_CODE (XEXP (note, 0)) == LABEL_REF
-                       && XEXP (XEXP (note, 0), 0) == olabel)
-                     XEXP (XEXP (note, 0), 0) = label;
-                 }
-
                /* Add a REG_LABEL note for LABEL unless there already
                   is one.  All uses of a label, except for labels
                   that are the targets of jumps, must have a