summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-30 14:36:56 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-30 14:36:56 +0000
commit5b8537a8f058e623ed70ca805f3a49def5385ff3 (patch)
tree0a83c3adb8609c51590489ead2d7d994656b6183 /gcc
parent242ddf1132b2ef78b5c41d3317099c6b63da1023 (diff)
downloadgcc-5b8537a8f058e623ed70ca805f3a49def5385ff3.tar.gz
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. * gcc.dg/pr45055.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162714 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/combine.c23
-rw-r--r--gcc/emit-rtl.c32
-rw-r--r--gcc/haifa-sched.c10
-rw-r--r--gcc/ifcvt.c4
-rw-r--r--gcc/postreload.c4
-rw-r--r--gcc/rtl.h2
-rw-r--r--gcc/rtlanal.c4
-rw-r--r--gcc/sched-deps.c12
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/pr45055.c41
11 files changed, 108 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f8d5da512fa..c94bf560a4a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/combine.c b/gcc/combine.c
index 9754b089675..1991f347f7d 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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;
-}
-
-
/* 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
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 32741dc6b80..fe8de9bcdab 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -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. */
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index f136e40cba3..136d26a18fc 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -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;
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 3df0c2b3e51..c0123aae527 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -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. */
diff --git a/gcc/postreload.c b/gcc/postreload.c
index 093dce717b0..a0c7cc19a4b 100644
--- a/gcc/postreload.c
+++ b/gcc/postreload.c
@@ -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);
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 546089068be..f59ca540eee 100644
--- 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);
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 3c14109f804..d242a9a3690 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -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)
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 608f7245d1c..dddf836063b 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 66a08b3cc41..2fded2a5233 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..ebd8cbf21a5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr45055.c
@@ -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 ();
+ }
+ }
+}