* emit-rtl.c (find_auto_inc): New.
authorzippel <zippel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Mar 2007 00:56:51 +0000 (00:56 +0000)
committerzippel <zippel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Mar 2007 00:56:51 +0000 (00:56 +0000)
(try_split): recreate REG_INC notes,
Use regular for loops rather than whiles.

* gcc.target/m68k/m68k.exp: New.
* gcc.target/m68k/crash1.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122520 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/emit-rtl.c
gcc/testsuite/ChangeLog

index f055676..2c9edd2 100644 (file)
@@ -1,3 +1,10 @@
+2007-03-04  Roman Zippel <zippel@linux-m68k.org>
+            Nathan Sidwell  <nathan@codesourcery.com>
+
+       * emit-rtl.c (find_auto_inc): New.
+       (try_split): recreate REG_INC notes,
+       Use regular for loops rather than whiles.
+
 2007-03-03  Andreas Schwab  <schwab@suse.de>
 
        * configure.ac (HAVE_AS_REL16): Move test back to correct place.
index 9a5db43..ebe0a52 100644 (file)
@@ -3077,6 +3077,37 @@ prev_cc0_setter (rtx insn)
 }
 #endif
 
+#ifdef AUTO_INC_DEC
+/* Find a RTX_AUTOINC class rtx which matches DATA.  */
+
+static int
+find_auto_inc (rtx *xp, void *data)
+{
+  rtx x = *xp;
+  rtx reg = data;
+
+  if (GET_RTX_CLASS (GET_CODE (x)) != RTX_AUTOINC)
+    return 0;
+
+  switch (GET_CODE (x))
+    {
+      case PRE_DEC:
+      case PRE_INC:
+      case POST_DEC:
+      case POST_INC:
+      case PRE_MODIFY:
+      case POST_MODIFY:
+       if (rtx_equal_p (reg, XEXP (x, 0)))
+         return 1;
+       break;
+
+      default:
+       gcc_unreachable ();
+    }
+  return -1;
+}
+#endif
+
 /* Increment the label uses for all labels present in rtx.  */
 
 static void
@@ -3201,8 +3232,7 @@ try_split (rtx pat, rtx trial, int last)
       switch (REG_NOTE_KIND (note))
        {
        case REG_EH_REGION:
-         insn = insn_last;
-         while (insn != NULL_RTX)
+         for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
            {
              if (CALL_P (insn)
                  || (flag_non_call_exceptions && INSN_P (insn)
@@ -3211,37 +3241,45 @@ try_split (rtx pat, rtx trial, int last)
                  = gen_rtx_EXPR_LIST (REG_EH_REGION,
                                       XEXP (note, 0),
                                       REG_NOTES (insn));
-             insn = PREV_INSN (insn);
            }
          break;
 
        case REG_NORETURN:
        case REG_SETJMP:
-         insn = insn_last;
-         while (insn != NULL_RTX)
+         for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
            {
              if (CALL_P (insn))
                REG_NOTES (insn)
                  = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
                                       XEXP (note, 0),
                                       REG_NOTES (insn));
-             insn = PREV_INSN (insn);
            }
          break;
 
        case REG_NON_LOCAL_GOTO:
-         insn = insn_last;
-         while (insn != NULL_RTX)
+         for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
            {
              if (JUMP_P (insn))
                REG_NOTES (insn)
                  = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
                                       XEXP (note, 0),
                                       REG_NOTES (insn));
-             insn = PREV_INSN (insn);
            }
          break;
 
+#ifdef AUTO_INC_DEC
+       case REG_INC:
+         for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
+           {
+             rtx reg = XEXP (note, 0);
+             if (!FIND_REG_INC_NOTE (insn, reg)
+                 && for_each_rtx (&PATTERN (insn), find_auto_inc, reg) > 0)
+               REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_INC, reg,
+                                                     REG_NOTES (insn));
+           }
+         break;
+#endif
+
        default:
          break;
        }
index 0483473..097016d 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-04  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * gcc.target/m68k/m68k.exp: New.
+       * gcc.target/m68k/crash1.c: New.
+
 2007-03-03  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/c_by_val.c: Use int64_t instead of long