diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-30 14:36:56 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-07-30 14:36:56 +0000 |
commit | 5b8537a8f058e623ed70ca805f3a49def5385ff3 (patch) | |
tree | 0a83c3adb8609c51590489ead2d7d994656b6183 /gcc | |
parent | 242ddf1132b2ef78b5c41d3317099c6b63da1023 (diff) | |
download | gcc-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/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/combine.c | 23 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 32 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 10 | ||||
-rw-r--r-- | gcc/ifcvt.c | 4 | ||||
-rw-r--r-- | gcc/postreload.c | 4 | ||||
-rw-r--r-- | gcc/rtl.h | 2 | ||||
-rw-r--r-- | gcc/rtlanal.c | 4 | ||||
-rw-r--r-- | gcc/sched-deps.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr45055.c | 41 |
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 (); + } + } +} |