Commit f0fc0803 by Jakub Jelinek Committed by Jakub Jelinek

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
parent f53ea4f0
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> 2010-07-29 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (int_cond): Remove code iterator. * config/i386/i386.md (int_cond): Remove code iterator.
......
...@@ -12655,29 +12655,6 @@ reg_bitfield_target_p (rtx x, rtx body) ...@@ -12655,29 +12655,6 @@ reg_bitfield_target_p (rtx x, rtx body)
return 0; 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 /* 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 as appropriate. I3 and I2 are the insns resulting from the combination
insns including FROM (I2 may be zero). insns including FROM (I2 may be zero).
......
...@@ -3135,6 +3135,38 @@ prev_nondebug_insn (rtx insn) ...@@ -3135,6 +3135,38 @@ prev_nondebug_insn (rtx insn)
return 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; /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
or 0, if there is none. This routine does not look inside or 0, if there is none. This routine does not look inside
SEQUENCEs. */ SEQUENCEs. */
......
...@@ -2003,13 +2003,9 @@ queue_to_ready (struct ready_list *ready) ...@@ -2003,13 +2003,9 @@ queue_to_ready (struct ready_list *ready)
q_ptr = NEXT_Q (q_ptr); q_ptr = NEXT_Q (q_ptr);
if (dbg_cnt (sched_insn) == false) if (dbg_cnt (sched_insn) == false)
{
/* If debug counter is activated do not requeue insn next after /* If debug counter is activated do not requeue insn next after
last_scheduled_insn. */ last_scheduled_insn. */
skip_insn = next_nonnote_insn (last_scheduled_insn); skip_insn = next_nonnote_nondebug_insn (last_scheduled_insn);
while (skip_insn && DEBUG_INSN_P (skip_insn))
skip_insn = next_nonnote_insn (skip_insn);
}
else else
skip_insn = NULL_RTX; skip_insn = NULL_RTX;
......
...@@ -2368,9 +2368,7 @@ noce_process_if_block (struct noce_if_info *if_info) ...@@ -2368,9 +2368,7 @@ noce_process_if_block (struct noce_if_info *if_info)
} }
else else
{ {
insn_b = prev_nonnote_insn (if_info->cond_earliest); insn_b = prev_nonnote_nondebug_insn (if_info->cond_earliest);
while (insn_b && DEBUG_INSN_P (insn_b))
insn_b = prev_nonnote_insn (insn_b);
/* We're going to be moving the evaluation of B down from above /* We're going to be moving the evaluation of B down from above
COND_EARLIEST to JUMP. Make sure the relevant data is still COND_EARLIEST to JUMP. Make sure the relevant data is still
intact. */ intact. */
......
...@@ -1113,7 +1113,7 @@ reload_combine_recognize_pattern (rtx insn) ...@@ -1113,7 +1113,7 @@ reload_combine_recognize_pattern (rtx insn)
&& last_label_ruid < reg_state[regno].use_ruid) && last_label_ruid < reg_state[regno].use_ruid)
{ {
rtx base = XEXP (src, 1); 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 prev_set = prev ? single_set (prev) : NULL_RTX;
rtx index_reg = NULL_RTX; rtx index_reg = NULL_RTX;
rtx reg_sum = NULL_RTX; rtx reg_sum = NULL_RTX;
...@@ -1852,7 +1852,7 @@ reload_cse_move2add (rtx first) ...@@ -1852,7 +1852,7 @@ reload_cse_move2add (rtx first)
&& MODES_OK_FOR_MOVE2ADD (GET_MODE (reg), && MODES_OK_FOR_MOVE2ADD (GET_MODE (reg),
reg_mode[REGNO (src)])) reg_mode[REGNO (src)]))
{ {
rtx next = next_nonnote_insn (insn); rtx next = next_nonnote_nondebug_insn (insn);
rtx set = NULL_RTX; rtx set = NULL_RTX;
if (next) if (next)
set = single_set (next); set = single_set (next);
......
...@@ -1693,6 +1693,8 @@ extern rtx next_nonnote_insn (rtx); ...@@ -1693,6 +1693,8 @@ extern rtx next_nonnote_insn (rtx);
extern rtx next_nonnote_insn_bb (rtx); extern rtx next_nonnote_insn_bb (rtx);
extern rtx prev_nondebug_insn (rtx); extern rtx prev_nondebug_insn (rtx);
extern rtx next_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 prev_real_insn (rtx);
extern rtx next_real_insn (rtx); extern rtx next_real_insn (rtx);
extern rtx prev_active_insn (rtx); extern rtx prev_active_insn (rtx);
......
...@@ -4756,9 +4756,7 @@ canonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest, ...@@ -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 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. */ we don't want to bother dealing with it. */
do prev = prev_nonnote_nondebug_insn (prev);
prev = prev_nonnote_insn (prev);
while (prev && DEBUG_INSN_P (prev));
if (prev == 0 if (prev == 0
|| !NONJUMP_INSN_P (prev) || !NONJUMP_INSN_P (prev)
......
...@@ -1521,9 +1521,7 @@ fixup_sched_groups (rtx insn) ...@@ -1521,9 +1521,7 @@ fixup_sched_groups (rtx insn)
delete_all_dependences (insn); delete_all_dependences (insn);
prev_nonnote = prev_nonnote_insn (insn); prev_nonnote = prev_nonnote_nondebug_insn (insn);
while (DEBUG_INSN_P (prev_nonnote))
prev_nonnote = prev_nonnote_insn (prev_nonnote);
if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote) if (BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (prev_nonnote)
&& ! sched_insns_conditions_mutex_p (insn, prev_nonnote)) && ! sched_insns_conditions_mutex_p (insn, prev_nonnote))
add_dependence (insn, prev_nonnote, REG_DEP_ANTI); add_dependence (insn, prev_nonnote, REG_DEP_ANTI);
...@@ -2699,9 +2697,7 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn) ...@@ -2699,9 +2697,7 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn)
if (JUMP_P (insn)) if (JUMP_P (insn))
{ {
rtx next; rtx next;
next = next_nonnote_insn (insn); next = next_nonnote_nondebug_insn (insn);
while (next && DEBUG_INSN_P (next))
next = next_nonnote_insn (next);
if (next && BARRIER_P (next)) if (next && BARRIER_P (next))
reg_pending_barrier = MOVE_BARRIER; reg_pending_barrier = MOVE_BARRIER;
else else
...@@ -3370,10 +3366,8 @@ deps_start_bb (struct deps_desc *deps, rtx head) ...@@ -3370,10 +3366,8 @@ deps_start_bb (struct deps_desc *deps, rtx head)
hard registers correct. */ hard registers correct. */
if (! reload_completed && !LABEL_P (head)) 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)) if (insn && CALL_P (insn))
deps->in_post_call_group_p = post_call_initial; deps->in_post_call_group_p = post_call_initial;
} }
......
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> 2010-07-30 Alan Modra <amodra@gmail.com>
* gfortran.dg/ltime_gmtime_1.f90: Tolerate half-hour timezones. * gfortran.dg/ltime_gmtime_1.f90: Tolerate half-hour timezones.
......
/* 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 ();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment