OSDN Git Service

PR debug/45055
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 30 Jul 2010 14:36:56 +0000 (14:36 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 30 Jul 2010 14:36:56 +0000 (14:36 +0000)
PR rtl-optimization/45137
* rtl.h (prev_nonnote_nondebug_insn, next_nonnote_nondebug_insn): New
prototypes.
* emit-rtl.c (prev_nonnote_nondebug_insn, next_nonnote_nondebug_insn):
New functions.
* combine.c (next_nonnote_nondebug_insn): Removed.
* ifcvt.c (noce_process_if_block): Use prev_nonnote_nondebug_insn.
* haifa-sched.c (queue_to_ready): Use next_nonnote_nondebug_insn.
* sched-deps.c (sched_analyze_insn): Likewise.
(fixup_sched_groups, deps_start_bb): Use prev_nonnote_nondebug_insn.
* rtlanal.c (canonicalize_condition): Likewise.
* postreload.c (reload_combine_recognize_pattern): Likewise.
(reload_cse_move2add): Use next_nonnote_nondebug_insn.

* gcc.dg/pr45055.c: New test.

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

gcc/ChangeLog
gcc/combine.c
gcc/emit-rtl.c
gcc/haifa-sched.c
gcc/ifcvt.c
gcc/postreload.c
gcc/rtl.h
gcc/rtlanal.c
gcc/sched-deps.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr45055.c [new file with mode: 0644]

index f8d5da5..c94bf56 100644 (file)
@@ -1,3 +1,20 @@
+2010-07-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/45055
+       PR rtl-optimization/45137
+       * rtl.h (prev_nonnote_nondebug_insn, next_nonnote_nondebug_insn): New
+       prototypes.
+       * emit-rtl.c (prev_nonnote_nondebug_insn, next_nonnote_nondebug_insn):
+       New functions.
+       * combine.c (next_nonnote_nondebug_insn): Removed.
+       * ifcvt.c (noce_process_if_block): Use prev_nonnote_nondebug_insn.
+       * haifa-sched.c (queue_to_ready): Use next_nonnote_nondebug_insn.
+       * sched-deps.c (sched_analyze_insn): Likewise.
+       (fixup_sched_groups, deps_start_bb): Use prev_nonnote_nondebug_insn.
+       * rtlanal.c (canonicalize_condition): Likewise.
+       * postreload.c (reload_combine_recognize_pattern): Likewise.
+       (reload_cse_move2add): Use next_nonnote_nondebug_insn.
+
 2010-07-29  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (int_cond): Remove code iterator.
index 9754b08..1991f34 100644 (file)
@@ -12654,29 +12654,6 @@ reg_bitfield_target_p (rtx x, rtx body)
 
   return 0;
 }
-
-/* Return the next insn after INSN that is neither a NOTE nor a
-   DEBUG_INSN.  This routine does not look inside SEQUENCEs.  */
-
-static rtx
-next_nonnote_nondebug_insn (rtx insn)
-{
-  while (insn)
-    {
-      insn = NEXT_INSN (insn);
-      if (insn == 0)
-       break;
-      if (NOTE_P (insn))
-       continue;
-      if (DEBUG_INSN_P (insn))
-       continue;
-      break;
-    }
-
-  return insn;
-}
-
-
 \f
 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
    as appropriate.  I3 and I2 are the insns resulting from the combination
index 32741dc..fe8de9b 100644 (file)
@@ -3135,6 +3135,38 @@ prev_nondebug_insn (rtx insn)
   return insn;
 }
 
+/* Return the next insn after INSN that is not a NOTE nor DEBUG_INSN.
+   This routine does not look inside SEQUENCEs.  */
+
+rtx
+next_nonnote_nondebug_insn (rtx insn)
+{
+  while (insn)
+    {
+      insn = NEXT_INSN (insn);
+      if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
+       break;
+    }
+
+  return insn;
+}
+
+/* Return the previous insn before INSN that is not a NOTE nor DEBUG_INSN.
+   This routine does not look inside SEQUENCEs.  */
+
+rtx
+prev_nonnote_nondebug_insn (rtx insn)
+{
+  while (insn)
+    {
+      insn = PREV_INSN (insn);
+      if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
+       break;
+    }
+
+  return insn;
+}
+
 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
    or 0, if there is none.  This routine does not look inside
    SEQUENCEs.  */
index f136e40..136d26a 100644 (file)
@@ -2003,13 +2003,9 @@ queue_to_ready (struct ready_list *ready)
   q_ptr = NEXT_Q (q_ptr);
 
   if (dbg_cnt (sched_insn) == false)
-    {
-      /* If debug counter is activated do not requeue insn next after
-        last_scheduled_insn.  */
-      skip_insn = next_nonnote_insn (last_scheduled_insn);
-      while (skip_insn && DEBUG_INSN_P (skip_insn))
-       skip_insn = next_nonnote_insn (skip_insn);
-    }
+    /* If debug counter is activated do not requeue insn next after
+       last_scheduled_insn.  */
+    skip_insn = next_nonnote_nondebug_insn (last_scheduled_insn);
   else
     skip_insn = NULL_RTX;
 
index 3df0c2b..c0123aa 100644 (file)
@@ -2368,9 +2368,7 @@ noce_process_if_block (struct noce_if_info *if_info)
     }
   else
     {
-      insn_b = prev_nonnote_insn (if_info->cond_earliest);
-      while (insn_b && DEBUG_INSN_P (insn_b))
-       insn_b = prev_nonnote_insn (insn_b);
+      insn_b = prev_nonnote_nondebug_insn (if_info->cond_earliest);
       /* We're going to be moving the evaluation of B down from above
         COND_EARLIEST to JUMP.  Make sure the relevant data is still
         intact.  */
index 093dce7..a0c7cc1 100644 (file)
@@ -1113,7 +1113,7 @@ reload_combine_recognize_pattern (rtx insn)
       && last_label_ruid < reg_state[regno].use_ruid)
     {
       rtx base = XEXP (src, 1);
-      rtx prev = prev_nonnote_insn (insn);
+      rtx prev = prev_nonnote_nondebug_insn (insn);
       rtx prev_set = prev ? single_set (prev) : NULL_RTX;
       rtx index_reg = NULL_RTX;
       rtx reg_sum = NULL_RTX;
@@ -1852,7 +1852,7 @@ reload_cse_move2add (rtx first)
                       && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg),
                                                 reg_mode[REGNO (src)]))
                {
-                 rtx next = next_nonnote_insn (insn);
+                 rtx next = next_nonnote_nondebug_insn (insn);
                  rtx set = NULL_RTX;
                  if (next)
                    set = single_set (next);
index 5460890..f59ca54 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1693,6 +1693,8 @@ extern rtx next_nonnote_insn (rtx);
 extern rtx next_nonnote_insn_bb (rtx);
 extern rtx prev_nondebug_insn (rtx);
 extern rtx next_nondebug_insn (rtx);
+extern rtx prev_nonnote_nondebug_insn (rtx);
+extern rtx next_nonnote_nondebug_insn (rtx);
 extern rtx prev_real_insn (rtx);
 extern rtx next_real_insn (rtx);
 extern rtx prev_active_insn (rtx);
index 3c14109..d242a9a 100644 (file)
@@ -4756,9 +4756,7 @@ canonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest,
         stop if it isn't a single set or if it has a REG_INC note because
         we don't want to bother dealing with it.  */
 
-      do
-       prev = prev_nonnote_insn (prev);
-      while (prev && DEBUG_INSN_P (prev));
+      prev = prev_nonnote_nondebug_insn (prev);
 
       if (prev == 0
          || !NONJUMP_INSN_P (prev)
index 608f724..dddf836 100644 (file)
@@ -1521,9 +1521,7 @@ fixup_sched_groups (rtx insn)
 
   delete_all_dependences (insn);
 
-  prev_nonnote = prev_nonnote_insn (insn);
-  while (DEBUG_INSN_P (prev_nonnote))
-    prev_nonnote = prev_nonnote_insn (prev_nonnote);
+  prev_nonnote = prev_nonnote_nondebug_insn (insn);
   if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote)
       && ! sched_insns_conditions_mutex_p (insn, prev_nonnote))
     add_dependence (insn, prev_nonnote, REG_DEP_ANTI);
@@ -2699,9 +2697,7 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn)
   if (JUMP_P (insn))
     {
       rtx next;
-      next = next_nonnote_insn (insn);
-      while (next && DEBUG_INSN_P (next))
-       next = next_nonnote_insn (next);
+      next = next_nonnote_nondebug_insn (insn);
       if (next && BARRIER_P (next))
        reg_pending_barrier = MOVE_BARRIER;
       else
@@ -3370,10 +3366,8 @@ deps_start_bb (struct deps_desc *deps, rtx head)
      hard registers correct.  */
   if (! reload_completed && !LABEL_P (head))
     {
-      rtx insn = prev_nonnote_insn (head);
+      rtx insn = prev_nonnote_nondebug_insn (head);
 
-      while (insn && DEBUG_INSN_P (insn))
-       insn = prev_nonnote_insn (insn);
       if (insn && CALL_P (insn))
        deps->in_post_call_group_p = post_call_initial;
     }
index 66a08b3..2fded2a 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/45055
+       PR rtl-optimization/45137
+       * gcc.dg/pr45055.c: New test.
+
 2010-07-30  Alan Modra  <amodra@gmail.com>
 
        * gfortran.dg/ltime_gmtime_1.f90: Tolerate half-hour timezones.
diff --git a/gcc/testsuite/gcc.dg/pr45055.c b/gcc/testsuite/gcc.dg/pr45055.c
new file mode 100644 (file)
index 0000000..ebd8cbf
--- /dev/null
@@ -0,0 +1,41 @@
+/* PR debug/45055 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftracer -fsched-pressure -funroll-loops -fschedule-insns -fcompare-debug" } */
+
+int colormap[10];
+
+extern int bar ();
+
+void
+foo (int *img, int fp, int y, int *ptr, int depth, int c, int t, int xm)
+{
+  int x, color, count;
+  for (; y; y--)
+    {
+      if (depth)
+       {
+         count = bar ();
+         for (x = xm; x; x--)
+           {
+             if (c != 1)
+               count = color = -1;
+             if (count == 0)
+               color = count = bar ();
+             if (color)
+               t = bar (fp);
+             *ptr++ = colormap[t];
+           }
+       }
+      switch (*img)
+       {
+       case 1:
+         bar ();
+       case 3:
+       case -1:
+       case -3:
+         bar ();
+       case -4:
+         bar ();
+       }
+    }
+}