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
This commit is contained in:
parent
f53ea4f089
commit
f0fc0803ea
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue