jump.c (next_nonnote_insn_in_loop): New function.
authorJosef Zlomek <zlomekj@suse.cz>
Fri, 10 Jan 2003 13:44:28 +0000 (14:44 +0100)
committerJosef Zlomek <zlomek@gcc.gnu.org>
Fri, 10 Jan 2003 13:44:28 +0000 (13:44 +0000)
* jump.c (next_nonnote_insn_in_loop): New function.
(copy_loop_headers): Use next_nonnote_insn_in_loop instead of
next_nonnote_insn.
(duplicate_loop_exit_test). Likewise.

From-SVN: r61150

gcc/ChangeLog
gcc/jump.c

index 2e2e1b2ac32b81e4e2f04b8fbf1c4ef00d6d9f21..799f9baadbca65960ff51253b6e116e3c6fa4c92 100644 (file)
@@ -1,3 +1,10 @@
+2003-01-10  Josef Zlomek  <zlomekj@suse.cz>
+
+       * jump.c (next_nonnote_insn_in_loop): New function.
+       (copy_loop_headers): Use next_nonnote_insn_in_loop instead of
+       next_nonnote_insn.
+       (duplicate_loop_exit_test). Likewise.
+
 2003-01-09  Geoffrey Keating  <geoffk@apple.com>
 
        Merge from pch-branch:
index 2476a32eb9dbb102a055ee1af9a78baa43c7ab70..2e9119b46535916c16c37609f75cd5bba1fed454 100644 (file)
@@ -1,6 +1,6 @@
 /* Optimize jump instructions, for GNU compiler.
    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
-   1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -61,6 +61,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    or even change what is live at any point.
    So perhaps let combiner do it.  */
 
+static rtx next_nonnote_insn_in_loop   PARAMS ((rtx));
 static void init_label_info            PARAMS ((rtx));
 static void mark_all_labels            PARAMS ((rtx));
 static int duplicate_loop_exit_test    PARAMS ((rtx));
@@ -119,6 +120,27 @@ cleanup_barriers ()
     }
 }
 \f
+/* Return the next insn after INSN that is not a NOTE and is in the loop,
+   i.e. when there is no such INSN before NOTE_INSN_LOOP_END return NULL_RTX.
+   This routine does not look inside SEQUENCEs.  */
+
+static rtx
+next_nonnote_insn_in_loop (insn)
+     rtx insn;
+{
+  while (insn)
+    {
+      insn = NEXT_INSN (insn);
+      if (insn == 0 || GET_CODE (insn) != NOTE)
+       break;
+      if (GET_CODE (insn) == NOTE
+         && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
+       return NULL_RTX;
+    }
+
+  return insn;
+}
+
 void
 copy_loop_headers (f)
      rtx f;
@@ -137,7 +159,7 @@ copy_loop_headers (f)
         the values of regno_first_uid and regno_last_uid.  */
       if (GET_CODE (insn) == NOTE
          && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
-         && (temp1 = next_nonnote_insn (insn)) != 0
+         && (temp1 = next_nonnote_insn_in_loop (insn)) != 0
          && any_uncondjump_p (temp1) && onlyjump_p (temp1))
        {
          temp = PREV_INSN (insn);
@@ -286,7 +308,8 @@ duplicate_loop_exit_test (loop_start)
   rtx insn, set, reg, p, link;
   rtx copy = 0, first_copy = 0;
   int num_insns = 0;
-  rtx exitcode = NEXT_INSN (JUMP_LABEL (next_nonnote_insn (loop_start)));
+  rtx exitcode
+    = NEXT_INSN (JUMP_LABEL (next_nonnote_insn_in_loop (loop_start)));
   rtx lastexit;
   int max_reg = max_reg_num ();
   rtx *reg_map = 0;