From: Jakub Jelinek Date: Fri, 30 Jul 2010 14:36:56 +0000 (+0200) Subject: re PR debug/45055 (another -fcompare-debug failure with uninitialised read in walk_gi... X-Git-Tag: releases/gcc-4.6.0~5318 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0fc0803eacde9850a7ff4a12d2f4ad29f1bcb2c;p=thirdparty%2Fgcc.git re PR debug/45055 (another -fcompare-debug failure with uninitialised read in walk_gimple_stmt) 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. From-SVN: r162714 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8d5da512fa8..c94bf560a4a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2010-07-30 Jakub Jelinek + + 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 * config/i386/i386.md (int_cond): Remove code iterator. diff --git a/gcc/combine.c b/gcc/combine.c index 9754b0896756..1991f347f7d8 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 32741dc6b809..fe8de9bcdabb 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 f136e40cba3c..136d26a18fc4 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 3df0c2b3e51e..c0123aae5272 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 093dce717b0d..a0c7cc19a4bf 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 546089068bec..f59ca540eeee 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 3c14109f804f..d242a9a3690c 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 608f7245d1cc..dddf836063be 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 66a08b3cc41d..2fded2a5233b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-07-30 Jakub Jelinek + + PR debug/45055 + PR rtl-optimization/45137 + * gcc.dg/pr45055.c: New test. + 2010-07-30 Alan Modra * 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 000000000000..ebd8cbf21a50 --- /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 (); + } + } +}