]> gcc.gnu.org Git - gcc.git/commitdiff
jump.c (redirect_jump): Add delete_unused argument.
authorRichard Henderson <rth@gcc.gnu.org>
Fri, 19 May 2000 19:53:17 +0000 (12:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 19 May 2000 19:53:17 +0000 (12:53 -0700)
        * jump.c (redirect_jump): Add delete_unused argument.  Don't
        remove labels and code following when LABEL_NUSES goes to zero.
        (invert_jump): Likewise.
        (jump_optimize_1): Fix redirect/invert arguments.
        (do_cross_jump, thread_jumps): Likewise.
        * flow.c (split_edge): Likewise.
        * reorg.c (optimize_skip): Likewise.
        (reorg_redirect_jump, relax_delay_slots, dbr_schedule): Likewise.
        * profile.c (instrument_arcs): Likewise.
        * loop.c (find_and_verify_loops): Likewise.  Fix indentation.
        * rtl.h: Update prototypes.

From-SVN: r34033

gcc/ChangeLog
gcc/flow.c
gcc/jump.c
gcc/loop.c
gcc/profile.c
gcc/reorg.c
gcc/rtl.h

index 54e7627562f3785977518115c73cc990f8d1a394..0ba93a4ef572493898615178a19ec31b134ffa47 100644 (file)
@@ -1,3 +1,17 @@
+2000-05-19  Richard Henderson  <rth@cygnus.com>
+
+       * jump.c (redirect_jump): Add delete_unused argument.  Don't
+       remove labels and code following when LABEL_NUSES goes to zero.
+       (invert_jump): Likewise.
+       (jump_optimize_1): Fix redirect/invert arguments.
+       (do_cross_jump, thread_jumps): Likewise.
+       * flow.c (split_edge): Likewise.
+       * reorg.c (optimize_skip): Likewise.
+       (reorg_redirect_jump, relax_delay_slots, dbr_schedule): Likewise.
+       * profile.c (instrument_arcs): Likewise.
+       * loop.c (find_and_verify_loops): Likewise.  Fix indentation.
+       * rtl.h: Update prototypes.
+
 Fri May 19 12:05:13 2000  Clinton Popetz  <cpopetz@cygnus.com>
 
        * ssa.c (convert_from_ssa): Tell life_analysis we need death 
@@ -52,7 +66,7 @@ Fri May 19 06:49:35 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
 2000-05-18 Mark Elbrecht <snowball3@bigfoot.com>
 
-        * configure.in (*-pc-msdosdjgpp): Set float_format to none.
+       * configure.in (*-pc-msdosdjgpp): Set float_format to none.
        * configure: Rebuilt.
 
 2000-05-18  Zack Weinberg  <zack@wolery.cumb.org>
index e24822e8404522b71ee57fc72b166eccaac34867..e6d4bbbcbfa5f7f48a79f0d695d271059887c6c2 100644 (file)
@@ -1556,7 +1556,7 @@ split_edge (edge_in)
          if (JUMP_LABEL (insn) != old_label)
            abort ();
 
-         redirect_jump (insn, new_label);
+         redirect_jump (insn, new_label, 0);
        }
 
       emit_label_before (new_label, bb_note);
index 85bfb86a500a46f3fba59de050feb9982550bd4c..8711ba95efd3168f32f1c92a42d46be737a97cd5 100644 (file)
@@ -342,7 +342,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
          /* See if this jump goes to another jump and redirect if so.  */
          nlabel = follow_jumps (JUMP_LABEL (insn));
          if (nlabel != JUMP_LABEL (insn))
-           changed |= redirect_jump (insn, nlabel);
+           changed |= redirect_jump (insn, nlabel, 1);
 
          if (! optimize || minimal)
            continue;
@@ -444,7 +444,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
              if (prev_label)
                ++LABEL_NUSES (prev_label);
 
-             if (invert_jump (insn, JUMP_LABEL (reallabelprev)))
+             if (invert_jump (insn, JUMP_LABEL (reallabelprev), 1))
                {
                  /* It is very likely that if there are USE insns before
                     this jump, they hold REG_DEAD notes.  These REG_DEAD
@@ -507,7 +507,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
                }
 
              delete_insn (temp);
-             redirect_jump (insn, get_label_before (temp1));
+             redirect_jump (insn, get_label_before (temp1), 1);
              reallabelprev = prev_real_insn (temp1);
              changed = 1;
              next = NEXT_INSN (insn);
@@ -579,7 +579,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
                       && swap_condition (GET_CODE (temp2)) == GET_CODE (tc)
                       && rtx_equal_p (XEXP (tc, 0), XEXP (temp2, 0))
                       && rtx_equal_p (XEXP (tc, 1), XEXP (temp2, 1))
-                      && redirect_jump (insn, get_label_after (temp)))
+                      && redirect_jump (insn, get_label_after (temp), 1))
                {
                  changed = 1;
                  continue;
@@ -1629,7 +1629,7 @@ do_cross_jump (insn, newjpos, newlpos)
        }
     }
   else
-    redirect_jump (insn, label);
+    redirect_jump (insn, label, 1);
 
   /* Delete the matching insns before the jump.  Also, remove any REG_EQUAL
      or REG_EQUIV note in the NEWLPOS stream that isn't also present in
@@ -3182,8 +3182,9 @@ redirect_jump_1 (jump, nlabel)
    (this can only occur for NLABEL == 0).  */
 
 int
-redirect_jump (jump, nlabel)
+redirect_jump (jump, nlabel, delete_unused)
      rtx jump, nlabel;
+     int delete_unused;
 {
   register rtx olabel = JUMP_LABEL (jump);
 
@@ -3221,7 +3222,7 @@ redirect_jump (jump, nlabel)
       && NOTE_LINE_NUMBER (NEXT_INSN (olabel)) == NOTE_INSN_FUNCTION_END)
     emit_note_after (NOTE_INSN_FUNCTION_END, nlabel);
 
-  if (olabel && --LABEL_NUSES (olabel) == 0)
+  if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused)
     delete_insn (olabel);
 
   return 1;
@@ -3321,8 +3322,9 @@ invert_jump_1 (jump, nlabel)
    NLABEL instead of where it jumps now.  Return true if successful.  */
 
 int
-invert_jump (jump, nlabel)
+invert_jump (jump, nlabel, delete_unused)
      rtx jump, nlabel;
+     int delete_unused;
 {
   /* We have to either invert the condition and change the label or
      do neither.  Either operation could fail.  We first try to invert
@@ -3332,7 +3334,7 @@ invert_jump (jump, nlabel)
   if (! invert_exp (PATTERN (jump), jump))
     return 0;
 
-  if (redirect_jump (jump, nlabel))
+  if (redirect_jump (jump, nlabel, delete_unused))
     {
       /* An inverted jump means that a probability taken becomes a
         probability not taken.  Subtract the branch probability from the
@@ -3911,7 +3913,7 @@ thread_jumps (f, max_reg, flag_before_loop)
                              new_label = gen_label_rtx ();
                              emit_label_after (new_label, PREV_INSN (prev));
                            }
-                         changed |= redirect_jump (b1, new_label);
+                         changed |= redirect_jump (b1, new_label, 1);
                        }
                      break;
                    }
index 70c307ab82cbbbd74596c30ae9a30b78c64cf904..a8e71b715452770f652b4b7e0d850b3e4422a168 100644 (file)
@@ -2865,86 +2865,86 @@ find_and_verify_loops (f, loops)
 
                    /* Verify that uid_loop is large enough and that
                       we can invert P.  */
-                  if (invert_jump (p, new_label))
-                    {
-                      rtx q, r;
-
-                      /* If no suitable BARRIER was found, create a suitable
-                         one before TARGET.  Since TARGET is a fall through
-                         path, we'll need to insert an jump around our block
-                         and a add a BARRIER before TARGET.
-
-                         This creates an extra unconditional jump outside
-                         the loop.  However, the benefits of removing rarely
-                         executed instructions from inside the loop usually
-                         outweighs the cost of the extra unconditional jump
-                         outside the loop.  */
-                      if (loc == 0)
-                        {
-                          rtx temp;
-
-                          temp = gen_jump (JUMP_LABEL (insn));
-                          temp = emit_jump_insn_before (temp, target);
-                          JUMP_LABEL (temp) = JUMP_LABEL (insn);
-                          LABEL_NUSES (JUMP_LABEL (insn))++;
-                          loc = emit_barrier_before (target);
-                        }
-
-                      /* Include the BARRIER after INSN and copy the
-                         block after LOC.  */
-                      new_label = squeeze_notes (new_label, 
-                                                 last_insn_to_move);
-                      reorder_insns (new_label, last_insn_to_move, loc);
-
-                      /* All those insns are now in TARGET_LOOP.  */
-                      for (q = new_label; 
-                           q != NEXT_INSN (last_insn_to_move);
-                           q = NEXT_INSN (q))
-                        uid_loop[INSN_UID (q)] = target_loop;
-
-                      /* The label jumped to by INSN is no longer a loop exit.
-                         Unless INSN does not have a label (e.g., it is a
-                         RETURN insn), search loop->exit_labels to find
-                         its label_ref, and remove it.  Also turn off
-                         LABEL_OUTSIDE_LOOP_P bit.  */
-                      if (JUMP_LABEL (insn))
-                        {
-                          for (q = 0,
-                               r = this_loop->exit_labels;
-                               r; q = r, r = LABEL_NEXTREF (r))
-                            if (XEXP (r, 0) == JUMP_LABEL (insn))
-                              {
-                                LABEL_OUTSIDE_LOOP_P (r) = 0;
-                                if (q)
-                                  LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
-                                else
-                                  this_loop->exit_labels = LABEL_NEXTREF (r);
-                                break;
-                              }
-
-                          for (loop = this_loop; loop && loop != target_loop;
-                               loop = loop->outer)
-                            loop->exit_count--;
-
-                          /* If we didn't find it, then something is
-                              wrong.  */
-                          if (! r)
-                            abort ();
-                        }
-
-                      /* P is now a jump outside the loop, so it must be put
-                         in loop->exit_labels, and marked as such.
-                         The easiest way to do this is to just call
-                         mark_loop_jump again for P.  */
-                      mark_loop_jump (PATTERN (p), this_loop);
-
-                      /* If INSN now jumps to the insn after it,
-                         delete INSN.  */
-                      if (JUMP_LABEL (insn) != 0
-                          && (next_real_insn (JUMP_LABEL (insn))
-                              == next_real_insn (insn)))
-                        delete_insn (insn);
-                    }
+                   if (invert_jump (p, new_label, 1))
+                     {
+                       rtx q, r;
+
+                       /* If no suitable BARRIER was found, create a suitable
+                          one before TARGET.  Since TARGET is a fall through
+                          path, we'll need to insert an jump around our block
+                          and a add a BARRIER before TARGET.
+
+                          This creates an extra unconditional jump outside
+                          the loop.  However, the benefits of removing rarely
+                          executed instructions from inside the loop usually
+                          outweighs the cost of the extra unconditional jump
+                          outside the loop.  */
+                       if (loc == 0)
+                         {
+                           rtx temp;
+
+                           temp = gen_jump (JUMP_LABEL (insn));
+                           temp = emit_jump_insn_before (temp, target);
+                           JUMP_LABEL (temp) = JUMP_LABEL (insn);
+                           LABEL_NUSES (JUMP_LABEL (insn))++;
+                           loc = emit_barrier_before (target);
+                         }
+
+                       /* Include the BARRIER after INSN and copy the
+                          block after LOC.  */
+                       new_label = squeeze_notes (new_label, 
+                                                  last_insn_to_move);
+                       reorder_insns (new_label, last_insn_to_move, loc);
+
+                       /* All those insns are now in TARGET_LOOP.  */
+                       for (q = new_label; 
+                            q != NEXT_INSN (last_insn_to_move);
+                            q = NEXT_INSN (q))
+                         uid_loop[INSN_UID (q)] = target_loop;
+
+                       /* The label jumped to by INSN is no longer a loop
+                          exit.  Unless INSN does not have a label (e.g.,
+                          it is a RETURN insn), search loop->exit_labels
+                          to find its label_ref, and remove it.  Also turn
+                          off LABEL_OUTSIDE_LOOP_P bit.  */
+                       if (JUMP_LABEL (insn))
+                         {
+                           for (q = 0,
+                                  r = this_loop->exit_labels;
+                                r; q = r, r = LABEL_NEXTREF (r))
+                             if (XEXP (r, 0) == JUMP_LABEL (insn))
+                               {
+                                 LABEL_OUTSIDE_LOOP_P (r) = 0;
+                                 if (q)
+                                   LABEL_NEXTREF (q) = LABEL_NEXTREF (r);
+                                 else
+                                   this_loop->exit_labels = LABEL_NEXTREF (r);
+                                 break;
+                               }
+
+                           for (loop = this_loop; loop && loop != target_loop;
+                                loop = loop->outer)
+                             loop->exit_count--;
+
+                           /* If we didn't find it, then something is
+                              wrong.  */
+                           if (! r)
+                             abort ();
+                         }
+
+                       /* P is now a jump outside the loop, so it must be put
+                          in loop->exit_labels, and marked as such.
+                          The easiest way to do this is to just call
+                          mark_loop_jump again for P.  */
+                       mark_loop_jump (PATTERN (p), this_loop);
+
+                       /* If INSN now jumps to the insn after it,
+                          delete INSN.  */
+                       if (JUMP_LABEL (insn) != 0
+                           && (next_real_insn (JUMP_LABEL (insn))
+                               == next_real_insn (insn)))
+                         delete_insn (insn);
+                     }
 
                    /* Continue the loop after where the conditional
                       branch used to jump, since the only branch insn
index d8e2d62e62a8ad8b177275a2d66d0ea18f87a046..69ac575168d9b5cbfab965c026d0bd16f07eec4c 100644 (file)
@@ -293,14 +293,14 @@ instrument_arcs (f, num_blocks, dump_file)
                  if (this_is_simplejump)
                    {
                      after = NEXT_INSN (arcptr->branch_insn);
-                     if (! redirect_jump (arcptr->branch_insn, new_label))
+                     if (! redirect_jump (arcptr->branch_insn, new_label, 1))
                        /* Don't know what to do if this branch won't
                           redirect.  */
                        abort ();
                    }
                  else
                    {
-                     if (! invert_jump (arcptr->branch_insn, new_label))
+                     if (! invert_jump (arcptr->branch_insn, new_label, 1))
                        /* Don't know what to do if this branch won't invert.  */
                        abort ();
 
index cce40c0d7cf46b79d32cdd6c4ff6a2bf1bdbced0..e5c58873aa25bc463263164e8c859f3068929d22 100644 (file)
@@ -733,7 +733,7 @@ optimize_skip (insn)
     {
       if (eligible_for_annul_false (insn, 0, trial, flags))
        {
-         if (invert_jump (insn, JUMP_LABEL (insn)))
+         if (invert_jump (insn, JUMP_LABEL (insn), 1))
            INSN_FROM_TARGET_P (trial) = 1;
          else if (! eligible_for_annul_true (insn, 0, trial, flags))
            return 0;
@@ -1888,7 +1888,7 @@ reorg_redirect_jump (jump, nlabel)
      rtx nlabel;
 {
   incr_ticks_for_insn (jump);
-  return redirect_jump (jump, nlabel);
+  return redirect_jump (jump, nlabel, 1);
 }
 
 /* Called when INSN is being moved forward into a delay slot of DELAYED_INSN.
@@ -3087,7 +3087,7 @@ relax_delay_slots (first)
              if (label)
                ++LABEL_NUSES (label);
 
-             if (invert_jump (insn, label))
+             if (invert_jump (insn, label, 1))
                {
                  delete_insn (next);
                  next = insn;
@@ -3123,16 +3123,8 @@ relax_delay_slots (first)
          rtx other_target = JUMP_LABEL (other);
          target_label = JUMP_LABEL (insn);
 
-         /* Increment the count of OTHER_TARGET, so it doesn't get deleted
-            as we move the label.  */
-         if (other_target)
-           ++LABEL_NUSES (other_target);
-
-         if (invert_jump (other, target_label))
+         if (invert_jump (other, target_label, 0))
            reorg_redirect_jump (insn, other_target);
-
-         if (other_target)
-           --LABEL_NUSES (other_target);
        }
 
       /* Now look only at cases where we have filled a delay slot.  */
@@ -3338,7 +3330,7 @@ relax_delay_slots (first)
              if (old_label)
                ++LABEL_NUSES (old_label);
 
-             if (invert_jump (delay_insn, label))
+             if (invert_jump (delay_insn, label, 1))
                {
                  int i;
 
@@ -3570,7 +3562,7 @@ dbr_schedule (first, file)
          && JUMP_LABEL (insn) != 0
          && ((target = prev_label (next_active_insn (JUMP_LABEL (insn))))
              != JUMP_LABEL (insn)))
-       redirect_jump (insn, target);
+       redirect_jump (insn, target, 1);
     }
 
   init_resource_info (epilogue_insn);
index 4ab7407f335d013c9edad762c44358132979ee82..de088179e521f7b4b28f859c2df251baa7638bbc 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1522,11 +1522,11 @@ extern int returnjump_p                 PARAMS ((rtx));
 extern int onlyjump_p                  PARAMS ((rtx));
 extern int sets_cc0_p                  PARAMS ((rtx));
 extern int invert_jump_1               PARAMS ((rtx, rtx));
-extern int invert_jump                 PARAMS ((rtx, rtx));
+extern int invert_jump                 PARAMS ((rtx, rtx, int));
 extern int rtx_renumbered_equal_p      PARAMS ((rtx, rtx));
 extern int true_regnum                 PARAMS ((rtx));
 extern int redirect_jump_1             PARAMS ((rtx, rtx));
-extern int redirect_jump               PARAMS ((rtx, rtx));
+extern int redirect_jump               PARAMS ((rtx, rtx, int));
 extern void jump_optimize              PARAMS ((rtx, int, int, int));
 extern void jump_optimize_minimal      PARAMS ((rtx));
 extern void rebuild_jump_labels                PARAMS ((rtx));
This page took 0.118694 seconds and 5 git commands to generate.