cse.c (cse_insn): Fix loop which deletes insns after a jump that has become an uncond...
authorJeffrey A Law <law@cygnus.com>
Mon, 2 Aug 1999 05:53:02 +0000 (05:53 +0000)
committerJeff Law <law@gcc.gnu.org>
Mon, 2 Aug 1999 05:53:02 +0000 (23:53 -0600)
        * cse.c (cse_insn): Fix loop which deletes insns after a jump
        that has become an unconditional jump.

From-SVN: r28388

gcc/ChangeLog
gcc/cse.c

index ba8058f9647ffe66e2174d7afbe09a679fa528ef..e7b655248178f419240789c6846967fcf366e4c0 100644 (file)
@@ -1,5 +1,8 @@
 Sun Aug  1 22:46:42 1999  Jeffrey A Law  (law@cygnus.com)
 
+       * cse.c (cse_insn): Fix loop which deletes insns after a jump
+       that has become an unconditional jump.
+
        * m68k.c (output_function_prologue): Fix typo in CPU32 case.
        (output_function_epilogue): Similarly.
 
index edd434b5395d2b2e4b6eca1f4ad4a52d90f6ac77..2e89d0e99247b599c8abf71eb6d5645b5017bf92 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -7424,9 +7424,12 @@ cse_insn (insn, libcall_insn)
                 && GET_CODE (NEXT_INSN (p)) != BARRIER
                 && GET_CODE (NEXT_INSN (p)) != CODE_LABEL)
            {
+             /* Note, we must update P with the return value from
+                delete_insn, otherwise we could get an infinite loop
+                if NEXT_INSN (p) had INSN_DELETED_P set.  */
              if (GET_CODE (NEXT_INSN (p)) != NOTE
                  || NOTE_LINE_NUMBER (NEXT_INSN (p)) == NOTE_INSN_DELETED)
-               delete_insn (NEXT_INSN (p));
+               p = delete_insn (NEXT_INSN (p));
              else
                p = NEXT_INSN (p);
            }